protected IBreeding <Synapse> NewBreeding(System.Random random)
        {
            ISelection <Synapse> selector;

            if (roulteWheelSelection)
            {
                selector = new RouletteWheelSelection <Synapse>(random, 2);
            }
            else
            {
                selector = new EliteSelection <Synapse>(2);
            }

            var crossover = new SinglePointCrossover <Synapse>(random);
            var mutator   = new FixedNeuralNetMutation(
                random,
                geneMutChance,
                mutRange);

            return(new BreedingBase <Synapse>(
                       poplLne - (int)(poplLne * reinsertPart),
                       selector,
                       crossover,
                       mutator));
        }
        public void Start_TplManySlowFitness_Timeout()
        {
            var taskExecutor = new TplTaskExecutor();

            taskExecutor.Timeout = TimeSpan.FromMilliseconds(1000);

            var selection  = new RouletteWheelSelection();
            var crossover  = new OnePointCrossover(1);
            var mutation   = new UniformMutation();
            var chromosome = new ChromosomeStub();
            var target     = new GeneticAlgorithm(new TplPopulation(100, 150, chromosome),
                                                  new FitnessStub()
            {
                SupportsParallel = true, ParallelSleep = 1500
            }, selection, crossover, mutation);

            target.OperatorsStrategy = new TplOperatorsStrategy();
            target.TaskExecutor      = taskExecutor;

            Assert.Catch <TimeoutException>(() =>
            {
                target.Start();
            }, "The fitness evaluation reached the 00:00:01 timeout.");

            Assert.IsFalse(target.IsRunning);
            Assert.AreEqual(GeneticAlgorithmState.Stopped, target.State);
        }
        public void CheckIfAllAreSelected()
        {
            var selection     = new RouletteWheelSelection();
            var generationMng = new GenerationManagerKeepLast();
            var genomes       = new List <GenomeBase>(50);

            for (int i = 0; i < genomes.Count; i++)
            {
                var newGenome = new GenomeBase
                {
                    Fitness = i - 25
                };
                genomes.Add(newGenome);
            }

            generationMng.RegisterNewGeneration(new Generation(genomes.ToArray(), 0));

            var roulette = new RouletteWheelSelection();

            roulette.Prepare(generationMng.GetGenomes().ToArray(), null, null, genomes.Count);
            var selected = roulette.Select(genomes.Count).ToArray();

            Assert.True(selected.Count() == genomes.Count);
            Assert.False(selected.Any(x => x == null));

            foreach (var genome in selected)
            {
                Assert.True(selected.Count(x => x == genome) == 1);
            }
        }
Beispiel #4
0
        public void Start_InvalidFitnessEvaluateResult_Exception()
        {
            var selection  = new RouletteWheelSelection();
            var crossover  = new OnePointCrossover(1);
            var mutation   = new UniformMutation();
            var chromosome = new ChromosomeStub();
            var fitness    = MockRepository.GenerateMock <IFitness>();

            fitness.Expect(f => f.Evaluate(null)).IgnoreArguments().Return(1.1);

            var target = new GeneticAlgorithm(
                new Population(20, 20, chromosome),
                fitness, selection, crossover, mutation);

            ExceptionAssert.IsThrowing(new FitnessException(fitness, "The {0}.Evaluate returns a fitness with value 1.1. The fitness value should be between 0.0 and 1.0.".With(fitness.GetType())), () => {
                target.Start();
            });

            fitness = MockRepository.GenerateMock <IFitness>();
            fitness.Expect(f => f.Evaluate(null)).IgnoreArguments().Return(-0.1);

            target = new GeneticAlgorithm(
                new Population(20, 20, chromosome),
                fitness, selection, crossover, mutation);

            ExceptionAssert.IsThrowing(new FitnessException(fitness, "The {0}.Evaluate returns a fitness with value -0.1. The fitness value should be between 0.0 and 1.0.".With(fitness.GetType())), () =>
            {
                target.Start();
            });
        }
        public ISelection RouletteWheel()
        {
            var target = new RouletteWheelSelection();

            target.SelectChromosomes(_chromosomesNumber, _generation);
            return(target);
        }
        public void SelectChromosomes_Generation_ChromosomesZeroFitness()
        {
            var target = new RouletteWheelSelection();
            var c1     = Substitute.ForPartsOf <ChromosomeBase>(2);

            c1.Fitness = 0;

            var c2 = Substitute.ForPartsOf <ChromosomeBase>(2);

            c2.Fitness = 0;

            var c3 = Substitute.ForPartsOf <ChromosomeBase>(2);

            c3.Fitness = 0;

            var c4 = Substitute.ForPartsOf <ChromosomeBase>(2);

            c4.Fitness = 0;

            var generation = new Generation(1, new List <IChromosome>()
            {
                c1, c2, c3, c4
            });

            var actual = target.SelectChromosomes(2, generation);

            Assert.AreEqual(0, actual.Count);
        }
