private static Booster TournamentSelection(Random rnd, BoosterList currentGen, int tournamentSize) { BoosterList selection = new BoosterList(); for (int i = 0; i < tournamentSize; i++) { int index = rnd.Next(0, currentGen.Count()); selection.Add(currentGen[index]); } selection.Sort((a, b) => b.GetGameScore().CompareTo(a.GetGameScore())); return(selection[0]); }
public static BoosterList BreedNewGeneration(BoosterList currentGen, object[] initParams, int eliteIndividuals, float crossoverRate, int[] crossover1Section, int[] crossover2Section, float mutationRate, int numNewIndividuals, int numEliteChildren) { Random rnd = new Random(DateTime.Now.Millisecond); BoosterList newGeneration = new BoosterList(); currentGen.Sort((a, b) => b.GetGameScore().CompareTo(a.GetGameScore())); for (int i = 0; i < eliteIndividuals; i++) { Booster elite = currentGen[i]; Debug.Print("Elite individual " + (i + 1) + " landed with a position of " + elite.GetBoosterPosition().X + ", a y-velocity of " + elite.GetBoosterVelocity().Y + ", a rotation of " + elite.GetBoosterRotation() + ", with " + elite.GetFuel() + " fuel left and " + elite.GetMonopropellant() + " mono left, with a score of " + elite.GetGameScore() + "and weights1 of " + elite.GetWeights1()[0, 0] + ", " + elite.GetWeights1()[0, 1] + ", " + elite.GetWeights1()[0, 2] + ", " + elite.GetWeights1()[0, 3] + ", " + elite.GetWeights1()[0, 4]); newGeneration.AddBooster(elite.GetBoosterTexture(), (Vector2)initParams[0], (Vector2)initParams[1], (float)initParams[2], (float)initParams[3], (float)initParams[4], (float)initParams[5], elite.GetWeights1(), elite.GetWeights2()); newGeneration[i].ChangeTint(Color.Blue); newGeneration[i].ChangeLayerDepth(0f); } for (int i = 0; i < (numEliteChildren / eliteIndividuals); i++) { for (int j = 0; j < eliteIndividuals; j++) { newGeneration.AddRange(CreateChildren(rnd, currentGen, newGeneration[j], RouletteSelection(rnd, currentGen), initParams, crossoverRate, crossover1Section, crossover2Section, mutationRate)); } } for (int i = eliteIndividuals; i < numEliteChildren; i++) { newGeneration[i].ChangeTint(Color.Purple); newGeneration[i].ChangeLayerDepth(0.1f); } while (newGeneration.Count() < (currentGen.Count() - numNewIndividuals)) { newGeneration.AddRange(CreateChildren(rnd, currentGen, RouletteSelection(rnd, currentGen), RouletteSelection(rnd, currentGen), initParams, crossoverRate, crossover1Section, crossover2Section, mutationRate)); } while (newGeneration.Count() < currentGen.Count()) { newGeneration.AddBooster(newGeneration[0].GetBoosterTexture(), (Vector2)initParams[0], (Vector2)initParams[1], (float)initParams[2], (float)initParams[3], (float)initParams[4], (float)initParams[5]); newGeneration[newGeneration.Count() - 1].ChangeTint(Color.Yellow); newGeneration[newGeneration.Count() - 1].ChangeLayerDepth(0.2f); } return(newGeneration); }