Sujet 3 Voyageur de commerce (**) Le problème du voyage de commerce est un problème algorithmique bien connu, et qui possède de nombreuses applications. Il consiste en la recherche d’un trajet optimal permettant à un voyageur de commerce de partir de chez lui, de parcourir plusieurs villes sans passer deux fois par la même ville et de revenir chez lui en un temps ou une distance minimal. De nombreuses méthodes ont été développées pour résoudre ce problème. Le présent projet de propose de mettre en oeuvre un algorithme génétique. 1 Génération de la feuille de route du voyageur Dans un premier temps, il faut se définir un ensemble de villes à parcourir et les placer sur une carte. Pour cela, on placera un ensemble de n villes repérées par leurs coordonnées 0 < x < 1, 0 < y < 1 sur une carte à deux dimensions. On supposera que le temps de trajet entre deux villes est proportionnel à la distance physique qui les sépare et que le voyageur habite la première des villes. • Écrire un programme qui génère aléatoirement les positions de n villes. On pourra utiliser la fonction rand du langage C. Les résultats seront stockés dans un tableau ordonné de x et un tableau ordonné de y. • Enregistrer ces positions dans un fichier et les visualiser avec Gnuplot. 9 Sujet 3. Voyageur de commerce (**) 2 Solution exacte La seule solution (ou presque) pour trouver exactement le trajet minimal est de calculer la distance associée à toutes les possibilités de trajet et de les comparer. Il s’agit cependant d’une solution coûteuse qui ne peut être mise en oeuvre que pour un nombre de villes faible. • Combien de trajets différents qui le font passer par un nombre de villes n avant de revenir chez lui le voyageur peut-il parcourir ? • Écrire un programme qui construit tous les trajets possibles, passant une seul fois par n 10 villes et le ramenant chez lui 1 . Chaque trajet sera représenté par un vecteur qui contient dans ! l’ordre le numéro des villes parcourues (par ex. chemin = (3, 1, 4, 0, 2) correspondra au trajet qui parcourt dans l’ordre les villes numéro 3, 1, 4, 0 puis 2). • Écrire une fonction qui permet de calculer la distance parcourue lors d’un trajet. Pour chaque trajet testé, mesurer et enregistrer la distance parcourue. • Retenir le trajet le plus court et le visualiser avec gnuplot. • En extrapolant le temps de calcul à des problèmes avec plus de villes, estimer le nombre maximal de villes que cette méthode peut traiter en moins de quelque minutes. 3 Algorithme génétique Lorsque le nombre de villes devient trop important, cette méthode ne peut plus être mise en pratique et il faut utiliser des méthodes alternatives et approchées. Un exemple est l’algorithme génétique. 3.1 principe Les algorithmes génétiques partent d’une population d’individus initiale et la font évoluer de manière aléatoire avec des critères de reproduction, d’évolution et de sélection dont le but est d’obtenir, génération après génération, des individus mieux adaptés aux contraintes extérieurs. Ici par exemple, on peut voir le problème de la manière suivante : – Population de départ : Un patron embauche un nombre initial de voyageurs et leur demande de parcourir la même liste de villes. Ne connaissant pas le chemin le plus court, il laisse chaque voyageur décider de son propre chemin. Au retour de tous les voyageurs, le patron fait un petit bilan et avant de lancer une nouvelle tournée, il peut décider d’effectuer un certain nombre d’aménagements.... De même, les voyageurs eux-mêmes peuvent décider de modifier leur trajet. – Sélection : Le patron peut par exemple décider de licencier le voyageur le plus lent qui consomme aussi le plus de carburant (voire plusieurs voyageurs) – Mutation : De peur d’être les suivants sur la liste, les voyageurs peuvent décider d’essayer un chemin légèrement différent de leur précédent (en intervertissant par exemple deux villes ou plus tirées au hasard). – Hybridation : Deux voyageurs peuvent aussi échanger des informations dans l’espoir d’améliorer leur temps de trajet. – Reproduction : Un nouveau voyageur peut être embauché et formé par certains des anciens (voire plusieurs). Après ces étapes, les voyageurs re-partent en tournée. Quand il reviennent, le patron re-fait le point, et le processus se répète ainsi un certain nombre de fois. Si les critères de sélection, mutation, hybridation, reproduction sont définis correctement, les temps de trajet des voyageurs diminuent cycle après cycle et convergent vers une solution que l’on espère être le chemin le plus court. Selon les critères, la convergence est plus ou moins rapide. 1. À ce stade, il ne sera pas nécessaire de se préoccuper de rejeter les trajets qui correspondent à d’autres trajets déjà testés, mais dans le sens inverse. 10 3.2 Travail • Définir une carte de n 10 villes (comme précédemment). • Définir une population initiale de np 10 voyageurs dont les trajets seront définis par autant de vecteurs de taille n. • Établir l’algorithme génétique suivant : – Le plus mauvais voyageur est éliminé. – Le meilleur voyageur conserve le même trajet. – Une nouvelle population est obtenue en faisant muter la population restante en échangeant deux villes de leur trajet choisies au hasard (un nouvel individu est aussi obtenu par la mutation du meilleur voyageur.) Avec ces règles, le nombre d’individus est conservé au fils des générations et le temps de parcours devrait diminuer itération après itération. • Tracer la distance minimale obtenue en fonction du nombre de générations utilisées. • Comparer les résultats obtenus avec cette méthodes à ceux de la méthode exacte. Comparer les temps de calcul. • Tester l’effet du nombre d’individus initial sur le nombre d’itérations nécessaires à converger vers un court trajet et sur le temps de calcul. • Essayer de changer les critères d’évolution. On pourra par exemple tenter de : – Obtenir des mutations plus efficaces en échangeant et en inversant l’ordre d’ensembles aléatoires de 2 villes consécutives (par exemple les villes 3-4 avec les villes 7-8 en échangeant 3 avec 8 et 4 avec 7). – Échanger plus de villes à chaque cycle – Définir des règles d’hybridation entre des individus sélectionnés parmi tous les voyageurs... – etc... 11