Problème du plus court chemin : Algorithmes et complexité

publicité
Problème du plus court chemin :
Algorithmes et complexité
MSE3211A: Flot et Routage
(d’après Ahuja, R.K., T.L. Magnanti and J.B. Orlin, Prentice Hall, 1993,
et d’après les notes des cours de L.A. Wolsey et F. Vanderbeck )
Last update: January 10, 2011
Gautier Stauffer, MAB, Bur. A33:358, Email [email protected]
PROBLÈME DU PLUS COURT CHEMIN
Dans un réseau orienté avec des arcs de longueur connue,
trouver un chemin de longueur minimale entre s et tous les
autres noeuds.
INTÉRÊTS:
capture tout l’aspect optimisation du flot dans un réseaux;
nombreuses applications directes, et apparait souvent
comme sous problème de problèmes plus complexes;
relativement facile mais nécessite beaucoup d’ingéniosité
pour développer des algo très rapides (problème de
grande taille ou sous-problème résolu de nombreuses
fois).
PROBLÈME DU PLUS COURT CHEMIN
HYPOTHÈSES:
cij ≤ C entier
pour tout (i, j)
∃ un chemin orienté de s vers tout autre noeud i
Le graphe est orienté
Le réseau ne contient pas de cycle de coût négatif.
CAS GENERAL:
Détecter la présence d’un cycle de coût négatif (facile).
Si ∃, il est difficile de trouver un plus court chemin.
Détecter la présence d’un cycle de coût négatif:
un problème intéressant en soi
PROBLÈME DU PLUS COURT CHEMIN
On a déjà vu qu’un chemin de s à i peut s’intereprêter comme un flot.
En sommant tous les flots liés aux plus courts chemins de s à i pour
tout i 6= s, on obtient un flot satisfaisant les contraintes suivantes :

X
X
n−1 i =s
(1)
xj i =
xi j −
−1 i 6= s
j∈N
j∈N
xi j
≥
0
pour tout (i, j)
Vice-versa si on résoud le problème suivant, on peut retrouver les plus
courts chemins de s à tous sommet de G par le théorème de
décomposition des flots.
X
min
ci j xi j
(2)
(i,j)∈A
X
j∈N
xi j −
X
xj i
=

xi j
≥
0
j∈N
n−1
−1
i =s
i 6= s
pour tout (i, j)
(3)
PROBLÈME DUAL
minimiser la distance de s à tous les autres noeuds
X
ci j xi j
min
(i,j)∈A
X
xj i −
X
xi j
=

