// Constructeur avec deux parents (crossover et mutations)
        public TSPIndividual(TSPIndividual father, TSPIndividual mother)
        {
            /*On choisit un point de coupure aléatoirement, et on copie les villes avant ce point depuis
            * le premier parent. On parcourt ensuite le deuxième parent pour ne récupérer que les villes
            * non encore visitées, en conservant leur ordre. Enfin, on appelle l’opérateur de mutation.*/

            this.genome = new List <IGene>();
            // Crossover
            int cuttingPoint = Parameters.randomGenerator.Next(father.genome.Count); // Point de coupure du pere.

            foreach (TSPGene g in father.genome.Take(cuttingPoint))                  // Jusqu'au point de coupure.
            {
                this.genome.Add(new TSPGene(g));
            }
            foreach (TSPGene g in mother.genome)
            {
                if (!genome.Contains(g)) // Si le genome ne contient pas deja les villes.
                {
                    this.genome.Add(new TSPGene(g));
                }
            }

            // Mutation
            Mutate();
        }
 // Constructeur avec un parent (copie + mutations)
 public TSPIndividual(TSPIndividual father)
 {
     /*reconstruit un génome en faisant une copie des gènes un à un,
      * puis on appelle notre opérateur de mutation.*/
     this.genome = new List <IGene>();
     foreach (TSPGene g in father.genome)
     {
         this.genome.Add(new TSPGene(g));
     }
     Mutate();
 }
        public Individual getIndividual(String type, Individual father, Individual mother)
        {
            // Creation d'un individu à partir de deux parents.
            Individual ind = null;

            switch (type)
            {
            case "Maze":
                ind = new MazeIndividual((MazeIndividual)father, (MazeIndividual)mother);
                break;

            case "TSP":
                ind = new TSPIndividual((TSPIndividual)father, (TSPIndividual)mother);
                break;
            }
            return(ind);
        }
        public Individual getIndividual(String type)
        {
            // Creation dun individu aleatoirement.
            // Paramètre : le problème à résoudre sous la forme d’une chaîne & puis les parents potentiels.
            Individual ind = null;

            switch (type)
            {
            case "Maze":
                ind = new MazeIndividual();
                break;

            case "TSP":
                ind = new TSPIndividual();
                break;
            }
            return(ind);
        }