Exemplo n.º 1
0
 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();
 }
Exemplo n.º 2
0
        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
//            }
        }