These Chap 4 (TSP)
These Chap 4 (TSP)
1
initiales TSPTW (Traveling Salesman Problem with Time Windows). D'autres contraintes peuvent
aussi faire dépendre le temps de trajet entre deux endroits (c'est à dire la distance d) de l'heure à
laquelle le trajet est effectué. Cette formulation rend bien compte des situations d'embouteillages
autour des grandes villes le matin et le soir.
•= Si l'on considère que le voyageur de commerce est en fait un transporteur qui peut à chaque endroit
prendre et déposer de la marchandise (les pickup and delivery problems), on est amené à rajouter deux
types de contraintes. D'une part des contraintes de précédences (aller chercher la marchandise avant de
la livrer), et d'autre part des contraintes de capacité vérifiant que l'on est bien physiquement capable de
transporter toutes les marchandises. Ceci peut éventuellement interdire des trajets qui commenceraient
par procéder à tous les enlèvements avant de faire la moindre livraison.
On traitera dans ce chapitre de la résolution du TSP pur et de la prise en compte d'éventuelles fenêtres de
temps. Le TSPTW est en effet particulièrement intéressant puisqu'il est à mi-chemin entre un TSP et un
problème d'ordonnancement disjonctif. Si toutes les fenêtres de temps sont égales à [0, M], on obtient le
TSP pur, et si les distances dij ne dépendent que de i (ce qui peut correspondre à un temps de visite au
noeud i et un temps de trajet nul entre i et j), on retrouve un job-shop à une machine. Il y a donc un
continuum entre le TSP auquel on ajoute des fenêtres de temps et l'ordonnancement disjonctif auquel on
ajoute des temps d'adaptation de la ressource entre le traitement de deux tâches successives.
Mentionnons enfin qu’il existe de nombreuses autres variantes du TSPTW, suivant ce que l’on cherche à
optimiser : au lieu de chercher à minimiser la date de fin, on peut vouloir minimiser une distance
géographique (on n’additionne que les temps de parcours et on ignore les temps d’attente), ou bien
minimiser la somme des temps d’attente. On peut aussi autoriser le tour à ne pas commencer en 0 au
dépôt, mais un peu plus tard afin de pouvoir réduire certains temps d’attente intermédiaires.
∀i, x = 1, ∀j, x =1
j ij i ij
∀S ⊂ V, S ≠ ∅, x ij ≥2
i ∈S, j∉S
∀i, j, x ij ∈{0,1}
Les deux premières contraintes traduisent le fait que le degré sortant (resp. entrant) d’un noeud dans un
circuit vaut 1, la troisième contrainte interdit les solutions composées de sous-tours disjoints. Enfin, on
impose aux variables xe de représenter des valeurs Booléennes. Remarquons enfin dans cette modélisation
linéaire que si l'on omet la contrainte sur le degré sortant des noeuds (∀i, j xij = 1), le problème revient à
trouver un arbre couvrant de poids minimal (ce problème est polynomial). On montrera (§ 4.3.4) comment
utiliser cette relaxation du problème pour obtenir des bornes inférieures de grande qualité.
Si l'on veut rajouter des fenêtres de temps, la formalisation linéaire s'étend facilement en représentant la
date de visite de chaque nœud i par une variable ti . Le problème devient alors :
2
min dij xij
i, j
∀i, x = 1, ∀j, x =1
j ij i ij
∀S ⊂ V, S ≠ ∅, x ij ≥2
i ∈S, j∉S
∀i, j, x ij ∈{0,1}
t depot = 0, ∀i, j, t j ≥ ti + xij d ij
∀i, ai ≤ ti ≤ bi
3
problèmes symétriques pour lesquels le branch and bound est peu efficace (à cause de la piètre qualité
de la borne inférieure linéaire). Ces algorithmes permettent la résolution de problèmes de TSP jusqu'à
un millier de villes et de TSPTW de l'ordre de quelques centaines à un millier de villes.
et la valeur du tour optimal est f({1,.., n}, 0). Le calcul du tour optimal nécessite de stocker n2n valeurs de
f (on est en effet amené à considérer les 2n parties de {1,.., n} pour le premier argument et toutes les
valeurs de {1,.., n} pour le second). L'utilisation astucieuse de la formule de récurrence permet a ainsi
permis de diminuer la complexité par rapport à une énumération naïve des n! solutions possibles). Si l’on
stocke ces valeurs dans un tableau d’entiers, en utilisant un codage binaire (par vecteur de bits) de S,
alors, on peut remplir le tableau en le parcourant par index croissants (le codage étant croissant pour
l’inclusion d’ensembles, quand on veut remplir f(S,x), les valeurs de f pour tous les sous ensembles de S
ont déjà été calculées et on peut appliquer la formule de récurrence).
Cet algorithme peut se généraliser aisément au cas du TSPTW. Par exemple, si l'on minimise le temps
total de parcours, on dénote par f(S,x) le temps minimal pour partir du dépôt, visiter tous les sommets de S
et terminer en x. On peut alors modifier la formule de récurrence comme suit :
4
max(a x ,d(0, x)) si d(0, x) ≤ bx
f (∅, x) = +∞ sinon
4.3 Contraintes
On s'intéresse à la résolution du TSP en programmation par contraintes. La première constatation que l'on
peut faire est que les contraintes arithmétiques classiques sur les domaines finis (+, ×, =, ≠, min/max, etc.)
ne permettent pas d'exprimer simplement la configuration de cycle Hamiltonien. Les systèmes usuels ont
donc été amenés à introduire des contraintes globales spécialisées pour ces situations : on a ainsi cycle
dans CHIP [BC 94] et IlcPath dans ILOG SOLVER. Nous allons proposer une technique d'implémentation
de ces contraintes globales.
4.3.1 Modélisation
Alors que dans la formulation linéaire, une solution au TSP est un ensemble d’arêtes vérifiant toute une
série de contraintes additionnelles, la programmation par contraintes, plus expressive, permet
d’incorporer une partie de ces contraintes (par exemple celles sur le degré sortant des noeuds) dans la
formulation même du problème. Ainsi, on orientera le tour et on modélisera une solution au TSP par une
relation Next : V∅V associant à chaque sommet son successeur immédiat. Next doit ainsi vérifier
certaines contraintes additionnelles :
•= Next est bijective. Si l’on duplique l’ensemble des sommets pour considérer la relation Next dans un
graphe biparti, cette contrainte affirme que Next est un couplage dans un graphe biparti. La
propagation simple de cette contrainte consiste, après chaque affectation Next(x):=y à retirer y de tous
les domaines de Next(z) pour z≠x.
•= Next ne contient pas de cycle de longueur inférieure à n : Ainsi, quand une chaîne x1,...,xk a été
construite pour Next, on retire x1 du domaine de Next(xk). Un algorithme de propagation de cette
contrainte d'élimination de sous-cycles est proposé dans [CL 97b].
Dans le cas du TSPTW, on peut envisager d'autres modélisations inspirées du problème
d'ordonnancement disjonctif.
•= On peut modéliser le problème comme un problème d'ordonnancement de tâches dont les durées
représentent le temps de trajet depuis la tâche précédente. Les durées ne sont donc plus des données,
5
mais dépendent de la solution. Pour appliquer des règles de coupe dérivées de celles des intervalles de
tâches, on est amené à estimer ces durées, c'est à dire évaluer des bornes inférieures des temps de
trajets entre un nœud et ses prédecesseurs potentiels. Ces règles de propagation peuvent ensuite être
utilisées à l'intérieur d'un arbre de recherche binaire raisonnant sur l'ordre respectif de deux tâches
dans le tour.
•= Une troisième solution consiste à reprendre le modèle de séquence [Zh 97] où l'on choisit d'affecter à
une tâche une position dans le tour. Pour ce modèle, on peut décrire des règles similaires à celles du
modèle d'ordonnancement (avec la même difficulté liée à l'estimation de la durée d'une tâche).
Le modèle le plus adapté dépend du type de données. Quand le problème est dominé par les contraintes
temporelles, il vaut mieux utiliser le schéma de branchement inspiré du job-shop. Dans certains cas, où ni
l'aspect temporel ni l'aspect géographique ne domine, le modèle par séquence peut être le plus intéressant.
Dans les autres cas du TSP pur, ou d'un TSPTW avec quelques contraintes temporelles (ce qui semble
être le cas le plus réaliste), le modèle issu des couplages est le plus adapté au problème.
Parmi les techniques de résolution des problèmes de couplages bipartis (décrites au chapitre 2), on retient
l'utilité de maintenir une relation redondante symétrique Prev : V∅V (Celle-ci est en particulier
indispensable pour le cas où les distances sont asymétriques) et l'évaluation d'une borne inférieure de la
longueur du tour, LB, en sommant les distances de chaque nœud à son plus proche voisin. Cette borne
inférieure permet d’éliminer certaines arêtes du graphe (les arêtes ij telles que dij - best(i) ≥ UB - LB). On
gardera aussi le terme correctif sur cette borne permettant de prendre en compte à l'avance les regrets qui
feront augmenter la borne. Enfin, on sélectionnera les points de choix par un critère mixte qui considère
le regret pour les domaines de cardinalité importante et le first-fail pour ceux de cardinalité faible.
L’ensemble de ces techniques directement issues de la modélisation du TSP comme un problème de
couplage ne permettent de résoudre que des problèmes jusqu’à 12 ou 15 noeuds. La contrainte
d’élimination des sous-tours, qui fait la particularité du TSP par rapport au problème des couplage est en
effet trop peu propagée.
6
•= "edge finding" limité à deux tâches :
y + d(y, x) > x y ∈after(x)
Des règles similaires impliquent les relations symétriques (prev, before). L'ensemble de ces règles de
propagation relativement simples peuvent être enrichies d'autres règles de propagation globales, plus
complexes, que nous décrivons dans les paragraphes qui suivent.
7
Une première idée pour renforcer encore cette borne serait de calculer de manière exacte la valeur du
couplage optimal dans le graphe. Ceci peut être fait avec une complexité faible en utilisant la méthode
Hongroise incrémentale [CL 97b]. Ces trois bornes associées à la relaxation du TSP en un problème de
couplage parfait de poids minimal fournissent des résultats irréguliers suivant la distribution des données.
Dans le cas d'une distance symétrique, le couplage optimal a tendance à contenir de nombreux cycles
élémentaires à deux éléments : si x est le plus proche voisin de y, y a de bonnes chances d'être le plus
proche voisin de x, et donc le couplage optimal a de fortes chances de contenir le cycle xyx, ce qui
l'éloigne d'un cycle Hamiltonien, et donc la borne inférieure peut être de piètre qualité [BT 86]. Une autre
situation dans laquelle la relaxation du couplage peut fournir une borne imprécise se produit lorsque les
villes sont réparties géographiquement par agrégats (clusters). Dans ce cas, chaque ville a une voisin très
proche, et le couplage optimal ne tient compte que de ces distances locales, en oubliant que les distances
(plus importantes) entre agrégats devront aussi être parcourues puisqu’on ne veut pas un tour par agrégat,
mais un seul et unique tour.
Pour toutes ces raisons, on cherche à disposer d'une autre borne inférieure, plus robuste par rapport aux
distributions de données. C'est l'objet du paragraphe suivant qui explore les relaxations en problèmes
d'arbre couvrant de poids minimum.
8
construit, pour un sommet s fixé, une arborescence de racine s de poids minimal (notée s-MSA). Le
principe de construction ressemble à un algorithme glouton: on fixe le sommet racine s, et on part d’un
ensemble d’arêtes F=∅. On considère successivement les n-1 sommets y ≠ s et l’on ajoute à F l’arc xy de
poids minimal. On obtient un graphe orienté (V,F) couvrant tous les sommets, mais qui n’est pas
forcément une arborescence (auquel cas, il n’est pas connexe non plus). En effet, il se peut que l’addition
de sommets ait créé des cycles. On va transformer ce graphe petit à petit en une arborescence en ouvrant
un à un les cycles.
Plus précisément, soit µ un cycle dans (V,F), on construit à partir de G=(V,F) un graphe contracté
G’=G/µ=(V’,F’) dans lequel on a remplacé le cycle µ par un seul sommet. On étend la distance de G à G'
en posant :
•= d’(x,y) = d(x,y) si xy n’est pas un arc entrant dans µ=
•= d’(x,y) = d(x,y) - d(z,y) où z est le prédécesseur de y dans µ sinon.
(on fait cette modification pour avoir d(F) = d’(F’) + d(µ)). L’ensemble d’arêtes F’ dans le graphe
contracté contient ainsi un cycle de moins que F. Après une série de telles transformations, on obtient une
s-MSA F(k) pour un graphe contracté G(k) et cette arborecence est de poids minimal.
On revient ensuite progressivement au graphe de départ G par une suite de s-MSA dans les graphes G(k) en
expansant progressivement les cycles que l’on avait contracté : On commence avec l’arborescence
A(k) = F(k). Supposons ensuite qu’entre G(k-1) et G(k), on ait contracté un cycle µ en un noeud α, soit αβ
l’arc partant de α sélectionné dans A(k), cet arc correspond à yβ dans le graphe F(k-1) . On obtient alors A(k-1)
à partir de A(k) en expansant le noeud α ainsi: on garde tous les arcs de µ sauf xy. A(k-1) est alors une s-MSA
dans le graphe G(k-1). On expanse ainsi tous les cycles, jusqu’à obtenir une arborescence couvrant A(0) dont
on peut prouver qu’elle est de poids minimal:
( k) ( i)
d (µ i )
(0) (k )
d(A )= d (A )+ i
où µi est le cycle qui a été contracté entre G(i) et G(i+1). On peut donc se passer des phases d’expansion si
on ne cherche que la valeur de la s-MSA. La complexité de cet algorithme est en O(mn).
On pourrait calculer la valeur de la s-MSA pour tous les sommets racine s. En fait, on préfère procéder à
un calcul pour le graphe des domaines de la relation next et un calcul pour le graphe des domaines de la
relation prev, ce qui correspond aux deux orientations possibles de l'arborescence. On va voir de manière
expérimentale que cette borne permet de diminuer grandement la taille des arbres de recherche
développés, mais que son coût en temps annule le gain en taille de l'arbre de recherche. L'application de
relaxation Lagrangienne au calcul de s-MSA va permettre d'affiner grandement la borne au prix d'un
surcoût faible en temps de calcul et va ainsi améliorer substantiellement les performances de l'algorithme
de résolution.
9
où δi est le degré sortant de i moins 1. Le vecteur δ des excès de degré sortant forme un sous-gradient. On
va ensuite faire évoluer les multiplicateurs de Lagrange en donnant des pénalités positives aux sommets
de fort degré sortant dans le MST et en donnant des pénalités négatives aux feuilles du MST. Ces pénalités
visent à rendre le MST plus “filiforme”, et on remarquera ici l’analogie avec le calcul du terme correctif
de la borne supérieure du couplage de poids minimal par prise en compte à l'avance de regrets. Pour la
mise à jour des multiplicateurs, on suit la méthode proposée par Beasley [Bea 93] : on pose
δi
π i := π i + α (UB − LB)
δ i2
où α est un facteur de l’ordre de l’unité qui décroît avec le temps, UB est une borne supérieure et LB une
borne inférieure. Le principe de cette marche ressemble à du recuit simulé: on avance à grands pas tant
qu’on est loin de l’optimum, puis à mesure qu’on s’en rapproche, on diminue ses pas. LB est réactualisé à
chaque nouvelle solution trouvée pour le problème paramétrique de MST. Ces paramètres demandent à
être réglés de manière fine pour que les multiplicateurs convergent rapidement non loin de l’optimum (en
particulier, si l'on veut utiliser cette borne inférieure à chaque nœud d'un arbre de recherche, il faut
converger vers une bonne solution en peu d'itérations).
10
manière naïve la contrainte de couplage, le second y ajoute la modélisation symétrique et les bornes
symétriques, l'utilisation du regret, le troisième ajoute aux bornes inférieures le terme correctif lié au
regret, et vérifie la contrainte redondante de connexité forte. Le quatrième parcourt un arbre de décision
binaire. Enfin, le dernier intègre tous ces composants et y ajoute le calcul d'une arborescence de poids
minimal comme borne inférieure.
cl 10 cl 13 cl 15 gr 17 cl 20 gr 21
PPC naïve 2.3 kb. 9.2 kb. 120 kb. 28.9 Mb. 7.6 Mb. 21.3 Mb.
0.3 s. 2 s. 16 s. 3.5 ks. 1.1 ks. 3 ks.
PPC 1.8 kb. 8.7 kb. 44.2 kb. 315 kb. 676 kb. 180 kb.
"couplage symétrique" 0.3 s. 1.5 s. 8 s. 85 s. 165 s. 44 s.
Propagation complète 146 b. 717 b. 2.4 kb. 12.7 kb. 65 kb. 14.1 kb.
0.1 s. 0.5 s. 1.9 s. 12 s. 67 s. 14 s.
Propagation complète 118 b. 583 b. 2 kb. 5.8 kb. 27 kb. 12.5 kb.
et arbre binaire 0.07 s. 0.2 s. 0.9 s. 3.1 s. 15 s. 7 s.
Idem + s-MSA 112 b. 553 b. 1.7 kb. 5.5 kb. 24.2 kb. 12.3 kb.
0.07 s. 0.3 s. 1 s. 3.5 s. 18 s. 9 s.
Le meilleur de ces algorithmes (celui faisant une propagation complète et parcourant un arbre binaire)
peut résoudre des problèmes jusqu'à une trentaine de nœuds. On donne à titre d'exemple dans le tableau 4-
2 la résolution de huit problèmes entre 20 et 29 nœuds, avec ou sans fenêtres de temps (les 4 premiers
proviennent de TSPLIB, les suivants sont issus d'un problème de tournées [So 87],[PGPR 96]). On
remarquera que les fenêtres de temps, en contraignant plus le problème, facilitent sa résolution (le
phénomère inverse se produit pour les approches linéaires).
Enfin, le tableau 4-3 illustre l'efficacité de l'utilisation de la relaxation Lagrangienne comme technique de
borne inférieure (les problèmes résolus sont encore issus de TSPLIB [Rei 94]). Dans ce cas, on peut avoir
intérêt à changer de schéma de branchement pour sélectionner en priorité les sommets dont le degré
sortant est le plus fort dans la MSA. Choisir l'arête incidente concernant ce sommet permet non seulement
d'améliorer la qualité de la borne inférieure au calcul suivant de MSA, mais cette stratégie conduit aussi à
obtenir des solutions (des MSA qui sont en fait des chaînes Hamiltoniennes) beaucoup plus tôt dans
l'arbre. Ceci permet de limiter la profondeur de l'arbre de recherche parcouru.
11
bayg29 dantzig42 att48 hk48 brazil58 st70
PPC avec une borne inf. 4 b. 46 b. 60 b. 127 b. 42 b. 172 b.
de relaxation Lagrangienne 14 s. 437 s. 180 s. 330 s. 1.1 ks. 3.3 ks.
12
4. Sélection gloutonne d'arêtes. Il s’agit d’un algorithme glouton classique, où l’on sélectionne les
arêtes une à une, sans nécessairement avoir une chaîne à tout moment. On commence donc par l’arête
de poids le plus faible, puis l’on sélectionne l’arête de poids minimal qui ne crée pas de sous-cycle, et
ainsi de suite. Cette procédure devient un peu plus complexe dans le cas de graphes non complets: on
doit alors faire un peu de backtracking.
Le tableau 4-4, obtenu à partir des résultats de [Rei 94], présente une comparaison des ces différentes
procédures heuristiques sur de très grands problèmes (les chiffres sont donc un peu pessimistes pour les
tailles de problèmes qui nous intéressent).
Il existe encore bien d’autres heuristiques basées sur des méthodes géométriques spécifiques à la distance
considérée et utilisant par exemple l’enveloppe convexe des points, ou une triangulation de l'espace ou
encore utilisant l’arbre couvrant de poids minimal, etc.
Dans le cadre du TSPTW, l'application de ces procédures devient beaucoup plus problématique. Le
problème de la satisfiabilité (trouver un circuit admissible) peut devenir difficile, et ces méthodes ne sont
plus toujours à même de produire une solution (elles peuvent s'arrêter en échec si elles n'arrivent plus, par
exemple, à insérer une tâche pour des raisons de contraintes temporelles). D'autre part, les bonnes
solutions du TSPTW peuvent être éloignées des bonnes solutions au problème de TSP dans lequel on a
relaxé les contraintes temporelles : il devient ainsi beaucoup plus difficile de trouver des critères
pertinents pour guider la construction incrémentale du tour. On a en effet deux objectifs qui peuvent être
contradictoires : d'une part, produire un tour admissible, c'est à dire une séquence des villes compatible
avec les fenêtres de temps et d'autre part, produire un tour de faible longueur totale, c'est à dire une
séquence basée sur les relations de proximités géographique. On est donc amené à privilégier les
insertions qui non seulement n’augmentent pas trop la longueur du cycle partiel, et aussi qui n'engendrent
trop de temps d’attente. Il est ainsi parfois difficile de juger de la pertinence d'une insertion dans un tour
partiel au regard de ces deux critères parfois antagonistes (on verra au chapitre 7, comment la recherche
LDS permet de résoudre de tels conflits).
13
4.5.1 Déplacements
Les transformation les plus simples qui permettent de transformer un tour en un autre tour sont basées sur
les procédures gloutonnes précédentes, en utilisant le mécanisme d'insertion en avant et en arrière. A
partir d'un tour donné, on peut obtenir une famille d'autres tours proches en supprimant un sommet (ou
une arête) et en cherchant à le réinsérer ailleurs dans le tour. Ces transformations sont appelées le
déplacement de sommet (ou d'arête). On peut ainsi chercher par une passe en O(n2) s'il existe un
déplacement de sommet qui diminue la longueur du tour et par une passe en O(mn) s'il existe un
déplacement d'arête améliorant le tour.
14
Figure 4-2: la transformation de la procédure 3-opt
conservant l'orientation des sous-chaînes
On peut définir les voisinages k-opt pour k arbitrairement grand. En pratique, on ne fait de l'exploration
systématique de voisinage que pour n ≤ 3. Le paragraphe suivant décrit une méthode pour faire une
exploration partielle de voisinages correspondant à des valeurs supérieures de k.
Le point-clé est de remarquer qu’on peut alors ordonner les i de sorte que pour toutes les sommes
partielles Sl soient strictement positives
l
Sl = (dei − d f i )
i =1
L’algorithme consiste alors à partir d’un sommet x’ dans le tour, à remplacer l’arête e1=xx’ qui arrive sur
x’ par une autre f1 =yx’ plus courte (d(f1) < d(e1)), puis à remplacer l’arête e2=yy’ qui part de y dans le
tour par une autre f2 =zy’ telle que d(f1) + d(f2) < d(e1) + d(e2) et ainsi de suite. On intègre généralement à
cette recherche un peu de backtracking pour les deux premiers niveaux de choix (y et z). On peut aussi
vouloir contrôler la complexité de cette recherche en limitant le nombre total k d’arêtes remises en jeu
(par exemple, si l’on ne veut que du 2-opt, ceci revient à imposer que x=z).
Le tableau 4-5 résume une comparaison faite dans [Rei 94] de plusieurs procédure d’optimisation locale
sur une série de très grands problèmes. La méthode de Lin et Kernighan est de très loin la meilleure et
fournit des solutions de qualité remarquable.
15
méthode d’optimisation locale distance moyenne à l’optimum
LK 1%
LK (limité à 2-opt et DS) 2%
3-opt 4%
2-opt et DS 6%
déplacement de sommet (DS) 8,5%
2-opt 9%
déplacement d’arêtes 10%
Tableau 4-5 : comparaison de méthodes d'optimisation locale pour le TSP [Rei 94]
Comme on l'a mentionné, les performances des procédures d'optimisation locale se dégradent en présence
de fenêtres de temps. De manière générale, l'optimisation locale se combine mal avec les contraintes
supplémentaires. D'une part, il devient nécessaire de tester la satisfiabilité des contraintes pour chaque
mouvement, ce qui peut être long. D'autre part, comme de nombreuses solutions du voisinage deviennent
irréalisables, l'algorithme est plus rapidement "piégé" dans des optima locaux.
4.6 Bilan.
En résumé, le problème du voyageur de commerce est aujourd'hui un problème bien connu, pour lequel
on dispose de bonnes procédure heuristiques, et d'excellentes techniques d'optimisation locale
(Lin & Kernighan) et de bornes inférieures (Held & Karp). Il est donc relativement aisé de fournir
rapidement un bon encadrement de l'optimum.
Pour le cas de problèmes asymétriques, la relaxation en un problème d'affectation bijective (en relachant
les contraintes d'élimination de sous-tours) fournit d'excellentes bornes inférieures qui peuvent être
utilisées dans le cadre d'une optimisation en branch&bound sur des problèmes de grande taille.
Le cas symétrique est beaucoup plus difficile. Pour les petits problèmes, jusqu'à 10-15 nœuds, la
programmation dynamique et la programmation par contraintes sont deux techniques simples à mettre en
œuvre, robustes aux contraintes supplémentaires, et qui fournissent de bons résultats. Si l'on veut résoudre
très rapidement de tels petits problèmes (ce peut être le cas comme nous le verrons au chapitre 7 pour
l'optimisation individuelle des routes dans un grand problème de tournées), la programmation par
contraintes est la méthode la plus rapide.
Pour les problèmes jusqu'à 30 nœuds, une approche soignée par contraintes permet la résolution aisée de
problèmes avec ou sans contraintes additionnelles. Pour les problèmes entre 30 et 70 nœuds, la
programmation par contraintes peut s'appliquer si on lui adjoint un calcul de borne inférieure utilisant le
relaxation Lagrangienne. Jusqu'à 100 nœuds, on peut encore utiliser la programmation par contraintes et
la relaxation Lagrangienne dans un parcours partiel de l'arbre de recherche, pour trouver de bonnes
solutions (non nécessairement optimales).
Au delà de 100 nœuds, il faut utiliser soit les méthodes linéaires (branch & cut) si l'on souhaite un
résultat exact soit les techniques d'optimisation locale si l'on cherche seulement une bonne solution.
16
17