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(); }
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); }
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); }
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 }); }); }
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(); }
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); }
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."); }
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); }
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(); }
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)); }
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)); }
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); } }
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()); }
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 }); }); }
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()); }
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(); }
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)); }
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); }
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(); }
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); * } */ }
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); }
public IList <IChromosome> TwoPointCrossover() { var target = new TwoPointCrossover(); return(target.Cross(CreateTwoParents())); }
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); }
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(); }
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(); }
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)); }
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(); }); }
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); } }