コード例 #1
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Painter());

            //setupNext();
            var chromosome = new FloatingPointChromosome(
                //lvl, hp, food, ruletype, rule, seed, tempo, pitch, r1, r2, r3
                new double[] { 0, 0, 0, 7, 30, 32, 23, 23, 0, 0, 0 },                          //min values
                new double[] { 50, 500, 5, 1800, 999999999, 9999999, 288, 72, 999, 999, 999 }, //max values
                new int[] { 6, 9, 3, 11, 34, 27, 9, 7, 10, 10, 10 },                           //bits required for values
                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } //bits for fractals
                );
            var population  = new Population(5, 25, chromosome); //min-max population
            var fitness     = new myFitness();
            var selection   = new EliteSelection();
            var crossover   = new TwoPointCrossover();
            var mutation    = new FlipBitMutation();
            var termination = new GenerationNumberTermination(10);

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

            ga.Termination = termination;

            ga.Start();
        }
コード例 #2
0
        private GeneticAlgorithm RunGeneticAlgorithm(Population population, IFitness fitness, int generations)
        {
            var selection = new EliteSelection();
            var crossover = new TwoPointCrossover();
            var mutation  = new ReverseSequenceMutation();

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination  = new GenerationNumberTermination(generations),
                TaskExecutor = new ParallelTaskExecutor()
                {
                    MinThreads = 100, MaxThreads = 250
                },
            };

            var latestFitness = 0.0;

            ga.GenerationRan += (sender, e) =>
            {
                var bestfitness = ga.BestChromosome.Fitness ?? 0;
                if (bestfitness != latestFitness)
                {
                    latestFitness = bestfitness;

                    testOutputHelper.WriteLine($"Current best fitness: {bestfitness}");
                }
            };

            ga.Start();
            return(ga);
        }
コード例 #3
0
ファイル: UnitTest2.cs プロジェクト: mgosal/GeneticSharp
        public void Play2048PatternTest2()
        {
            var selection            = new EliteSelection();
            var crossover            = new TwoPointCrossover();
            var mutation             = new PartialShuffleMutation();
            var fitness              = new ClosestToMillion();
            var bestChromosomeTodate = new Play2048Chromosome(20, new List <string>()
            {
                "up", "down", "left", "right"
            });
            //bestChromosomeTodate.Pattern = "";
            var population = new Population(4, 5, bestChromosomeTodate);

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

            ga.Termination = new GenerationNumberTermination(1);

            Console.WriteLine("GA running...");
            ga.GenerationRan += Ga_GenerationRan;
            ga.Population.BestChromosomeChanged += Population_BestChromosomeChanged;
            ga.Init();

            //queue up all the patterns...


            Console.WriteLine((bestChromosome as Play2048Chromosome).Pattern);
            Console.WriteLine("Best solution found has {0} fitness was born in generation {1}", ga.BestChromosome.Fitness, bestGen);
        }
コード例 #4
0
        public void Cross_LessGenesThenSecondSwapPoint_Exception()
        {
            var target      = new TwoPointCrossover(1, 3);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(3);

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("parents", "The swap point two index is 3, but there is only 3 genes. The swap should result at least one gene to each sides."), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            });

            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(4);

            ExceptionAssert.IsThrowing(new ArgumentOutOfRangeException("parents", "The swap point two index is 3, but there is only 4 genes. The swap should result at least one gene to each sides."), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome2,
                    chromosome2
                });
            });
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: Donovancm/GA_DS
        public static void RunExampleOnce()
        {
            List <Person>       population        = new List <Person>();
            List <double>       coefficient       = new List <double>();
            List <CoupleParent> coupleParents     = new List <CoupleParent>();
            List <string>       crossoverChildren = new List <string>();

            FileReader.CoefficientRead(coefficient);
            FileReader.ReadFile(population, 5);
            Fitness.CalculateSSE(population);
            Fitness.CalculateCoefSSE(coefficient, population);

            //Stap 1 t/m 5
            RouletteWheel.DoCalculation(population);

            //Crossover Methods
            //SinglePointCrossover.DoCrossover(coupleParents, crossoverChildren);
            TwoPointCrossover.DoCrossover(coupleParents, crossoverChildren, crossOverPercentage, population);

            //Mutation
            Mutation.MutationChildren(crossoverChildren);

            //Recalculate Fitness for Childrens
            List <Person> childrenPopulation = Fitness.CalculateCoefSSEChild(coefficient, crossoverChildren);

            //Elitism best solution
            var bestPerson = Elitism.ChildHighestFit(childrenPopulation, crossOverPercentage);

            Console.ReadKey();
        }
コード例 #6
0
        public IChromosome Compute(TrainingModel <ContextInfo> model, IChromosome baseChromosome)
        {
            model.InitializePartitions(_folds);

            var sw = new Stopwatch();

            sw.Start();

            var selection  = new EliteSelection();
            var crossover  = new TwoPointCrossover(); // Or OnePoint
            var mutation   = new UniformMutation(true);
            var fitness    = new Fitness(model);
            var chromosome = baseChromosome == null ? new Chromosome() : baseChromosome;
            var population = new Population(2, 5, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new OrTermination(
                    new GenerationNumberTermination(5),
                    new FitnessStagnationTermination(),
                    new FitnessThresholdTermination(baseChromosome.Fitness.HasValue ? baseChromosome.Fitness.Value : 0.0))
            };

            Console.WriteLine("GA running...");
            ga.Start();

            sw.Stop();
            Console.WriteLine("Best solution found has {0} fitness. Time elapsed {1}", ga.BestChromosome.Fitness, sw.Elapsed);
            foreach (var gene in ga.BestChromosome.GetGenes())
            {
                Console.WriteLine(gene);
            }

            return(ga.BestChromosome);
        }
