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œudOn 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
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
|