Beispiel #7
0
 public void OnCollisionEnter2D(Collision2D collision)
 {
     NotifyObservers("UpdateScore");
     Instantiate(RouletteWheelSelection.GetRandomByWeight(posiblesPowerUPS, weights), this.transform.position, this.transform.rotation);
     Instantiate(explosion, this.transform.position, this.transform.rotation);
     _enemyPool.ReturnEnemyToPool(this);
 }
        public void Start_ParallelManySlowFitness_Timeout()
        {
            var taskExecutor = new SmartThreadPoolTaskExecutor();

            taskExecutor.MinThreads = 100;
            taskExecutor.MaxThreads = 100;
            taskExecutor.Timeout    = TimeSpan.FromMilliseconds(1000);

            var selection  = new RouletteWheelSelection();
            var crossover  = new OnePointCrossover(1);
            var mutation   = new UniformMutation();
            var chromosome = new ChromosomeStub();
            var target     = new GeneticAlgorithm(new Population(100, 150, chromosome),
                                                  new FitnessStub()
            {
                SupportsParallel = true, ParallelSleep = 1500
            }, selection, crossover, mutation);

            target.TaskExecutor = taskExecutor;

            ExceptionAssert.IsThrowing(new TimeoutException("The fitness evaluation rech the 00:00:01 timeout."), () =>
            {
                target.Start();
            });

            Assert.IsFalse(target.IsRunning);
            Assert.AreEqual(GeneticAlgorithmState.Stopped, target.State);
        }
        private BreedingBase <int> NewBreeding(
            int poplLen,
            double partToReinsert,
            double geneMutChance,
            int mutRange)
        {
            BreedingBase <int> result;
            ISelection <int>   selector;
            ICrossover <int>   crossover;
            IMutation <int>    mutator;

            //selector = new EliteSelection<int>(2, partToBeElites: 0.5d);
            selector = new RouletteWheelSelection <int>(RandomInst, 2);

            crossover = new SinglePointCrossover <int>(RandomInst, 1);

            mutator = new ES_Mutation(RandomInst, geneMutChance, mutRange);

            result = new BreedingBase <int>(
                poplLen - (int)(partToReinsert * poplLen),
                selector,
                crossover,
                mutator
                );
            return(result);
        }
        public void ItHasAValidConstructor()
        {
            var parentSelection = new RouletteWheelSelection();

            parentSelection.Setup(_pool, GATestHelper.GetTravelingSalesmanDefaultConfiguration());
            parentSelection.GetParents();
        }