コード例 #7
0
        public void Cross_LessGenesThenSecondSwapPoint_Exception()
        {
            var target      = new TwoPointCrossover(1, 3);
            var chromosome1 = Substitute.For <ChromosomeBase>(3);

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            }, "The swap point two index is 3, but there is only 3 genes. The swap should result at least one gene to each sides.");

            var chromosome2 = Substitute.For <ChromosomeBase>(4);

            Assert.Catch <ArgumentOutOfRangeException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome2,
                    chromosome2
                });
            }, "The swap point two index is 3, but there is only 4 genes. The swap should result at least one gene to each sides.");
        }
コード例 #8
0
        public void Play2048PatternTest()
        {
            var selection  = new EliteSelection();
            var crossover  = new TwoPointCrossover();
            var mutation   = new PartialShuffleMutation();
            var fitness    = new ClosestToMillion();
            var chromosome = new Play2048Chromosome(20, new List <string>()
            {
                "up", "down", "left", "right"
            });
            var population = new Population(22, 42, chromosome);

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

            ga.Termination = new GenerationNumberTermination(10);

            Console.WriteLine("GA running...");
            ga.GenerationRan += Ga_GenerationRan;
            ga.Population.BestChromosomeChanged += Population_BestChromosomeChanged;

            Task.Run(async() => { await Start(ga); }).Wait();


            GA.GetSingleton().NextPattern = string.Empty;

            Console.WriteLine((bestChromosome as Play2048Chromosome).Pattern);
            Console.WriteLine("Best solution found has {0} fitness was born in generation {1}", ga.BestChromosome.Fitness, bestGen);
        }
コード例 #9
0
        static void Main(string[] args)
        {
            var get = new DataReader();
            //fitness
            Fitness fitness = new Fitness(get.DataPregnant(), get.Data());// insert the data from DataReader for the population creation.
            //selection
            var        highestFitness = 1;
            var        lowestFitness  = 2;
            ISelection roulette       = new RouletteWheel();
            ISelection ranking        = new Ranking(highestFitness);

            //crossover
            var        crossoverProbability = 0.6;
            ICrossover onePointCrosseover   = new OnePointCrossover();
            ICrossover twoPointCrosseover   = new TwoPointCrossover();
            //mutation
            var Mutation     = (chanceMutation : 0.01, min : -1, max : 1);
            var RandomLimits = (min : -1, max : 1);
            //population
            var populationSize = 60;
            // create a new population
            var population = fitness.GenerateNewPopulation(populationSize, RandomLimits);

            var ga = new GeneticAlgorithm(population, fitness, 100, onePointCrosseover, crossoverProbability, Mutation, roulette);

            System.Collections.Generic.List <double> predict = get.Data()[400];

            Console.WriteLine("prediction for value " + 400 + " : " + new Prediction().Predict(ga.BestSeed.DNA, predict));
            Console.ReadLine();
        }
コード例 #10
0
        public void Run()
        {
            var selection  = new EliteSelection();
            var crossover  = new TwoPointCrossover();
            var mutation   = new MyMutation();
            var fitness    = new MyProblemFitness(pointList.ToArray());
            var chromosome = new MyProblemChromosome(pointList.Count);
            var population = new Population(100, 100, chromosome);

            ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination          = new FitnessStagnationTermination(100),
                MutationProbability  = 0.5f, //KS:变异概率50%
                CrossoverProbability = 0.5f, //KS:交配概率50%
            };

            int index = 0; //KS:计算代数

            ga.GenerationRan += delegate
            {
                var bestChromosome = ga.Population.BestChromosome;

                Console.Write("Index: " + index);
                Console.Write(", Fitness: {0}", bestChromosome.Fitness);

                Console.Write(", Genes: {0}", string.Join("-", bestChromosome.GetGenes()));

                Console.WriteLine();

                index++;
            };



            Console.WriteLine("GA running...");
            Stopwatch SW = new Stopwatch();

            SW.Start();

            ga.Start();//调用GA线程


            SW.Stop();
            //Console.Write(", Time: {0}", SW.ElapsedMilliseconds);
            //Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);
            fitness.Evaluate(ga.BestChromosome); //KS: 评价基因的优劣


            startPoint = new Point(0, (double)fitness.lr.Alpha);
            endPoint   = new Point(screenWidth, (double)(fitness.lr.Alpha + screenWidth * fitness.lr.Beta));
        }
コード例 #11
0
        public void Cross_ChromosomeLengthLowerThan3_Exception()
        {
            var target      = new TwoPointCrossover(0, 1);
            var chromosome1 = Substitute.For <ChromosomeBase>(2);

            Assert.Catch <CrossoverException>(() =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            }, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome1.GetType().Name));
        }
コード例 #12
0
ファイル: Program.cs プロジェクト: Donovancm/GA_DS
        public static void RunCrossOver(List <CoupleParent> coupleParents, List <string> crossoverChildren, List <Person> population)
        {
            Random random            = new Random();
            int    setCrossoverPoint = random.Next(0, 1);

            if (setCrossoverPoint == 0)
            {
                SinglePointCrossover.DoCrossover(coupleParents, crossoverChildren, crossOverPercentage, population);
            }
            else
            {
                TwoPointCrossover.DoCrossover(coupleParents, crossoverChildren, crossOverPercentage, population);
            }
        }
