Próbowałem wyśledzić co się dzieje i dzieje się coś osobliwego.
Otóż tak. Jest to algorytm genetyczny.
Mam na liście 14 elementów (osobników).
Z tej listy wybieram najlepszego i chcę, żeby on na tej liście został. W pewnym momencie dochodzi do "kopulacji" między osobnikami. Potem potomków wymieniam na rodziców (chyba, że rodzicem był najlepszy osobnik, wtedy go zostawiam). Wygląda to tak:
public void ExchangeChildrenForParents(Creature parent1, Creature parent2, Creature child1, Creature child2, Creature bestCreature)
{
bool parent1IsBest = (bestCreature != null) && (Object.ReferenceEquals(parent1, bestCreature));
bool parent2IsBest = (bestCreature != null) && (Object.ReferenceEquals(parent2, bestCreature));
if(!parent1IsBest)
m_population.Remove(parent1);
if(!parent2IsBest)
m_population.Remove(parent2);
m_population.Add(child1);
m_population.Add(child2);
}
Nie ma żadnej magii. Sprawdzam, czy mam ustawionego najlepszego osobnika, a jeśli tak, sprawdzam, czy to może jest parent1 lub parent2.
Następnie, jeśli parent1 NIE JEST najlepszym osobnikiem, to go usuwam. Potem analogicznie robię z parentem2. Na koniec do listy (populacji) dodaję dzieci.
I z jakiegoś powodu w momencie usuwania czasami usuwa mi najlepszego osobnika. Sprawdziłem i parent1IsBest i parent2IsBest zawsze przyjmują dobre wartości. Więc o co chodzi? Czemu z listy usuwa mi element, którego nie powinno w ogóle ruszać?
Podczas debugowania posługuję się funkcją "Make object ID".
Zauważyłem jeszcze jedną rzecz. Ale to chyba akurat normalne. Po usunięciu takim, gdzie zostaje mi najlepszy osobnik, w zmiennych lokalnych w debugerze cała lista jest widoczna na czerwono, oprócz tego właśnie osobnika. Na czerwono, czyli że została zmodyfikowana. W momencie, gdy usuwa mi się najlepszy osobnik, cała lista - wszystkie elementy bez wyjątku - są pokazane na czerwono.
Oczywiście referencje w innych miejscach do tego najlepszego obiektu zostają. Więc pewnym rozwiązaniem, ale oszukanym, jest sprawdzenie na koniec, czy najlepszy osobnik znajduje się na liście. A jeśli nie, to go trzeba dodać. No, ale chcę wiedzieć, gdzie tak naprawdę leży problem.