Beispiel #11
0
        public void ItConstructsProperlyIfAllFitnessScoresAreAboveOrEqualToZero()
        {
            var genome          = GATestHelper.GetTravelingSalesmanPopulation();
            var parentSelection = new RouletteWheelSelection();

            parentSelection.Setup(genome, GATestHelper.GetTravelingSalesmanDefaultConfiguration());
        }
        public static GeneticSharp.Domain.GeneticAlgorithm MakeDefault(Func <double[], double> func, Tuple <double, double>[] minmax)
        {
            var population = new Population(20, 40, chromosome.CreateFloatChromosone(minmax));

            var fitness = new FuncFitness((c) =>
            {
                var fc = c as FloatingPointChromosome;

                var values = fc.ToFloatingPoints();
                return(func(values));
            });

            var selection = new RouletteWheelSelection();
            var crossover = new UniformCrossover(0.5f);
            var mutation  = new FlipBitMutation();

            var ga = new GeneticSharp.Domain.GeneticAlgorithm(
                population,
                fitness,
                selection,
                crossover,
                mutation);

            var termination = new GenerationNumberTermination(1000);

            ga.Termination = termination;


            Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");

            return(ga);
        }
    private void Start()
    {
        var fitness    = new TspFitness(m_numberOfCities);
        var chromosome = new TspChromosome(m_numberOfCities);

        // This operators are classic genetic algorithm operators that lead to a good solution on TSP,
        // but you can try others combinations and see what result you get.
        var crossover  = new OrderedCrossover();
        var mutation   = new ReverseSequenceMutation();
        var selection  = new RouletteWheelSelection();
        var population = new Population(50, 100, chromosome);

        m_ga             = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
        m_ga.Termination = new TimeEvolvingTermination(System.TimeSpan.FromHours(1));

        // The fitness evaluation of whole population will be running on parallel.
        m_ga.TaskExecutor = new ParallelTaskExecutor
        {
            MinThreads = 100,
            MaxThreads = 200
        };

        // Everty time a generation ends, we log the best solution.
        m_ga.GenerationRan += delegate
        {
            var distance = ((TspChromosome)m_ga.BestChromosome).Distance;
            Debug.Log($"Generation: {m_ga.GenerationsNumber} - Distance: ${distance}");
        };

        DrawCities();

        // Starts the genetic algorithm in a separate thread.
        m_gaThread = new Thread(() => m_ga.Start());
        m_gaThread.Start();
    }
Beispiel #14
0
    private Species GetKey(Vector3 worldPos)
    {
        var sqr   = radius * radius;
        var nears = lifes
                    .Where(v => (v.transform.position - worldPos).sqrMagnitude < sqr);
        var count = nears.Count();

        int modelIndex = -1;
        int colorIndex = -1;

        if (count > 0 && !Interfered())
        {
            var modelTabs = new Tabulator <int, float>();
            foreach (var n in nears.Select(v => v.CurrentKey))
            {
                modelTabs[n.model]++;
            }

            var max = modelTabs.Values.Max();
            int valueIndex;
            if (RouletteWheelSelection.Sample(out valueIndex, 100, max, modelTabs.ValuesAsList))
            {
                modelIndex = modelTabs.KeysAsList[valueIndex];
            }

            var colors     = nears.Where(v => v.CurrentKey.model == modelIndex);
            var colorCount = colors.Count();
            if (colorCount > 0 && !Interfered())
            {
                var colorTabs = new Tabulator <int, float>();
                foreach (var n in colors.Select(v => v.CurrentKey))
                {
                    colorTabs[n.color]++;
                }

                var maxColor = colorTabs.Values.Max();
                int colorTabIndex;
                if (RouletteWheelSelection.Sample(out colorTabIndex, 100, maxColor, colorTabs.ValuesAsList))
                {
                    colorIndex = colorTabs.KeysAsList[colorTabIndex];
                }
            }
        }

        if (modelIndex < 0)
        {
            modelIndex = Random.Range(0, LifeStrage.Instance.models.Length);
        }
        var model = LifeStrage.Instance.GetModel(modelIndex);

        if (colorIndex < 0)
        {
            colorIndex = Random.Range(0, model.colors.Length);
        }

        var spec = new Species(modelIndex, colorIndex);

        Debug.LogFormat("Chosen key={0} neighbors={1}", spec, count);
        return(spec);
    }
        public void SelectChromosomes_NullGeneration_Exception()
        {
            var target = new RouletteWheelSelection();

            ExceptionAssert.IsThrowing(new ArgumentNullException("generation"), () => {
                target.SelectChromosomes(2, null);
            });
        }
Beispiel #16
0
        public void ItFailsIfANegativeFitnessScoreIsPassed()
        {
            var genome = GATestHelper.GetTravelingSalesmanPopulation();

            genome[0].FitnessScore = -1;
            var parentSelection = new RouletteWheelSelection();

            parentSelection.Setup(genome, GATestHelper.GetTravelingSalesmanDefaultConfiguration());
        }
        public void ItCanGetAValidParent()
        {
            var parentSelection = new RouletteWheelSelection();

            parentSelection.Setup(_pool, GATestHelper.GetTravelingSalesmanDefaultConfiguration());

            var parent = parentSelection.GetParent(0.22);

            Assert.IsNotNull(parent);
        }
