private void Mutate(SudokuChromesome aGene) { if (Sudokufitness.TheSeed.Next(100) < (int)(kMutationFrequency * 100.0)) { aGene.Mutate(); } }
public override void CopyGeneInfo(SudokuChromesome dest) { Sudokufitness theGene = (Sudokufitness)dest; theGene.Length = Length; theGene.TheMin = TheMin; theGene.TheMax = TheMax; }
// 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);
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); }