예제 #1
0
 //Evolve algorithm
 public void Evolve()
 {
     while (true)
     {
         generation++;
         if (Numbers.GenerationQuantity > 1)
         {
             var children = EvoManager.Crossover(Numbers.GenerationQuantity, parents.ElementAt(0), parents.ElementAt(1));
             EvoManager.Mutate(children, colorTable);
             children = (from child in children
                         orderby child.Fitness
                         select child).ToList();
             var mostFitChild = children.First();
             if (mostFitChild.NeedRepaint)
             {
                 if (fitness >= mostFitChild.Fitness)
                 {
                     childrenSelected++;
                     fitness = mostFitChild.Fitness;
                     parents = children;
                     lock (drawingData)
                     {
                         drawingData = mostFitChild;
                     }
                 }
             }
         }
         else
         {
             EvoDrawing child;
             lock (drawingData)
             {
                 child = drawingData.Clone();
             }
             child.Mutate();
             child.Fitness = EvoManager.Fitness(child, colorTable);
             if (child.NeedRepaint)
             {
                 if (fitness >= child.Fitness)
                 {
                     childrenSelected++;
                     fitness = child.Fitness;
                     //Keep possibility to come back
                     parents.Clear();
                     parents.Add(child.Clone());
                     parents.Add(child.Clone());
                     lock (drawingData)
                     {
                         drawingData = child;
                     }
                 }
             }
         }
     }
 }
예제 #2
0
        private void startEvolution()
        {
            redrawGenerator.Start();
            startButton.Text = "Stop";
            parents          = (from parent in parents
                                orderby parent.Fitness
                                select parent).ToList();
            drawingData = parents.ElementAt(0);

            evoThread = new Thread(Evolve)
            {
                IsBackground = true,
                Priority     = ThreadPriority.Highest
            };
            evoThread.Start();
        }
예제 #3
0
 private void setupStart()
 {
     if (parents != null)
     {
         parents.Clear();
     }
     else
     {
         parents = new List <EvoDrawing>();
     }
     for (int i = 0; i < Numbers.GenerationQuantity; i++)
     {
         var adam = new EvoDrawing(Numbers.MinPointsPerShape, Numbers.MaxPointsPerShape, colorTable);
         parents.Add(adam.Clone());
     }
     generation       = 0;
     childrenSelected = 0;
     fitness          = Double.MaxValue;
 }
예제 #4
0
 private void redrawImpulse(object sender, EventArgs e)
 {
     if (drawingData == null)
     {
         return;
     }
     lock (drawingData)
     {
         if (drawingData.NeedRepaint)
         {
             drawingToBeShown         = drawingData.Clone();
             drawingData.NeedRepaint  = false;
             numberOfShapesLabel.Text = drawingToBeShown.ShapesNumber.ToString();
             drawing.Invalidate();
         }
     }
     generationLabel.Text     = generation.ToString();
     childrenNumberLabel.Text = childrenSelected.ToString();
     fitnessLabel.Text        = fitness.ToString();
 }