Sujet 5 : Voyageur de commerce - Kohonen

par Didier STRAUS et Julien GONY

Etude bibliographique:

Historique :

C'est au 19ème siècle que les mathématiciens ont commencés à s'intéresser au problème du Voyageur de commerce.

En 1949, on a trouvé une solution pour 49 villes.

En 1975, on a trouvé une solution pour 100 villes.

En 1987, on a trouvé une solution pour 2387 villes.

En 1998, on a trouvé une solution pour les 13509 villes des USA.

En 2001, on a trouvé une solution pour les 15112 villes d'Allemagne.

Source : http://sis.univ-tln.fr/~tollari/TER/AlgoGen1/node4.html

Ce problème est NP complet (Source: Algorithmes en langage C (Cours et exercices) page 659-660, Dunod, Robert Sedgewick). On ne connait pas actuellement d'algorithme de complexité polynomial capable de résoudre ce problème.

Principe :

Le voyageur de commerce doit passer par N villes (toutes les villes de sa tournée) et revenir à sa ville de départ en parcourant la plus petite distance possible. Pour résoudre ce problème, il suffit de choisir une ville puis d'essayer les (N-1) villes et pour chacune d'entre elles essayer les (N-2) villes (on effectue donc une recherche en profondeur d'abord). La complexité est factorielle : O(n!).

Variante du voyageur de commerce : On doit se rendre d'une ville de départ définie vers une ville d'arrivée définie, en passant par toutes les villes une seule fois. Toutes les villes ne sont pas reliées entre elles. Le voyageur peut aller d'une ville A vers une ville B uniquement s'il existe un chemin reliant de A vers B. Le problème est de trouvé, compte tenu des villes, du depart, de l'arrivée, et des chemins existants, s'il existe un parcours pour relié la ville départ à la ville d'arrivée en pasant une seule fois par toutes les villes.

Algo Génétique :

Ordinateur à ADN :

En 1994, un laboratoire américain avec le professeur Adleman a réussi a résoudre la variante du probleme du voyageur de commerce. L'idée, est d'utilisé les bases élémentaires A,C,T,G pour céer les villes, en utilisant le fait que les bases ont tendances à se coller ont peut ainsi créér des chemins. En se collant les bases crées les chemins, la force de l'ordinateur à ADN est que ces chemins sont créé en même temps, donc en parallele, c'est comme si sur notre ordinateur on pouvait généré tous les chemins possibles en parallele. Ensuite, il suffit d'éléminer les mauvaises combinaisons, on ajoutant une solution pour supprimer tous les chemins qui ne commencent pas par la ville de départ, puis de même pour la ville d'arrivée,...

Il y a plus d'informations sur les photocopies jointes.

Source : "Le calcul confié aux machines", Ellipses, Guillaume Watier.

 

Simulation informatique :

En informatique, on ne peut pas faire comme avec "l'ordinateur à ADN" et générer toutes les combinaisons possibles en parallèles. La solution est de s'inspirer l'évolution des espèces : on génère quelques combinaisons pour pouvoir commencer, puis on effectue des croisements entre ces combianisons pour créé de nouvelles tout en gérant la possibilité de mutation. Ensuite, on applique la sélèction naturelle : on applique un filtre, une loi que l'on a défini (cette loi doit permettre d'identifier les bonnes combinaisons. exemple : la premiere ville est bien la ville de départ, le parcours possède chaque visible une seule fois,...), on peut ainsi éliminer les mauvaises combinaisons. On regénère d'autres combinaisons par des croisements sur les combinaisons restantes, puis on applique une autre loi, ...

Ainsi, dans le temps, la qualité de notre échantillon augmente.

Source : http://www.limsi.fr/Individu/jps/enseignement/examsma/2003/ISRAEL_GAUCHOU/algo.html


Le programme :

Information générale