Beispiel #18
0
        public void SelectChromosomes_NullGeneration_Exception()
        {
            var target = new RouletteWheelSelection();

            var actual = Assert.Catch <ArgumentNullException>(() =>
            {
                target.SelectChromosomes(2, null);
            });

            Assert.AreEqual("generation", actual.ParamName);
        }
        public void ItCantReturnTheSameParentTwice()
        {
            var parentSelection = new RouletteWheelSelection();

            parentSelection.Setup(_pool, GATestHelper.GetTravelingSalesmanDefaultConfiguration());

            for (int i = 0; i < 1000; i++)
            {
                var parent = parentSelection.GetParents();
                Assert.IsFalse(ReferenceEquals(parent.Father, parent.Mother));
            }
        }
        public void ItCanReturnParents()
        {
            var parentSelection = new RouletteWheelSelection();

            parentSelection.Setup(_pool, GATestHelper.GetTravelingSalesmanDefaultConfiguration());

            var parent = parentSelection.GetParents();

            Assert.IsNotNull(parent);
            Assert.IsNotNull(parent.Father);
            Assert.IsNotNull(parent.Mother);
        }
Beispiel #21
0
        static void Main(string[] args)
        {
            ICrossOperator        crossOperator     = new OnePointCross();
            IMutationOperator     mutationOperator  = new Mutatation();
            ISelectionOperator    selectionOperator = new RouletteWheelSelection();
            Func <double, double> function          = FitnessFunction;
            GeneticAlgorithm      algorithm         = new GeneticAlgorithm(20, 5, crossOperator, mutationOperator, selectionOperator, function);

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(algorithm.RunSimulation(100).Fitness);
            }

            Console.ReadLine();
        }
Beispiel #22
0
    public void Initialize(int numberOfCities, int areaWidth, int areaHeight)
    {
        Stop();
        Fitness = new TspFitness(numberOfCities, areaWidth, areaHeight);
        var chromosome = new TspChromosome(numberOfCities);

        // This operators are classic genetic algorithm operators that lead to a good solution on TSP,
        // but you can try others combinations and see what result you get.
        var crossover  = new OrderedCrossover();
        var mutation   = new ReverseSequenceMutation();
        var selection  = new RouletteWheelSelection();
        var population = new Population(50, 100, chromosome);

        _ga = new GeneticAlgorithm(population, Fitness, selection, crossover, mutation);
    }
        public void Start_FitnessEvaluationFailed_FitnessException()
        {
            var selection  = new RouletteWheelSelection();
            var crossover  = new OnePointCrossover(1);
            var mutation   = new UniformMutation();
            var chromosome = new ChromosomeStub();
            var fitness    = new FuncFitness((c) => throw new Exception("TEST"));

            var target = new GeneticAlgorithm(new Population(100, 150, chromosome), fitness, selection, crossover, mutation);

            Assert.Catch <FitnessException>(target.Start);

            Assert.IsFalse(target.IsRunning);
            Assert.AreEqual(GeneticAlgorithmState.Stopped, target.State);
        }
        public void SelectChromosomes_InvalidNumber_Exception()
        {
            var target = new RouletteWheelSelection();

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("number", "The number of selected chromosomes should be at least 2."), () => {
                target.SelectChromosomes(-1, null);
            });

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("number", "The number of selected chromosomes should be at least 2."), () => {
                target.SelectChromosomes(0, null);
            });

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("number", "The number of selected chromosomes should be at least 2."), () => {
                target.SelectChromosomes(1, null);
            });
        }
Beispiel #25
0
        public static void NextGen()
        {
            Genome c1 = new Genome(false);
            Genome c2 = new Genome(false);
            RouletteWheelSelection select = new RouletteWheelSelection();
            CrossOver cross = new CrossOver();

            cross.SinglePointCrossOver(select.RouletteWheelSelect(), select.RouletteWheelSelect(), ref c1, ref c2);
            Mutate(ref c1);
            Mutate(ref c2);
            genome.Add(c1);
            genome.Add(c2);
            if (genome.Count == DNAattributes.PopulationSize)
            {
                DNAattributes.pop = genome;
            }
        }
