MazeIndividual.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace GeneticAlgorithm
  4. {
  5. internal class MazeIndividual : Individual
  6. {
  7. // Constructeur par défaut : initialisation aléatoire
  8. public MazeIndividual()
  9. {
  10. genome = new List<IGene>();
  11. for (int i = 0; i < Parameters.initialGenesNb; i++)
  12. {
  13. genome.Add(new MazeGene());
  14. }
  15. }
  16. // Constructeur avec un parent (copie + mutations)
  17. public MazeIndividual(MazeIndividual father)
  18. {
  19. this.genome = new List<IGene>();
  20. foreach (MazeGene g in father.genome)
  21. {
  22. this.genome.Add(new MazeGene(g));
  23. }
  24. Mutate();
  25. }
  26. // Constructeur avec deux parents (crossover et mutations)
  27. public MazeIndividual(MazeIndividual father, MazeIndividual mother)
  28. {
  29. this.genome = new List<IGene>();
  30. // Crossover
  31. int cuttingPoint = Parameters.randomGenerator.Next(father.genome.Count);
  32. foreach (MazeGene g in father.genome.Take(cuttingPoint))
  33. {
  34. this.genome.Add(new MazeGene(g));
  35. }
  36. foreach (MazeGene g in mother.genome.Skip(cuttingPoint))
  37. {
  38. this.genome.Add(new MazeGene(g));
  39. }
  40. // Mutation
  41. Mutate();
  42. }
  43. internal override void Mutate()
  44. {
  45. // Suppression ?
  46. if (Parameters.randomGenerator.NextDouble() < Parameters.mutationDeleteRate)
  47. {
  48. int geneIndex = Parameters.randomGenerator.Next(genome.Count);
  49. genome.RemoveAt(geneIndex);
  50. }
  51. // Ajout ?
  52. if (Parameters.randomGenerator.NextDouble() < Parameters.mutationAddRate)
  53. {
  54. genome.Add(new MazeGene());
  55. }
  56. // Remplacement gène par gène ?
  57. foreach (MazeGene g in genome)
  58. {
  59. if (Parameters.randomGenerator.NextDouble() < Parameters.mutationsRate)
  60. {
  61. g.Mutate();
  62. }
  63. }
  64. }
  65. internal override double Evaluate()
  66. {
  67. fitness = Maze.Evaluate(this);
  68. return fitness;
  69. }
  70. }
  71. }