コード例 #13
0
        public void ItCanPerformACrossover()
        {
            var config = GATestHelper.GetTravelingSalesmanDefaultConfiguration();
            var father = GATestHelper.GetAlphabetCharacterChromosome();
            var mother = GATestHelper.GetAlphabetCharacterChromosome();

            mother.Genes.Shuffle(config.Random);

            var twoPoint = new TwoPointCrossover();

            var child = twoPoint.Execute(father, mother, config);

            Assert.AreNotEqual(father.ToString(), child.ToString());
            Assert.AreNotEqual(mother.ToString(), child.ToString());
        }
コード例 #14
0
        public void Cross_ChromosomeLengthLowerThan3_Exception()
        {
            var target      = new TwoPointCrossover(0, 1);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(2);


            ExceptionAssert.IsThrowing(new CrossoverException(target, "A chromosome should have, at least, 3 genes. {0} has only 2 gene.".With(chromosome1.GetType().Name)), () =>
            {
                target.Cross(new List <IChromosome>()
                {
                    chromosome1,
                    chromosome1
                });
            });
        }
コード例 #15
0
        public void TwoPointCrossLinkTest1()
        {
            Organism parent1 = new Organism();
            Organism parent2 = new Organism();

            parent1.Chromosomes.Add(new Chromosome(1, "111"));
            parent2.Chromosomes.Add(new Chromosome(1, "000"));

            IRandom           rand        = new Deterministic(1, 0, 2);
            TwoPointCrossover crossLinker = new TwoPointCrossover(rand, 1);
            var answer = crossLinker.CrossLink(parent1, parent2);

            Assert.AreEqual("001", answer.Item1.Chromosomes[0].ToString());
            Assert.AreEqual("110", answer.Item2.Chromosomes[0].ToString());
        }
コード例 #16
0
        static void Main(string[] args)
        {
            //

            GraphModel graphModel = new GraphModel("data/data_35ver.csv");


            int vezirSayisi = graphModel.vertexes.Count;

            var selection  = new EliteSelection();
            var crossover  = new TwoPointCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness(graphModel);
            var chromosome = new MyProblemChromosome(vezirSayisi);
            var population = new Population(5000, 5500, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                //Termination = new FitnessThresholdTermination(vezirSayisi * (vezirSayisi - 1) / 2)
                Termination = new FitnessThresholdTermination(100)
            };

            int index = 0;

            ga.GenerationRan += delegate {
                var bestChromosome = ga.Population.BestChromosome;

                Console.Write("Index: " + index);
                Console.Write(", Fitness: {0}", bestChromosome.Fitness);

                Console.Write(", Genes: {0}", string.Join("-", bestChromosome.GetGenes()));

                bestChromosome.GetGenes();
                Console.Write($", Ilość kolorow: {MyProblemFitness.GetCountOfColors(bestChromosome.GetGenes())}");

                Console.WriteLine();

                index++;
            };

            Console.WriteLine("GA running...");

            ga.Start();

            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);

            Console.Read();
        }
コード例 #17
0
            public void TestTwoPointCrossOver_ItemsIndex1And2SwappedInChildren()
            {
                var r    = new InsertNextItemRandomizer(1, 3);
                var tpco = new TwoPointCrossover(r);
                var c    = tpco.DoCrossover(_moveList4Moves1, _moveList4Moves2);

                AssertMove(c.Item1[0], Color.Blue, Color.Red, CoordinateProvider.GetCoordinate('F', 7));
                AssertMove(c.Item1[1], Color.White, Color.Cyan, CoordinateProvider.GetCoordinate('E', 7));
                AssertMove(c.Item1[2], Color.Red, Color.Blue, CoordinateProvider.GetCoordinate('A', 5));
                AssertMove(c.Item1[3], Color.Blue, Color.Red, CoordinateProvider.GetCoordinate('C', 6));

                AssertMove(c.Item2[0], Color.Blue, Color.Red, CoordinateProvider.GetCoordinate('F', 2));
                AssertMove(c.Item2[1], Color.White, Color.Cyan, CoordinateProvider.GetCoordinate('B', 4));
                AssertMove(c.Item2[2], Color.Red, Color.Blue, CoordinateProvider.GetCoordinate('G', 4));
                AssertMove(c.Item2[3], Color.Blue, Color.Red, CoordinateProvider.GetCoordinate('B', 7));
            }
コード例 #18
0
        public void Cross_ParentsWithTwoGenes_Cross()
        {
            var target      = new TwoPointCrossover(0, 1);
            var chromosome1 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome1.ReplaceGenes(0, new Gene[]
            {
                new Gene(1),
                new Gene(2),
                new Gene(3),
                new Gene(4),
            });
            chromosome1.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var chromosome2 = MockRepository.GenerateStub <ChromosomeBase>(4);

            chromosome2.ReplaceGenes(0, new Gene[]
            {
                new Gene(5),
                new Gene(6),
                new Gene(7),
                new Gene(8)
            });
            chromosome2.Expect(c => c.CreateNew()).Return(MockRepository.GenerateStub <ChromosomeBase>(4));

            var actual = target.Cross(new List <IChromosome>()
            {
                chromosome1, chromosome2
            });

            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual(4, actual[0].Length);
            Assert.AreEqual(4, actual[1].Length);

            Assert.AreEqual(1, actual[0].GetGene(0).Value);
            Assert.AreEqual(6, actual[0].GetGene(1).Value);
            Assert.AreEqual(3, actual[0].GetGene(2).Value);
            Assert.AreEqual(4, actual[0].GetGene(3).Value);

            Assert.AreEqual(5, actual[1].GetGene(0).Value);
            Assert.AreEqual(2, actual[1].GetGene(1).Value);
            Assert.AreEqual(7, actual[1].GetGene(2).Value);
            Assert.AreEqual(8, actual[1].GetGene(3).Value);
        }
