public void Merge(SortList <AIPlayer> individuals, List <AIPlayer> offspring, Simulation simulation) { //If having only a single parent, replace it if better foreach (AIPlayer o in offspring) { if (o.Parent2 == null) { for (int i = 0; i < individuals.Count; i++) { if (individuals.Get(i) == o.Parent1) { if (o.GetFitness() > individuals.Get(i).GetFitness()) { individuals.Remove(individuals.Get(i)); individuals.Add(o); } } } } else { //The offspring were made from 2 parents //If offspring is better than both parents, replace both parents and add a random AIPlayer bool betterThanParent1 = false; bool betterThanParent2 = false; for (int i = 0; i < individuals.Count; i++) { if (individuals.Get(i) == o.Parent1 && individuals.Get(i).GetFitness() < o.Parent1.GetFitness()) { betterThanParent1 = true; } if (individuals.Get(i) == o.Parent2 && individuals.Get(i).GetFitness() < o.Parent2.GetFitness()) { betterThanParent2 = true; } } //if better than both parents, remove both parents and add a random immigrant if (betterThanParent1 && betterThanParent2) { individuals.Remove(o.Parent1); individuals.Remove(o.Parent2); individuals.Add(o); AIPlayer randomImmagrant = new AIPlayer(simulation.NeuralNetworkMaker); randomImmagrant.CalcFitness(simulation.Game); individuals.Add(randomImmagrant); } } } individuals.Crop(individuals.Count / 2); while (individuals.Count < simulation.PopulationSize) { AIPlayer randomImmagrant = new AIPlayer(simulation.NeuralNetworkMaker); randomImmagrant.CalcFitness(simulation.Game); individuals.Add(randomImmagrant); } }
public void Merge(SortList <AIPlayer> individuals, List <AIPlayer> offspring, Simulation simulation) { //If having only single parent, replace it with a probability foreach (AIPlayer o in offspring) { if (o.Parent2 == null) { if (o.GetFitness() > o.Parent1.GetFitness() && individuals.Contains(o.Parent1)) { individuals.Remove(o.Parent1); } individuals.Add(o); } else { //The offspring were made from 2 parents AIPlayer firstPriority = null; AIPlayer secondPriority = null; if (Utility.RandomNum.RandomInt(0, 2) == 0) { firstPriority = o.Parent1; secondPriority = o.Parent2; } else { firstPriority = o.Parent2; secondPriority = o.Parent1; } if (o.GetFitness() > firstPriority.GetFitness() && individuals.Contains(firstPriority)) { individuals.Remove(firstPriority); individuals.Add(o); } else if (o.GetFitness() > secondPriority.GetFitness() && individuals.Contains(secondPriority)) { individuals.Remove(secondPriority); individuals.Add(o); } } } }
public void RemoveProfession(Type type) { Profession pro = null; foreach (Profession profession in Professions.Get()) if (profession.GetType() == type) pro = profession; if (pro == null) return; pro.RemoveEffect(); Professions.Remove(pro.Importance); if (MainProfession == pro) { if (Professions.Length == 0) MainProfession = null; Profession[] un = Professions.Get(); List<Profession> list = un.ToList(); list.Reverse(); MainProfession = list[0]; } }