Pour résoudre le problème du voyageur de commerce avec un réseau de Kohonen, il faut adapter les couches d'entrées et de sorties au problème. La couche d'entrée est la carte géographique des villes. La couche de sortie (le réseau de neurones) est le parcours du voyageur. Les neurones seront reliés à leur voisin direct, et formeront une boucle (le premier est le voisin du dernier). Ainsi en parcourant le réseau de voisin en voisin, on obtiendra le parcours du voyageur de commerce.

Mode d'emploi

Ce programme requiert OpenGL, et math.h.

Compilation PC (Linux) :
gcc voyageur.c -o voyageur -L/usr/X11R6/include/GL -L/usr/X11R6/lib -lGL -lGLU -lglut -lm -lX11
pour windows dans l'éditeur de lien: -lopengl32 -lglu32 -lglut32

Compilation MacOSX :
gcc -framework OpenGL -framework GLUT -framework Cocoa -o voyageur voyageur.c

Utilisation : ./voyageur
Dans la fenêtre OpenGL, cliquer pour placer les villes (maximum de 50). Puis pour effectuer une itération de l'apprentissage appuyer sur la touche"p". Pour effectuer tout l'apprentissage, rester appuyé sur "p" jusqu'à stabilisation.

Fonctionnement

Les villes et neurones sont des coordonnées (x,y) comprises entre (-1,-1) et (1,1).
La première fois qu'on appuie sur "p", on initialise le réseau de neurones (autant de neurones que de villes sont créés), on les places en cercle.
Ensuite, à chaque fois qu'on appuie sur "p", on fera une itération d'apprentissage. C'est à dire, qu'on choisira une ville au hasard, puis on cherchera le neurone vainqueur (le plus proche de cette ville).
On déplacera ce neurone vers la ville, et il "tirera" ses voisins avec lui selon leur degré de voisinage (on mettra à jour leurs coordonnées).

Pour cela on a une fonction "eta", qui au début prend en compte un voisinage allant jusqu'au degré 6 (le degré 0 étant pour le neurone vainqueur).
Initialement, cette fonction est : "eta[7]={0.50,0.45,0.38,0.20,0.15,0.1,0.05};"
Puis on réduit la valeur de "rapprochement" par "eta[i]-=i*i*pas;" avec "pas = 0.0005".
Quand "eta[i]<=i*pas" (c'est à dire quand la valeur devient très petite), on réduit le voisinage en faisant eta[i]=0.
Ainsi les neurones auront de moins en moins d'effets sur leurs voisins.
Une fois qu'on a plus que eta[0] qui est différent de 0, donc seul le neurone vainqueur se rapproche, et que "eta[0]<=pas", on met eta[0]=1, pour que les neurones se positionnent directement sur les villes les plus proches.


Comparaison avec un Algo de recherche en profondeur :

Le programme n'arrive pas tout le temps à trouver une solution optimale.
Soit parce qu'il y a un croisement dans le parcours, soit parce que certains neurones ne sont pas sur une ville. Par conséquent, d'autres neurones "hésitent" entre plusieurs villes (ils sont au milieu de plusieurs villes).
Dans notre programme, il y a moins de 10% de neurones « hésitant », et très peu de croisements.[[INDIQUER LE NOMBRE D'ITERATION FAIT PAR LE PROGRAMME.]]
Pour remédier à ce dernier problème, il existe plusieurs solutions:
-Création de neurones près des neurones "hésitants" et suppression des neurones "immobiles"
-Suppression des croisements après la stabilisation
-Recherche en profondeur pour les villes restantes
-Dans le cas où un neurone est entre deux villes, et que sont voisin n’est sur aucune ville, il suffit de les placer chacun sur une des villes sans faire de croisement.

Avec un algorithmes de recherche en profondeur d'abord, la complexité est factorielle, on obtient le tableau ci dessous :

Nombre de villes
Nombre de possibilités

5

120
10
3628800
15
1307 milliards
30
26 E+31
60
83 E+80
100
93 E+156
400
64 E+867

Améliorations possibles du programmes :

Décroisez les villes, appliquer l'algo en profondeur (après application de Kohonen) sur les villes sans neurones, supression des neurones isolés, réinsertion dans la carte.


Valid XHTML 1.0!