Exemplo n.º 1
0
 private void Mutate(SudokuChromesome aGene)
 {
     if (Sudokufitness.TheSeed.Next(100) < (int)(kMutationFrequency * 100.0))
     {
         aGene.Mutate();
     }
 }
Exemplo n.º 2
0
        public override void CopyGeneInfo(SudokuChromesome dest)
        {
            Sudokufitness theGene = (Sudokufitness)dest;

            theGene.Length = Length;
            theGene.TheMin = TheMin;
            theGene.TheMax = TheMax;
        }
Exemplo n.º 3
0
        // Calculer Generateur
        public void CalculateGeneration(int nPopulation, int nGeneration)
        {
            int        _previousFitness = 0;
            Population TestPopulation   = new Population();

            for (int i = 0; i < nGeneration; i++)
            {
                if (_threadFlag)
                {
                    break;
                }
                TestPopulation.NextGeneration();
                SudokuChromesome g = TestPopulation.GetHighestScoreGenome();

                if (i % 100 == 0)
                {
                    Console.WriteLine("Generation #{0}", i);
                    if (ToPercent(g.CurrentFitness) != _previousFitness)
                    {
                        Console.WriteLine(g.ToString());
                        _gene           = g;
                        statusBar1.Text = String.Format(" Fitness = {0}", g.CurrentFitness.ToString("0.00"));
                        this.Text       = String.Format("Sudoko  - Generation {0}", i);
                        Invalidate();
                        _previousFitness = ToPercent(g.CurrentFitness);
                    }

                    if (g.CurrentFitness > .9999)
                    {
                        Console.WriteLine("Solution Final Generation {0}", i);
                        statusBar1.Text = "Terminer";
                        Console.WriteLine(g.ToString());
                        break;
                    }
                }
            }
        }
 abstract public void    CopyGeneInfo(SudokuChromesome g);
 abstract public SudokuChromesome Crossover(SudokuChromesome g);
Exemplo n.º 6
0
        public override SudokuChromesome Crossover(SudokuChromesome g)
        {
            Sudokufitness aGene1 = new Sudokufitness();
            Sudokufitness aGene2 = new Sudokufitness();

            g.CopyGeneInfo(aGene1);
            g.CopyGeneInfo(aGene2);


            Sudokufitness CrossingGene = (Sudokufitness)g;

            if (TheSeed.Next(2) == 1)
            {
                for (int j = 0; j < 9; j++)
                {
                    CrossoverPoint = TheSeed.Next(8) + 1;
                    for (int k = 0; k < CrossoverPoint; k++)
                    {
                        aGene1.TheArray[k, j] = CrossingGene.TheArray[k, j];
                        //						aGene1.TheArray[8 - k,j] = TheArray[8-k, j];
                        aGene2.TheArray[k, j] = TheArray[k, j];
                        //						aGene2.TheArray[8 - k ,j] = CrossingGene.TheArray[8 - k,j];
                    }

                    for (int k = CrossoverPoint; k < 9; k++)
                    {
                        aGene2.TheArray[k, j] = CrossingGene.TheArray[k, j];
                        //						aGene1.TheArray[8 - k,j] = TheArray[8-k, j];
                        aGene1.TheArray[k, j] = TheArray[k, j];
                        //						aGene2.TheArray[8 - k ,j] = CrossingGene.TheArray[8 - k,j];
                    }
                }
            }
            else
            {
                for (int j = 0; j < 9; j++)
                {
                    CrossoverPoint = TheSeed.Next(8) + 1;
                    for (int k = 0; k < CrossoverPoint; k++)
                    {
                        aGene1.TheArray[j, k] = CrossingGene.TheArray[j, k];
                        //						aGene1.TheArray[8 - k,j] = TheArray[8-k, j];
                        aGene2.TheArray[j, k] = TheArray[j, k];
                        //						aGene2.TheArray[8 - k ,j] = CrossingGene.TheArray[8 - k,j];
                    }

                    for (int k = CrossoverPoint; k < 9; k++)
                    {
                        aGene2.TheArray[j, k] = CrossingGene.TheArray[j, k];
                        //						aGene1.TheArray[8 - k,j] = TheArray[8-k, j];
                        aGene1.TheArray[j, k] = TheArray[j, k];
                        //						aGene2.TheArray[8 - k ,j] = CrossingGene.TheArray[8 - k,j];
                    }
                }
            }



/*
 *                      SudokuGenome CrossingGene = (SudokuGenome)g;
 *                      for (int i = 0; i < CrossoverPoint; i++)
 *                      {
 *                              for (int j = 0; j < CrossoverPoint; j++)
 *                              {
 *                                      aGene1.TheArray[i,j] = CrossingGene.TheArray[i,j];
 *                                      aGene2.TheArray[i,j] = TheArray[i, j];
 *                              }
 *                      }
 *
 *                      for (int i = CrossoverPoint; i < 9; i++)
 *                              for (int j = CrossoverPoint; j < 9; j++)
 *                              {
 *                                      aGene1.TheArray[i,j] =  TheArray[i,j];
 *                                      aGene2.TheArray[i,j] = CrossingGene.TheArray[i,j];
 *                              }
 *
 *                      for (int i = CrossoverPoint; i < 9; i++)
 *                              for (int j = 0; j < CrossoverPoint; j++)
 *                              {
 *                                      aGene1.TheArray[i,j] =  TheArray[i,j];
 *                                      aGene2.TheArray[i,j] = CrossingGene.TheArray[i,j];
 *                              }
 *
 *                      for (int i = 0; i < CrossoverPoint; i++)
 *                              for (int j = CrossoverPoint; j < 9; j++)
 *                              {
 *                                      aGene1.TheArray[i,j] =  CrossingGene.TheArray[i,j];
 *                                      aGene2.TheArray[i,j] = TheArray[i,j];
 *                              }
 */

            // 50/50 chance of returning gene1 or gene2
            Sudokufitness aGene = null;

            if (TheSeed.Next(2) == 1)
            {
                aGene = aGene1;
            }
            else
            {
                aGene = aGene2;
            }

            return(aGene);
        }