public DnaDrawing(PolygonChromosome best) { Polygons = best.GetPolygons().Select(p => new DnaPolygon() { Brush = Mapper.Map <DnaBrush>(p.Brush), Points = Mapper.Map <List <DnaPoint> >(p.Points) }) .ToList(); }
private void StartEvolution() { SetupSourceColorMatrix(); if (currentDrawing == null) { currentDrawing = GetNewInitializedDrawing(); } lastSelected = 0; var selection = new EliteSelection(); // var selection = new CustomSelection(20); var crossover = new OrderedCrossover(); // var crossover = new CycleCrossover(); // var crossover = new CutAndSpliceCrossover(); // var crossover = new OnePointCrossover(2); var mutation = new CustomMutation(); // var mutation = new UniformMutation(true); var fitness = new DrawingFitness(sourceColors); var chromosome = new PolygonChromosome(); var population = new Population(10, 100, chromosome); _ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); _ga.Termination = new TimeEvolvingTermination(TimeSpan.FromHours(4)); // _ga.GenerationRan += (sender, args) => { generation++; var best = _ga.Population.CurrentGeneration.Chromosomes.OrderBy(c => c.Fitness).First() as PolygonChromosome; var drawing = new DnaDrawing(best); if (best.Fitness.Value <= errorLevel) { errorLevel = best.Fitness.Value; lock (currentDrawing) { currentDrawing = drawing; } selected++; } }; _ga.Stopped += (sender, args) => { Stop(); }; _ga.Start(); // while (isRunning) // { // DnaDrawing newDrawing; // lock (currentDrawing) // { // newDrawing = currentDrawing.Clone(); // } // newDrawing.Mutate(); // // if (newDrawing.IsDirty) // { // generation++; // // double newErrorLevel = FitnessCalculator.GetDrawingFitness( // newDrawing, // sourceColors); // // if (newErrorLevel <= errorLevel) // { // selected++; // lock (currentDrawing) // { // currentDrawing = newDrawing; // } // errorLevel = newErrorLevel; // } // } // //else, discard new drawing // } }