コード例 #19
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);
        }
        static void Main(string[] args)
        {
            int vezirSayisi = 8;

            var selection  = new EliteSelection();
            var crossover  = new TwoPointCrossover();
            var mutation   = new ReverseSequenceMutation();
            var fitness    = new MyProblemFitness();
            var chromosome = new MyProblemChromosome(vezirSayisi);
            var population = new Population(5000, 5500, chromosome);

            var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
            {
                Termination = new FitnessThresholdTermination(vezirSayisi * (vezirSayisi - 1) / 2)
            };

            int index = 0;

            ga.GenerationRan += delegate
            {
                var bestChromosome = ga.Population.BestChromosome;

                Console.Write("Index: " + index);
                Console.Write(", Fitness: {0}", bestChromosome.Fitness);

                Console.Write(", Genes: {0}", string.Join("-", bestChromosome.GetGenes()));

                Console.WriteLine();

                index++;
            };

            Console.WriteLine("GA running...");

            ga.Start();

            Console.WriteLine("Best solution found has {0} fitness.", ga.BestChromosome.Fitness);

            Console.Read();
        }
コード例 #21
0
        public void Run(ref double Minfitness, ref Point startPoint, ref Point endPoint)
        {
            if (linePointArr.Length == 0)
            {
                return;
            }
            else
            {
                var selection = new EliteSelection();
                var crossover = new TwoPointCrossover();
                var mutation  = new MyMutation();
                fitness = new MyProblemFitness2(linePointArr, startPoint, endPoint);
                var chromosome = new MyProblemChromosome2(linePointArr.Length < 3 ? 3 : linePointArr.Length);
                var population = new Population(linePointArr.Length + 3, linePointArr.Length + 3, chromosome);

                ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation)
                {
                    Termination          = new TimeEvolvingTermination(TimeSpan.FromMilliseconds(100)),
                    MutationProbability  = 2f,   //KS:变异概率50%
                    CrossoverProbability = 0.5f, //KS:交配概率50%
                };

                int index = 0; //KS:计算代数

                ga.GenerationRan += delegate
                {
                    var bestChromosome = ga.Population.BestChromosome;

                    /*                Console.Write("Index: " + index);
                     *              Console.Write(", Fitness: {0}", bestChromosome.Fitness);
                     *
                     *              Console.Write(", Genes: {0}", string.Join("-", bestChromosome.GetGenes()));
                     *
                     *              Console.WriteLine();*/

                    index++;
                };

                /*            Console.WriteLine("GA running...");
                 *          Stopwatch SW = new Stopwatch();
                 *          SW.Start();
                 */
                ga.Start();//调用GA线程


                // SW.Stop();
                //Console.Write(", Time: {0}", SW.ElapsedMilliseconds);
                Console.WriteLine("Best solution found has {0} fitness : {1}.", string.Join("-", ga.Population.BestChromosome.GetGenes()), ga.Population.BestChromosome.Fitness);
            }

            fitness.Evaluate(ga.Population.BestChromosome); //KS: 评价基因的优劣
            Minfitness = ga.Population.BestChromosome.Fitness.Value;
            startPoint = fitness.start.ToPoint();
            endPoint   = fitness.end.ToPoint();

            /*
             * if (ga.Population.BestChromosome.Fitness > Minfitness)
             * {
             *  Minfitness = ga.Population.BestChromosome.Fitness.Value;
             *  startPoint = fitness.start.ToPoint();
             *  endPoint = fitness.end.ToPoint();
             * }
             * else
             * {
             *  Minfitness = math.lerp((float)Minfitness, (float)ga.Population.BestChromosome.Fitness, 0.5f);
             * }
             */
        }