Beispiel #26
0
    private void GenerateLevelGS()
    {
        Level = new LevelElement[LevelSize];
        for (var i = 0; i < nChunks; i++)
        {
            var dcParams   = DifficultyCurveParams;
            var difficulty = DifficultyCurve(i, dcParams.a, dcParams.b, dcParams.k);

            var eParams   = EvolutionParams;
            var chunkSize = LevelSize / nChunks;

            var fitness    = new LevelChunkFitness(difficulty);
            var chromosome = new LevelChunkChromosome(chunkSize);

            var crossover  = new OnePointCrossover(chunkSize / 2);
            var mutation   = new UniformMutation(allGenesMutable: true);
            var selection  = new RouletteWheelSelection();
            var population = new Population(50, 100, chromosome);

            var m_ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new TimeEvolvingTermination(new TimeSpan(0, 0, 1))
            };

            m_ga.TaskExecutor = new ParallelTaskExecutor
            {
                MinThreads = 2,
                MaxThreads = 5
            };
            m_ga.Start();
            // Everty time a generation ends, we log the best solution.

            /*m_ga.GenerationRan += delegate
             * {
             *  var f = m_ga.BestChromosome.Fitness;
             *  Debug.Log($"Generation: {m_ga.GenerationsNumber} - Fitness: ${f}");
             * };*/
            var genes = m_ga.BestChromosome.GetGenes();
            for (int j = 0; j < chunkSize; j++)
            {
                Level[i * chunkSize + j] = (LevelElement)genes[j].Value;
            }
            Debug.Log($"Fitness: {m_ga.BestChromosome.Fitness}");
        }
    }
Beispiel #27
0
        public void SelectChromosomes_InvalidNumber_Exception()
        {
            var target = new RouletteWheelSelection();

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.SelectChromosomes(-1, null);
            }, "The number of selected chromosomes should be at least 2.");

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.SelectChromosomes(0, null);
            }, "The number of selected chromosomes should be at least 2.");

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.SelectChromosomes(1, null);
            }, "The number of selected chromosomes should be at least 2.");
        }
        public void SelectChromosomes_NullFitness_Exception()
        {
            var target     = new RouletteWheelSelection();
            var generation = new Generation(1, new List <IChromosome>
            {
                new TspChromosome(10),
                new TspChromosome(10),
                new TspChromosome(10),
                new TspChromosome(10),
                new TspChromosome(10)
            });

            var actual = Assert.Catch <SelectionException>(() =>
            {
                target.SelectChromosomes(2, generation);
            });

            Assert.AreEqual("RouletteWheelSelection: There are chromosomes with null fitness.", actual.Message);
        }
Beispiel #29
0
        public IChromosome Solve(List <Span> spans)
        {
            var selection  = new RouletteWheelSelection();
            var crossover  = new TwoPointCrossover();
            var mutation   = new UniformMutation();
            var fitness    = new Fitness();
            var chromosome = new Chromosome(spans);
            var population = new Population(100, 100, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

            ga.Termination = new GenerationNumberTermination(100);

            ga.CrossoverProbability = 0.8F;
            ga.MutationProbability  = 0.1F;

            ga.Start();

            return(ga.BestChromosome);
        }
        protected override GeneticAlgorithm CreateGA()
        {
            var size = (int)Camera.main.orthographicSize - 1;

            m_fitness = new TspFitness(m_numberOfCities, -size, size, -size, size);
            var chromosome = new TspChromosome(m_numberOfCities);
            var crossover  = new OrderedCrossover();
            var mutation   = new ReverseSequenceMutation();
            var selection  = new RouletteWheelSelection();
            var population = new Population(50, 100, chromosome);
            var ga         = new GeneticAlgorithm(population, m_fitness, selection, crossover, mutation);

            ga.Termination  = new TimeEvolvingTermination(System.TimeSpan.FromDays(1));
            ga.TaskExecutor = new ParallelTaskExecutor
            {
                MinThreads = 100,
                MaxThreads = 200
            };

            return(ga);
        }