def gen_deter(cls, carte):
     """
     Cette méthode ne doit être utilisée qu'a but de test
     Elle permet de generer toutes les permutations possibles
     depuis un chemin
     """
     # Population vide
     p = Population(0, 0)
     carte = Chemin.from_csv("test_coords.csv")
     # Liste de toutes les permutations de la carte
     for perm in permutations(carte):
         p.individus.append(Chemin.from_array(list(perm)))
     p.eval()
     return p
 def getpopulationInitiale(self):
     # Calcul de la taille de la population initiale
     nbVilles = len(self.carte.villes)
     if(nbVilles > 5):
         taillePopInitiale = 150
     else:
         taillePopInitiale = int(ceil(0.5*factorial(nbVilles)))
         
     # Generation de la population initiale
     popInitiale = []
     for i in range(0, taillePopInitiale):
         chemin = Chemin()
         chemin.setChemin(sample(xrange(nbVilles), nbVilles))
         popInitiale.append(chemin)
     return popInitiale
    def getpopulationInitiale(self):
        # Calcul de la taille de la population initiale
        nbVilles = len(self.carte.villes)
        if (nbVilles > 5):
            taillePopInitiale = 150
        else:
            taillePopInitiale = int(ceil(0.5 * factorial(nbVilles)))

        # Generation de la population initiale
        popInitiale = []
        for i in range(0, taillePopInitiale):
            chemin = Chemin()
            chemin.setChemin(sample(xrange(nbVilles), nbVilles))
            popInitiale.append(chemin)
        return popInitiale
 def test_crossover(self):
     c2 = Chemin(len(self.c))
     fils = self.c.crossover(c2)
     self.assertTrue(True)
     for ville in fils:
         if ville not in c2 and ville not in self.c:
             self.assertTrue(False)
 def test_eq(self):
     self.assertEqual(
         self.c,
         Chemin.from_array(
             [Ville(1, 2),
              Ville(1, 3),
              Ville(1, 4),
              Ville(1, 5)]))
 def __init__(self, nb_individus, nb_villes, csv=None):
     """
     Initialise une population de nbIndividus, chemins reliant nbVilles
     """
     # Permet de suivre l'évolution
     self.generation = 1
     self.individus = []
     # Pour recuperer la meilleure fitness, on doit être sur
     # que le premiere valeur qu'on evalueara sera inférieure
     # a meilleurFitness
     self.meilleurFitness = inf
     # Dictionnaire qui à chaque chemin associe sa longueur
     self.cache = {}
     # Membre de la population de distance la plus courte, inexistant a
     # l'initilisation
     self.meilleurChemin = None
     # Permet de creer une population vide
     if nb_individus == 0:
         return
     # generation de la population
     if csv is not None:
         carte = Chemin.from_csv(csv)
     else:
         # Creation de la carte, qui est un chemin dont l'ordre n'importe
         # pas, il sert de base a la
         carte = Chemin(nb_villes)
     # Melanger la carte
     shuffle(carte)
     self.individus.append(carte)
     # Tant qu'on a pas atteint le nombre d'individus cible
     while len(self.individus) < nb_individus:
         # On choisit une permutation aléatoire de la carte
         perm = Chemin.from_array(sample(carte.liste_villes, len(carte)))
         # Si elle n'est pas déjà présente dans la population
         # on l'y ajoute.
         if perm not in self.individus:
             self.individus.append(perm)
     # Evaluation de la population
     self.eval()
 def setUp(self):
     self.c = Chemin.from_array(
         [Ville(1, 2), Ville(1, 3),
          Ville(1, 4), Ville(1, 5)])
 def test_from_array(self):
     l = [Ville(1, 2), Ville(1, 3), Ville(1, 4), Ville(1, 5)]
     ch = Chemin.from_array(l)
     self.assertEqual(ch.liste_villes, l)
from Chemin import Chemin
from Ville import Ville
from csv import reader
from math import inf
from itertools import permutations
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

coords = []
with open('coords.csv', 'r') as f:
    r = reader(f)
    for x in r:
        coords.append(Ville(int(x[0]), int(x[1])))
carte = Chemin.from_array(coords)

chemins = []

score = inf
best = None


def toPlot(c):
    x = []
    y = []
    for coo in c:
        x.append(coo.x)
        y.append(coo.y)
    return x, y


# Generation de tout les chemins possibles
while True:
    # Crossover de la population
    algo.crossovers(population)

    # Mutation de la population
    algo.mutation(population, carte)

    # Evaluation de la population
    algo.evaluation(population)

    # Passage a la generation suivante
    population = algo.generationSuivante(population, carte)

    # Enregistrement des resultats dans un graphe
    couleur = "#%06x" % randint(0, 0xFFFFFF)
    Chemin.tracerChemins(carte, population, "results/etape" + str(i) + ".png",
                         couleur)

    # Enregistrement des statistiques de la génération pour le graphe final (Moyenne de la longueur réelle des chemins dans la population)
    j = 0
    result = 0
    print "\nETAPE"
    for chemin in population:
        print chemin.calculDistanceReelle(carte)
        result = result + chemin.calculDistanceReelle(carte)
        j = j + 1
    results.append(result / j)

    # Passage à l'étape suivante
    i = i + 1
    if i > 7:
        break
Exemple #11
0
while True:
    # Crossover de la population
    algo.crossovers(population)

    # Mutation de la population
    algo.mutation(population, carte)

    # Evaluation de la population
    algo.evaluation(population)

    # Passage a la generation suivante
    population = algo.generationSuivante(population, carte)

    # Enregistrement des resultats dans un graphe
    couleur = "#%06x" % randint(0, 0xFFFFFF)
    Chemin.tracerChemins(carte, population, "results/etape" + str(i) + ".png", couleur)

    # Enregistrement des statistiques de la génération pour le graphe final (Moyenne de la longueur réelle des chemins dans la population)
    j = 0
    result = 0
    print "\nETAPE"
    for chemin in population:
        print chemin.calculDistanceReelle(carte)
        result = result + chemin.calculDistanceReelle(carte)
        j = j + 1
    results.append(result / j)

    # Passage à l'étape suivante
    i = i + 1
    if i > 7:
        break