コード例 #22
0
        public static wynikGA Genetic(int counter, Item[] dane, double back_volume)
        {
            double[] minValue       = new double[counter];
            double[] maxValue       = new double[counter];
            int[]    totalBits      = new int[counter];
            int[]    fractionDigits = new int[counter];


            for (int i = 0; i < counter; i++)
            {
                minValue[i]       = 0;
                maxValue[i]       = 1;
                totalBits[i]      = 16;
                fractionDigits[i] = 4;
            }

            var selection  = new TournamentSelection(50, true);
            var crossover  = new TwoPointCrossover();
            var mutation   = new FlipBitMutation();
            var chromosome = new FloatingPointChromosome(minValue, maxValue, totalBits, fractionDigits);
            // var fitobj = new MyProblemFitness(dane, chromosome, back_volume);
            //var fitness = fitobj.Evaluate;
            var population = new Population(500, 500, chromosome);

            var fitness = new FuncFitness((c) =>
            {
                var fc = c as FloatingPointChromosome;
                //var _items = dane;
                //var _bvol = back_volume;

                /* var values = fc.ToFloatingPoints();
                 * var x1 = values[0];
                 * var y1 = values[1];
                 * var x2 = values[2];
                 * var y2 = values[3];
                 * return Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
                 *
                 */

                //chromosome.ReplaceGenes(0, chromosome.GetGenes());
                double[] proc_wag          = fc.ToFloatingPoints();
                double suma_spakowanych    = 0;
                double wartosc_spakowanych = 0;
                for (int i = 0; i < proc_wag.Length; i++)
                {
                    suma_spakowanych    += dane[i].item_volume * proc_wag[i];
                    wartosc_spakowanych += dane[i].item_value * proc_wag[i];
                }

                if (suma_spakowanych <= back_volume)
                {
                    double temp = (wartosc_spakowanych * (suma_spakowanych / back_volume));
                    if (temp < 0)
                    {
                        if (Experiments.doOutput)
                        {
                            System.Console.WriteLine("LOL ");
                        }
                    }
                }


                return((suma_spakowanych <= back_volume) ? (wartosc_spakowanych * (suma_spakowanych / back_volume)) : (-suma_spakowanych));
            });



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

            ga.Termination = new GenerationNumberTermination(100);

            if (Experiments.doOutput)
            {
                System.Console.WriteLine("GA running...");
            }
            ga.MutationProbability  = 0.05f;
            ga.CrossoverProbability = 0.20f;
            //ga.Selection.
            ga.Start();

            // FITNESS  if (Experiments.doOutput) System.Console.WriteLine("Best solution found has fitness = " + ga.BestChromosome.Fitness);
            wynikGA w = new wynikGA();

            w.ga = ga;
            w.ch = chromosome;
            w.ch.ReplaceGenes(0, ga.BestChromosome.GetGenes());

            return(w);
        }
コード例 #23
0
        public IList <IChromosome> TwoPointCrossover()
        {
            var target = new TwoPointCrossover();

            return(target.Cross(CreateTwoParents()));
        }
コード例 #24
0
ファイル: CrossoverTest.cs プロジェクト: bjutlgr/ga1
 public void TwoPointCrossover()
 {
     IChromosome<int> a = new DigitalChromosome().GenerateFromArray(new int[] { 1, 2, 3, 4 });
     IChromosome<int> b = new DigitalChromosome().GenerateFromArray(new int[] { 4, 3, 2, 1 });
     TwoPointCrossover<int> cross = new TwoPointCrossover<int>(1, 3, 4);
     IChromosome<int>[] res = cross.Crossover(a, b);
     IChromosome<int>[] exp = new IChromosome<int>[2] { new DigitalChromosome().GenerateFromArray(new int[] { 1, 3, 2, 4 }), new DigitalChromosome().GenerateFromArray(new int[] { 4, 2, 3, 1 }) };
     CollectionAssert.AreEqual(res, exp);
 }
コード例 #25
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            Models.Instance i = new Models.Instance();
            i.Days    = 7;
            i.Doctors = doctors;

            int min = (int)numMin.Value;
            int max = (int)numMax.Value;

            var        chromosome = new Models.Chromosome(21, i, r);
            var        population = new Population(min, max, chromosome);
            var        fitness    = new Models.Fitness();
            IMutation  mutation   = new TworsMutation();
            ISelection selection  = new RouletteWheelSelection();
            ICrossover crossover  = new OnePointCrossover(r.Next(20));

            if (cbxMutation.SelectedItem.ToString() == "Insertion")
            {
                mutation = new InsertionMutation();
            }
            else if (cbxMutation.SelectedItem.ToString() == "Partial Shuffle")
            {
                mutation = new PartialShuffleMutation();
            }
            else if (cbxMutation.SelectedItem.ToString() == "Reverse Sequence")
            {
                mutation = new ReverseSequenceMutation();
            }

            if (cbxSelection.SelectedItem.ToString() == "Elitizam")
            {
                selection = new EliteSelection();
            }

            if (cbxCrossover.SelectedItem.ToString() == "Two-point")
            {
                int p1 = r.Next(19);
                int p2 = r.Next(p1 + 1, 20);
                crossover = new TwoPointCrossover(p1, p2);
            }
            else if (cbxCrossover.SelectedItem.ToString() == "Uniform")
            {
                crossover = new UniformCrossover();
            }

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

            ITermination termination = new FitnessStagnationTermination(50);

            if (cbxTermination.SelectedItem.ToString() == "Generation number")
            {
                termination = new GenerationNumberTermination(200);
            }

            ga.Termination = termination;

            ga.MutationProbability = (float)numProbability.Value;

            ga.Start();

            Gene[] g = ga.BestChromosome.GetGenes();

            dataView.Rows.Clear();
            for (int j = 0; j < 7; j++)
            {
                string[] row = new string[] { ((List <int>)g[j * 3].Value)[0].ToString() + "   " + ((List <int>)g[j * 3].Value)[1].ToString(),
                                              ((List <int>)g[j * 3 + 1].Value)[0].ToString() + "   " + ((List <int>)g[j * 3 + 1].Value)[1].ToString(),
                                              ((List <int>)g[j * 3 + 2].Value)[0].ToString() + "   " + ((List <int>)g[j * 3 + 2].Value)[1].ToString() };

                dataView.Rows.Add(row);
                dataView.Rows[j].HeaderCell.Value = (j + 1).ToString();
            }

            lblFitness.Text = ga.BestChromosome.Fitness.ToString() + "  , generacija broj " + ga.GenerationsNumber.ToString();
        }
