Prototype |
L’algorithme de Little
L’algorithme de Little est du type « séparation et évaluation » : on effectue un parcours en profondeur de l’arborescence binaire des choix possibles, en attribuant à chaque nœud une évaluation par défaut , et une valeur de regret à chaque choix auquel on renonce (évaluation par défaut du prix à payer pour renoncer à ce choix).On remarque tout d’abord que l’on ne change pas le problème en soustrayant un nombre quelconque à une ligne ou une colonne de la matrice des distances entre les villes (cela revient à soustraire cette distance à tous les circuits hamiltoniens). On appellera réduction de la matrice l’opération consistant à soustraire de chaque ligne le plus petit élément, puis à soustraire le plus petit élément de chaque colonne de la matrice ainsi obtenue.
L’évaluation par défaut associée à la racine de l’arborescence est la somme des nombres soustraits lors de cette réduction.
Chaque nœud de l’arborescence correspond à un choix (fait ou abandonné). L’évaluation par défaut associée à un nœud de type « choix fait » est la somme de l’évaluation par défaut associée au nœud père, et d’une évaluation par défaut du chemin restant à parcourir (obtenue par réduction de la matrice des liaisons encore possibles) ; il faut prendre soin d’éliminer les liaisons créant des circuits parasites, par exemple Nantes-Bordeaux si l’on a déjà choisi d’emprunter Bordeaux-Lyon et Lyon-Nantes).
Le regret associé à un choix abandonné est calculé de la façon suivante : si on renonce à une liaison , il faudra sortir de et entrer dans par d’autres liaisons ; la valeur de regret associée à est la somme du plus petit coût des liaisons et du plus petit coût des liaisons encore disponibles.
L’évaluation par défaut associée à un n\oe ud de type « choix abandonné » est la somme du regret et de l’évaluation par défaut du nœud père.
On parcourt l’arborescence en profondeur, en ignorant les nœuds dont l’évaluation par défaut dépasse la valeur d’un circuit hamiltonien déjà trouvé.
algorithme de Little : maxi = +inf s[racine] = ville de depart calculer e[racine] visiter la racine visiter un noeud n : SI e[n] <= maxi ALORS SI s[n] != ville de depart ALORS POUR toutes les liaisons s[n] -> v possibles calculer le regret de s[n] -> v FIN POUR soit s[n] -> v une liaison de regret maximal r créer les fils v et V de n s[v] = v calculer e[v] visiter v s[V] = s[n] e[V] = e[n] + r visiter V SINON maxi = max[maxi, e[n]) FIN SI FIN SI |