| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- using System.Collections.Generic;
- using System.Linq;
- namespace GeneticAlgorithm
- {
- internal class MazeIndividual : Individual
- {
- // Constructeur par défaut : initialisation aléatoire
- public MazeIndividual()
- {
- genome = new List<IGene>();
- for (int i = 0; i < Parameters.initialGenesNb; i++)
- {
- genome.Add(new MazeGene());
- }
- }
- // Constructeur avec un parent (copie + mutations)
- public MazeIndividual(MazeIndividual father)
- {
- this.genome = new List<IGene>();
- foreach (MazeGene g in father.genome)
- {
- this.genome.Add(new MazeGene(g));
- }
- Mutate();
- }
- // Constructeur avec deux parents (crossover et mutations)
- public MazeIndividual(MazeIndividual father, MazeIndividual mother)
- {
- this.genome = new List<IGene>();
- // Crossover
- int cuttingPoint = Parameters.randomGenerator.Next(father.genome.Count);
- foreach (MazeGene g in father.genome.Take(cuttingPoint))
- {
- this.genome.Add(new MazeGene(g));
- }
- foreach (MazeGene g in mother.genome.Skip(cuttingPoint))
- {
- this.genome.Add(new MazeGene(g));
- }
- // Mutation
- Mutate();
- }
- internal override void Mutate()
- {
- // Suppression ?
- if (Parameters.randomGenerator.NextDouble() < Parameters.mutationDeleteRate)
- {
- int geneIndex = Parameters.randomGenerator.Next(genome.Count);
- genome.RemoveAt(geneIndex);
- }
- // Ajout ?
- if (Parameters.randomGenerator.NextDouble() < Parameters.mutationAddRate)
- {
- genome.Add(new MazeGene());
- }
- // Remplacement gène par gène ?
- foreach (MazeGene g in genome)
- {
- if (Parameters.randomGenerator.NextDouble() < Parameters.mutationsRate)
- {
- g.Mutate();
- }
- }
- }
- internal override double Evaluate()
- {
- fitness = Maze.Evaluate(this);
- return fitness;
- }
- }
- }
|