コード例 #26
0
        public static void CorretionCentroid()
        {
            //中心点数据
            Stopwatch sw = new Stopwatch();

            sw.Start();
            List <Coordinate> centroidPoints = new List <Coordinate>(80);
            StreamReader      sr             = new StreamReader(@"D:\MagicSong\OneDrive\2017研究生毕业设计\数据\项目用数据\中心点80.txt");

            sr.ReadLine();//读取标题行
            while (!sr.EndOfStream)
            {
                string[] line = sr.ReadLine().Split(',');
                centroidPoints.Add(new Coordinate(double.Parse(line[1]), double.Parse(line[2])));
            }
            sr.Close();
            //Bus数据,并且构造KD树
            KdTree            myKdtree      = new KdTree(2);
            IFeatureSet       busFS         = FeatureSet.Open(@"D:\MagicSong\OneDrive\2017研究生毕业设计\数据\项目用数据\BusStopGauss.shp");
            List <Coordinate> busStopPoints = new List <Coordinate>(busFS.NumRows());

            foreach (var item in busFS.Features)
            {
                var c = item.Coordinates[0];
                busStopPoints.Add(c);
                myKdtree.Insert(new double[] { c.X, c.Y }, item);
            }
            Console.WriteLine("数据读取完毕,开始构造遗传算法");
            IFeatureSet newCentroid = new FeatureSet(FeatureType.Point);

            newCentroid.Name       = "优化过的中心点";
            newCentroid.Projection = ProjectionInfo.FromEpsgCode(GAUSS_EPSG);
            newCentroid.DataTable.Columns.Add("name", typeof(string));
            //遗传算法,构造适应性函数
            MyProblemChromosome.CandiateNumber = 5;
            List <int[]> candinatesForEachControid = new List <int[]>(centroidPoints.Count);

            foreach (var item in centroidPoints)
            {
                object[] nearest = myKdtree.Nearest(new double[] { item.X, item.Y }, MyProblemChromosome.CandiateNumber);
                candinatesForEachControid.Add(nearest.Select((o) =>
                {
                    var f = o as IFeature;
                    return(f.Fid);
                }).ToArray());
            }
            MyProblemFitness    fitness = new MyProblemFitness(centroidPoints, busStopPoints, candinatesForEachControid);
            MyProblemChromosome mpc     = new MyProblemChromosome(centroidPoints.Count);
            //这边可以并行
            MyProblemChromosome globalBest = null;

            Console.WriteLine("遗传算法构造已经完成!");
            sw.Stop();
            Console.WriteLine("一共用时:{0}s", sw.Elapsed.TotalSeconds);
            int GACount = 8;

            Parallel.For(0, GACount, new Action <int>((index) =>
            {
                var selection  = new EliteSelection();
                var crossover  = new TwoPointCrossover();
                var mutation   = new ReverseSequenceMutation();
                var population = new Population(1000, 1200, mpc);
                var ga         = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
                ga.Termination = new GenerationNumberTermination(1000);
                Stopwatch sw1  = new Stopwatch();
                sw1.Start();
                Console.WriteLine("遗传算法任务{0}正在运行.......", index);
                ga.Start();
                var best = ga.BestChromosome as MyProblemChromosome;
                if (globalBest == null || globalBest.Fitness < best.Fitness)
                {
                    globalBest = best;
                }
                sw1.Stop();
                Console.WriteLine("第{0}次遗传算法已经完成,耗费时间为:{1}s,最终的fitness为:{2},有效个数为:{3}", index, sw1.Elapsed.TotalSeconds, best.Fitness, best.Significance);
            }));
            Console.WriteLine("Final Choose!");
            Console.WriteLine("最终的fitness为:{0},有效个数为:{1}", globalBest.Fitness, globalBest.Significance);
            for (int i = 0; i < globalBest.Length; i++)
            {
                int        index = candinatesForEachControid[i][(int)globalBest.GetGene(i).Value];
                Coordinate c     = busStopPoints[index];
                var        f     = newCentroid.AddFeature(new Point(c));
                f.DataRow.BeginEdit();
                f.DataRow["name"] = busFS.GetFeature(index).DataRow["name"];
                f.DataRow.EndEdit();
            }
            newCentroid.SaveAs("newCentroid.shp", true);
            Console.ReadKey();
        }
