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