Ejemplo n.º 1
0
        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]);
        }
Ejemplo n.º 2
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);
        }