コード例 #27
0
        private static IAlgoritmo CriaAlgoritmoGenetico(Dictionary <string, string[]> dict, List <string> flat, Problema problema)
        {
            int         populacaoMin, populacaoMax;
            IPopulation population;

            ISelection   selection;
            ICrossover   crossover;
            IMutation    mutation;
            ITermination termination;
            IReinsertion reinsertion;
            float        crossoverProbability, mutationProbability;



            var p = dict.ValueOrDefault("p", "50,100").Split(new[] { ',' });

            if (p.Length != 2 || !int.TryParse(p[0], out populacaoMin) || !int.TryParse(p[1], out populacaoMax))
            {
                throw new ArgumentException("Faixa de população inválida.");
            }

            population = new Population(populacaoMin, populacaoMax, new CromossomoViajante(problema.Mapa.Locais.Count));

            switch (dict.ValueOrDefault("s", "t"))
            {
            case "e":
                selection = new EliteSelection();
                break;

            case "r":
                selection = new RouletteWheelSelection();
                break;

            case "s":
                selection = new StochasticUniversalSamplingSelection();
                break;

            case "t":
                selection = new TournamentSelection();
                break;

            default:
                throw new ArgumentException("Seleção inválida.");
            }

            switch (dict.ValueOrDefault("c", "o"))
            {
            case "s":
                crossover = new CutAndSpliceCrossover();
                break;

            case "c":
                crossover = new CycleCrossover();
                break;

            case "o":
                crossover = new OrderedCrossover();
                break;

            case "ob":
                crossover = new OrderBasedCrossover();
                break;

            case "op":
                crossover = new OnePointCrossover();
                break;

            case "pm":
                crossover = new PartiallyMappedCrossover();
                break;

            case "p":
                crossover = new PositionBasedCrossover();
                break;

            case "tpa":
                crossover = new ThreeParentCrossover();
                break;

            case "tp":
                crossover = new TwoPointCrossover();
                break;

            case "u":
                crossover = new UniformCrossover();
                break;

            default:
                throw new ArgumentException("Crossover inválido.");
            }

            switch (dict.ValueOrDefault("m", "r"))
            {
            case "d":
                mutation = new DisplacementMutation();
                break;

            case "f":
                mutation = new FlipBitMutation();
                break;

            case "i":
                mutation = new InsertionMutation();
                break;

            case "s":
                mutation = new PartialShuffleMutation();
                break;

            case "r":
                mutation = new ReverseSequenceMutation();
                break;

            case "t":
                mutation = new TworsMutation();
                break;

            case "u":
                mutation = new UniformMutation();
                break;

            default:
                throw new ArgumentException("Mutação inválida.");
            }

            switch (dict.ValueOrDefault("t", "s"))
            {
            case "s":
                termination = new FitnessStagnationTermination();
                break;

            case "t":
                termination = new FitnessThresholdTermination();
                break;

            case "g":
                termination = new GenerationNumberTermination();
                break;

            default:
                throw new ArgumentException("Terminação inválida.");
            }

            switch (dict.ValueOrDefault("e", "e"))
            {
            case "e":
                reinsertion = new ElitistReinsertion();
                break;

            case "p":
                reinsertion = new PureReinsertion();
                break;

            case "u":
                reinsertion = new UniformReinsertion();
                break;

            default:
                throw new ArgumentException("Reinserção inválida.");
            }

            if (!float.TryParse(dict.ValueOrDefault("cp", "0,75"), out crossoverProbability))
            {
                throw new ArgumentException("Probabilidade de crossover inválida.");
            }

            if (!float.TryParse(dict.ValueOrDefault("mp", "0,25"), out mutationProbability))
            {
                throw new ArgumentException("Probabilidade de mutação inválida.");
            }


            return(new AlgoritmoGenetico(problema, population, selection, crossover, crossoverProbability, mutation, mutationProbability, termination, reinsertion));
        }
コード例 #28
0
        private void EvolveGeneticStrategyButton_Click(object sender, RoutedEventArgs e)
        {
            OutputTextBlock.Text = "Evolving...";

            Task.Run(() =>
            {
                var chromosome = new BlackjackChromosome();
                var fitness    = new BlackjackFitness();
                var population = new Population(Settings.GeneticSettings.MinPopulationSize, Settings.GeneticSettings.MaxPopulationSize, chromosome);

                ISelection selection;

                switch (Settings.GeneticSettings.SelectionType)
                {
                case SelectionType.Elite:
                    selection = new EliteSelection();
                    break;

                case SelectionType.RouletteWheel:
                    selection = new RouletteWheelSelection();
                    break;

                case SelectionType.StochasticUniversalSampling:
                    selection = new StochasticUniversalSamplingSelection();
                    break;

                case SelectionType.Tournament:
                    selection = new TournamentSelection(Settings.GeneticSettings.TournamentSize);
                    break;

                default:
                    throw new InvalidOperationException();
                }

                ICrossover crossover;

                switch (Settings.GeneticSettings.CrossoverType)
                {
                case CrossoverType.AlternatingPosition:
                    crossover = new AlternatingPositionCrossover();
                    break;

                case CrossoverType.CutAndSplice:
                    crossover = new CutAndSpliceCrossover();
                    break;

                case CrossoverType.Cycle:
                    crossover = new CycleCrossover();
                    break;

                case CrossoverType.OnePoint:
                    crossover = new OnePointCrossover();
                    break;

                case CrossoverType.TwoPoint:
                    crossover = new TwoPointCrossover();
                    break;

                case CrossoverType.OrderBased:
                    crossover = new OrderBasedCrossover();
                    break;

                case CrossoverType.Ordered:
                    crossover = new OrderedCrossover();
                    break;

                case CrossoverType.PartiallyMapped:
                    crossover = new PartiallyMappedCrossover();
                    break;

                case CrossoverType.PositionBased:
                    crossover = new PositionBasedCrossover();
                    break;

                case CrossoverType.ThreeParent:
                    crossover = new ThreeParentCrossover();
                    break;

                case CrossoverType.Uniform:
                    crossover = new UniformCrossover(Settings.Current.GeneticSettings.MixProbability);
                    break;

                case CrossoverType.VotingRecombination:
                    crossover = new VotingRecombinationCrossover();
                    break;

                default:
                    throw new InvalidOperationException();
                }

                var mutation     = new UniformMutation();
                var termination  = new FitnessStagnationTermination(Settings.Current.GeneticSettings.NumStagnantGenerations);
                var taskExecutor = new ParallelTaskExecutor();

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

                ga.Termination          = termination;
                ga.TaskExecutor         = taskExecutor;
                ga.MutationProbability  = Settings.GeneticSettings.MutationProbability;
                ga.CrossoverProbability = Settings.GeneticSettings.CrossoverProbability;

                var latestFitness = double.MinValue;

                ga.GenerationRan += (s, o) =>
                {
                    geneticStrategy = (IStrategy)ga.BestChromosome;

                    var generationNumber = ga.GenerationsNumber;
                    var bestFitness      = ga.BestChromosome.Fitness.Value;
                    var avgFitness       = ga.Population.CurrentGeneration.Chromosomes.Average(c => c.Fitness.Value);

                    Dispatcher.Invoke(() =>
                    {
                        if (generationNumber == 1)
                        {
                            OutputTextBlock.Text = string.Empty;
                        }

                        OutputTextBlock.Text = $"Gen: {generationNumber}\tFit: {bestFitness}\tAvg: {avgFitness.ToString("0")}\n" + OutputTextBlock.Text;

                        if (bestFitness != latestFitness)
                        {
                            latestFitness = bestFitness;

                            var savedImageName = Settings.Current.GeneticSettings.SaveImagePerGeneration ? "gen" + generationNumber : null;

                            StrategyViewer.Draw(GeneticStrategyCanvas, geneticStrategy, $"Best from generation {generationNumber}", savedImageName);
                        }
                    }, DispatcherPriority.Background);
                };

                ga.TerminationReached += (s, o) =>
                {
                    Dispatcher.Invoke(() =>
                    {
                        OutputTextBlock.Text = "Termination reached.\n" + OutputTextBlock.Text;
                        TestGeneticStrategyButton.IsEnabled = true;
                    }, DispatcherPriority.Background);
                };

                ga.Start();
            });
        }