xi j
≥
0
j∈N
j∈N
1−n
1
i=s
i 6= s
(4)
pour tout (i, j) ∈ A
DUAL (MODÈLE DES FICELLES)
di = distance au noeud i (ou de s à i si on pose ds = 0).
X
(di − ds )
max
i6=s
dj − di
≤
ci j
pour tout (i, j) ∈ A
=
> Preuve d’optimalité
Si x ∗ est réalisable, d ∗ est un vecteur de distances associé à la solution x ∗ , et d ∗ est
dual réalisable, alors x ∗ et d ∗ sont optimaux. NB: Les solutions de base du problème
primal sont des arbres (orientés de s vers tous les autres sommets). La solution duale
associée satisfait dj − di = cij pour tous les arcs de l’arbre.
PRINCIPE D’OPTIMALITÉ
Propriété:
Si le plus court chemin PAB de A à B passe par le noeud C, alors la portion
PAC est un plus court chemin de A à C (sans quoi . . . contradiction).
Conséquences:
Arbre des plus courts chemins de s vers tout autre noeud
Proposition (des arcs tendus)
Si di représentent les longueurs de plus court chemin de s à i, alors Ps,k est
un plus court chemin de s à k ssi
dj = di + cij
pour tout (i, j) ∈ Ps,k
(= conditions de complémentarité de la dualité)
PRINCIPE D’OPTIMALITÉ
Proposition (des arcs tendus)
Si di représentent les longueurs de plus court chemin de s à i, alors Ps,k est
un plus court chemin de s à k ssi
dj = di + cij
pour tout (i, j) ∈ Ps,k
(= conditions de complémentarité de la dualité)
Preuve: Soit Ps,k ≡ (s = i1 , i2 , . . . , il = k ).
Ps,k = plus court chemin =
> dj = di + cij ∀(i, j) ∈ Ps,k .
En effet, si dik > dik −1 + cik −1 ,ik , alors l’étiquette dik ne représente pas le
longueur du plus court chemin jusqu’à ik et peut être amélioré en
prenant la longueur de la portion de chemin Ps,ik . Si, au contraire,
dik < dik −1 + cik −1 ,ik , alors Ps,ik n’est pas un plus court chemin jusqu’à ik .
dj = di + cij ∀(i, j) ∈ Ps,k =
> Ps,k = plus court chemin.
En effet, longueur de Ps,k =
cs,i2 + ci2 ,i3 + . . . + cil−1 ,il = dil − ds = dk
|{z}
|{z}
| {z }
di −ds
2
di −di
2
3
di −di
l
l−1
CONDITIONS D’OPTIMALITÉ
Theorem
Si les di représentent des longueurs de chemins orientés de s à i, pour tout i,
alors di représentent des longueurs de plus courts chemins de s à i ssi
dj ≤ di + cij
pour tout (i, j) ∈ A
(conditions d’optimalité du primal = réalisabilité du dual)
PREUVE:
conditions nécessaires:
Si dj > di + cij , alors le chemin jusqu’à j n’est pas optimale et peut être
amélioré en augmentant le chemin jusqu’à i de (i, j).
conditions suffisantes:
Prenons n’importe que chemin de s à i : Ps,j ≡ (s = i1 , i2 , . . . , ik = j)
dj ≤ dik −1 + cik −1 ,ik ≤ dik −2 + cik −2 ,ik + cik −1 ,ik ≤ . . .
X
ck ,l
=
> dj ≤
(k ,l)∈Ps,j
dj est donc une borne inférieure sur tous les chemins possibles de s à i
2 types d’algorithmes pour le plus court chemin
di = approximation de la distance de s à i
Corriger les étiquettes de distance jusqu’à ce qu’elles soient toutes
optimales (label-correcting)
→ permet de détecter la présence d’un cycle de coût négatif
Fixer (rendre permanente) les étiquettes de distance une à une en
mettant aussi les autres à jour (label-setting)
→ ne permet pas de traiter des réseaux avec un cycle de coût négatif
(Pourquoi?)
→ plus efficace
→ peut être vu comme un cas particulier du label-correcting
Plus court chemin dans un graphe acyclique
(Dynamic Programming; label-setting)
Dans un graphe acyclique, on peut déterminer les distances des plus courts
chemins sans avoir à les corrigées, à condition de le faire dans le bon ordre
e.g. en utilisant l’ordre topologique
Ordre Topologique
Un graphe est acyclique ssi on peut numéroter les noeuds de sorte que,
pour chaque arête, le noeud origine ait un numéro plus petit que le noeud
destination.
2
3
5
1
4
7
6
Numérotation dans l’Ordre Topologique d’un DAG: calculer le degrés
entrant de chaque noeud. Mettre le numéro suivant (initialement 0) au noeud
de degrés 0. Mettre a jour les degrés entrant et réitérer.
Plus court chemin dans un graphe acyclique
(Dynamic Programming; label-setting)
ALGO 1 (pulling): complexité O(m)
Initialement d1 = 0.
Pour chaque noeud j = 2, . . . , n (dans l’ordre topologique),
calculer dj = mini: (i,j)∈A {di + ci j }
ALGO 2 (reaching): complexité O(m)
Initialement d1 = 0 et di = ∞ pour i = 2, . . . , n.
Pour chaque noeud i = 1, . . . , n − 1 (dans l’ordre topologique),
Pour tout j ∈ A(i), dj = min{dj , di + ci j }.
ALGORITHME de DIJKSTRA
(Reaching ; label-setting)
Trouver des plus courts chemins de s vers tout autre noeud (c-à-d un arbre
des plus courts chemins) dans un réseau qui ne contient pas d’arc de coût
négatif.
L’algorithme maintient une distance di pour chaque noeud i avec un
statut permanent (=plus court chemin) ou temporaire (=borne sup sur
le plus court chemin) .
Initialement, ds = 0 et di = ∞ ∀i 6= s.
A chaque itération, on choisit le noeud i dont la distance temporaire est
minimale, on en fait une distance permanente et on ajuste les distances
temporaires des noeuds qu’on peut atteindre du noeud i (on ajuste
également le vecteur de prédécesseur).
Initialisation: P = ∅, T = N, predi = −1 ∀i, ds = 0 et di = ∞ ∀i 6= s.
Tant que T 6= ∅ faire
- i = argmini∈T di , P = P ∪ {i}, T = T \ {i}
- ∀j ∈ A(i), si dj > di + ci j (mise à jour) : dj = di + ci j et predj = i
ALGORITHME de DIJKSTRA : EXEMPLE
3
2
5
3
3
4
1
1
1
2
6
6
3
6
2
2
5
1
3
1
2
6
3
6
1
1
2
6
6
7
4
2
4
2
2
5
3
3
4
1
1
2
6
2
5
3
4
6
7
4
2
5
1
2
2
2
4
7
2
1
4
2
3
3
6
7
4
4
1
1
2
2
3
5
1
1
7
2
2
4
1
1
1
2
6
6
7
2
4
2
L’algorithme de Dijkstra est CORRECT
On montre par récurrence sur la taille de |P| que les sommets dans P sont
labélisés avec leur distance à s (celle d’un plus court chemin).
Initialement, c’est correct : P = {s}.
A l’étape i, la distance temporaire minimum est un plus court chemin
car les arcs sont de coûts positifs.
P
T
l
i
s
k
Complexité de l’algorithme de Dijkstra (effort requis)
Soient n le nombre de noeuds et m le nombre d’arcs.
L’étape de sélection du noeud qui devient permanent requiert au plus
n opérations.
On l’ a fait au plus n fois; donc cela demande un total d’au plus n2
opérations.
Le réajustement des distances demande qu’on examine chaque arc
au plus une fois; donc ce travail requiert m opérations.
Au total, l’algorithme effectue au plus
n2 + m opérations ≤ 2 n2 opérations
NB: peut être implementé en O(m + n log(n)) avec des monceaux de
Fibonnacci
ALGORITHME de BELLMAN-FORD
programme dynamique; pulling; label-correcting avec liste de tous les noeuds
(même si di non modifié)
DÉFINITIONS:
dik = la longueur du plus court chemin de s à i utilisant k arcs au plus.
pik = le prédécesseur du noeud i dans le plus court chemin s à i
utilisant k arcs au plus.
ALGORITHME: O(n m)
Pas 0: Initialiser les distances: ds0 = 0, dj0 = ∞ ∀j 6= s
Pas 1:
Calculer pour tout j ∈ V
djk +1 = mini: (i,j)∈A {dik + ci j } ( (hyp. ci i = 0)
pjk +1 = argmini: (i,j)∈A {dik + ci j }
Pas 2:
Si dik +1 = dik ∀i, STOP (problème résolu).
Si k ≥ |N|, STOP (∃ cycle de coût néga.).
Sinon k = k + 1 , retourner au pas 1.
Exemple pour Ford-Bellman
2
2
3
−2
−3
−2
−1
1
4
2
3
1
djk +1 = min{dik + ci j } (hyp. ci i = 0 )
i
d1
d2
d3
d4
k =0
0
∞
∞
∞
k =1
0
2
2
∞
k =2
0
2
2
3
k =3
0
0
2
3
k =4
-2
0
2
3
Plus court chemin entre toute paire de noeuds
Algorithme de Floyd-Warshall
Algorithme dynamique : Soit d k (i, j) longueur du plus court chemin de i à j
et ne passant que par les noeuds 1, 2, . . . , k − 1.
PROPRIÉTÉ:
dk +1 (i, j) = min{ d k (i, j) , d k (i, k ) + d k (k , j) }
POURQUOI?
→ solution optimale cherchée : d(i, j) = d n+1 (i, j)
Plus court chemin entre toute paire de noeuds
Algorithme de Floyd-Warshall
Algorithme de Floyd-Warshall
d(i, j) = ∞ et pred(i, j) = 0 pour tout (i, j) ∈ N × N
d(i, i) = 0 pour tout i ∈ N
d(i, j) = cij et pred(i, j) = i pour tout (i, j) ∈ A
for k = 1 à n do
for tout (i, j) ∈ N × N do
if d(i, j) > d(i, k ) + d(k , j) then
d(i, j) = d(i, k ) + d(k , j)
pred(i, j) = pred(k , j)
If d(i, i) < 0, then we have detected a negative cost cycle
end if
end for
end for
avec pred(i, j) le prédécesseur de j dans le chemin de i à j de longueur d(i, j)
Complexité : O(n3 )
n itérations et pour chacune d’elles n2 itérations pour parcourir les
(i, j) ∈ N × N
Téléchargement