コード例 #29
0
        public static void Main(string[] args)
        {
            string plaintextFilename = "text_sample.txt";
            string logFilename       = "log.txt";
            string key = "cipherkey";

            int   populationSize       = 100;
            int   offspring            = 10;
            float mutationProbability  = 0.25f;
            float crossoverProbability = 0.85f;
            int   maxGenerations       = 500;

            using (StreamWriter w = File.AppendText($"../../../logs/{logFilename}"))
            {
                //read in plaintext
                string plaintext = File.ReadAllText($"../../../statistics/text/{plaintextFilename}").ToLower();

                //init cipher and encipher plaintext
                ICipher cipher = new VigenereCipher(plaintext);
                cipher.Encipher(key);
                Console.WriteLine(cipher.CipherText);

                //init genetic alorithm operators
                //use tournament selection to minimize the likelyhood of staying in a lokal optima
                var selection = new TournamentSelection(5);
                //crossover the solution candidates by choosing a interval of the key and swap the interval
                var crossover = new TwoPointCrossover();
                //mutate the solution candidates with the own implemented mutation operator
                var mutation = new CipherMutation();
                //evaluate the fitness of the solution candidates with the own implemented fitness function
                var fitness = new CipherFitness(cipher);
                //initalize the solution candidates with the own implemented solution candidate implementation
                var chromosome = new CipherChromosome(key.Length);
                //initialize a population
                var population = new Population(populationSize, populationSize + offspring, chromosome);

                //initialize the genetic algorithm with the above initialized operators
                var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

                //set mutation and crossover probabilities
                ga.MutationProbability  = mutationProbability;
                ga.CrossoverProbability = crossoverProbability;

                //specify the algorithm termination with max generations or a fitness threshold
                ga.Termination = new OrTermination(new GenerationNumberTermination(maxGenerations), new FitnessThresholdTermination(0.99));

                var latestFitness = 0.0;

                //hang into the GenerationRan event which gets called by the library after each generation ran.
                ga.GenerationRan += (sender, e) =>
                {
                    //select the best solution candidate in the current generation
                    var bestChromosome = ga.BestChromosome as CipherChromosome;
                    //if fitness in current generation is better than fitness in previous generations
                    if (bestChromosome.Fitness != latestFitness)
                    {
                        latestFitness = bestChromosome.Fitness.Value;
                        string genText = String.Format("Generation {0}: Best solution found is Key:{1} with {2} fitness.", ga.GenerationsNumber, bestChromosome.ToString(), bestChromosome.Fitness);
                        Console.WriteLine(genText);
                        w.WriteLine(genText);
                    }
                };
                string gaText = $"------Plaintextfile:{plaintextFilename}, Key:{key}------\n------Genetic Algorithm Settings: Populationsize:{populationSize}, Mutation:{mutationProbability}, Crossover:{crossoverProbability}------";
                Console.WriteLine(gaText);
                w.WriteLine(gaText);

                //start ga
                ga.Start();

                var    finalSolution = ga.BestChromosome as CipherChromosome;
                string doneText      = $"GA done in {ga.GenerationsNumber} generations.\n Best solution found is Key:{finalSolution.ToString()} (L={finalSolution.ToString().Length}) with {finalSolution.Fitness} fitness. ";

                string decipheredText = cipher.Decipher(finalSolution.ToString());
                Console.WriteLine(doneText + "\n" + decipheredText);
                w.WriteLine(doneText + "\n" + decipheredText);
            }
        }