algorithmique cours 10 : chemins de coût minimum rob3
Post on 08-Feb-2022
6 Views
Preview:
TRANSCRIPT
Soit G=(S,A) un graphe orienté (n sommets, m arcs).Soit c:AR une fonction coût sur les arcs.Soient un sommet origine s et un sommet destination p.
Coût d'un chemin l = (a1,a2,…,ap), noté c(l) de G est la somme k=1..pc(ak).
Plus courts chemins à origine fixe
Etant donnés 2 sommets s et p, on veut :a) savoir s’il existe un chemin de coût minimum de s
à p ;b) si oui, déterminer un tel chemin.
Une donnée du problème est notée (G,c,s,p)
s 1 2 k p
n = 3(k+1) +1Nombre de chemins de s à p : 2(k+1) = 2((n-1)/3).
Un chemin n'empruntant pas 2 fois le même arc, le nombre de chemins de s à p est fini.
Remarque : il peut être très grand (exponentiel en n).
Une instance du problème est notée (G,c,s,p).Problème : Déterminer un chemin de coût minimum de s à p.
Propriété : Il existe un chemin de s à p de coût Minimum si et seulement si p est un descendant de s dans G.
Propriété :Supposons que p soit un descendant de s dans G. Si G ne possède pas de circuit absorbant, alors il existe un chemin de coût minimum de s à p qui est élémentaire.
Définition: Un circuit est dit absorbant si son coût est strictement négatif.
sx
pchemin '
chemin
Preuve: Si est un chemin de coût minimum de s à p, tout chemin élémentaire ' extrait de (lemme de Koenig) satisfait c(') ≤ c().
Le sous-graphe G(s,p) Les sommets x du graphe qui n'appartiennent pas à un chemin de s à p peuvent être supprimés de G. G(s,p) est le sous-graphe de G obtenu après suppression de ces sommets.
ps
G(s,p):sous-graphe rouge
Propriété 1:c chemin de s à p dans G c chemin de s à p dans G(s,p)
Arborescence des chemins de coût minimum
Soit G=(S,A) un graphe.Soit c une valuation des arcs, c(a) est le "coût" de l’arc a.Soit s un sommet de G.
Hypothèses (H1) Le sommet s est une racine de G;(H2) G ne possède pas de circuit absorbant.
Propriété:G possède une arborescence couvrante H de racine s telle que pour tout sommet x de G, le chemin de s à x dans H est un chemin de coût minimum de s à x dans G.
H est appelée arborescence des chemins de coût minimum d’origine s.
Algorithme générique
Soit G=(S,A) un graphe.Soit c une valuation des arcs, c(a) est le coût de l’arc A.Soit s un sommet de G.
Hypothèse (H1) s est une racine de G;(H2) G ne possède pas de circuit absorbant.
Propriété:Soit H une arborescence couvrante de racine s dans G.Soit d(x) le coût du chemin de s à x dans H. H est une arborescence des chemins de coût minimum pour G si et seulement si pour tout arc (x,y) de G on a : d(y) ≤ d(x) + c(x,y). (C)
La propriété précédente est à la base de la plupart des algorithmes de calcul des chemins de coût minimum
Tout algorithme de ce type construit une arborescencecouvrante satisfaisant les inégalités (C).
Notations :L'arborescence « courante » H=(X,U) (de racine s) en cours.
Si xX, le coût du chemin de s à x dans H est noté d(x).Si xX-{s}, le père de x dans H est noté pH(x).
Un arc (x,y) de G est dit incompatible pour H si : soit : xX et yX ; {type I1} soit : xX, yX et d(y) > d(x) + c(x,y)) ; {type I2}
Propriété:Tout arc arrière (x,y) pour H est compatible
Preuve : le coût du circuit formé du chemin de H de y à x et de l'arc (x,y), égal à d(x)-d(y)+c(x,y) est ≥ 0. (H2).
0
2
522
-1
2
2
1
-1
2 4
1
3 2
H arborescence courante sommets et arcs rougesvaleurs d(x) dans les sommets rouges
Arcs incompatibles en bleu.2 types d’arcs incompatibles :
- origine et extrémité couvertes (rouges)- origine couverte (rouge) et extrémité non couverte (bleue)
Sommets non couverts en bleu.
Si (x,y) est un arc incompatible alors l’itération fondamentale estdéfinie par la procédure de mise à jour MAJ(x,y) suivante :MAJ(x,y) : si (x,y) est de type I1 alors [X:=X{y} ;U:=U{(x,y)}] sinon U:=U-{(pH(y),y)} {(x,y)}
Initialisation : H=({s},))
Propriété : Soit (x,y) un arc incompatible.Après l’exécution de MAJ(x,y), H=(X,U) est une arborescence de racine s et d(y) a diminué strictement (les autres valeurs d(z) n'ont pas changé).
0
2
522
-1
2
2
1
-1
2 4
1
3 2
0
2
522
-1
2
2
1
-1
2 4
1
3 2
0
2 9
522
-1
2
2
1
-1
2 4
1
3 2
Itération fondamentale sur l’arc incompatible en bleu gras
0
2
412
-1
2
2
1
-1
2 4
1
3 2
cas 1 cas 2
Algorithme générique :Initialisation Tantqu’il existe un arc incompatible (x,y) dans G
faire MAJ(x,y)
Théorème :L’algorithme générique se termine et est valide.Preuve :Le nombre d’exécutions de MAJ portant sur des arcs d’extrémité y est fini car :
- le nombre de valeurs possibles de d(y) est fini, - les valeurs d(y) décroissent strictement.
Donc l’algorithme générique se termine.
L’arborescence H terminale est donc une arborescence des chemins de coût minimum d'origine s car :
- H est une arborescence couvrante (si un sommet z n’est pas dans H, tout chemin de s à z contient un arc incompatible) ;
- pour tout arc (x,y) de G : d(y) ≤ d(x)+c(x,y) .
Exemple d’exécution de l’algorithme générique
0
22
3
-1
2
2
1
-1
2 4
1
2
0
2
3
-1
2
2
1
-1
2 4
1
2
0
2
22
3
-1
2
2
1
-1
2 4
1
2
3
0
2
522
-1
2
2
1
-1
2 4
1
2
0
2 3
522
3
-1
2
2
1
-1
2 4
1
2
3
0
2 23
522
-1
2
2
1
-1
2 4
1
2
0
2 23
522
-1
2
2
1
-1
2 4
1
23
0
2
4
23
522
-1
2
2
1
-1
2 4
1
23
5
0
2
4
23
2
-1
2
2
1
-1
2 4
1
21
3
0
2
4
23
42
-1
2
2
1
-1
2 4
1
21
3
Propriété :L’algorithme générique est de complexité exponentielle.
Preuve (Exemple étudié en TD)
Les algorithmes spécifiques diffèrent par la règle de choix d’un arc incompatible.La complexité de l’algorithme est très liée à ce choix.
Les algorithmes les plus efficaces sont obtenus en regroupant les exécutions de MAJ(x,y) sur les arcs incompatibles entrant ou sortant d’un même sommet.La procédure associée est appelée : examen d’un sommet.
Il faut alors une règle de choix du prochain sommet à examiner.
Cette règle doit conduire à un nombre d’examens de sommet aussi faible que possible.
Algorithme de Bellman-Ford
• Cas général. Source s et destination p• Le graphe G=(S,A) peut contenir des arcs avec des
coûts négatifs.• L'existence d'un plus court chemin n'est pas
assurée.
• L'algorithme renvoie– soit un plus court chemin entre s et p– soit un circuit de coût négatif dans G(s,p).
Idée générale
• Algorithme itératif à n étapes
• A l'étape k, on calcule les plus courts chemins entre s et chaque sommet x qui contiennent au plus k arcs.
// Initialisationd(s) = 0;pour tout x≠s faire d(x) = ∞
// Boucle principalePour k = 1 à n faire
Pour x≠s faire d(x) = min{d(a-)+c(a) | a+=x}
Algorithme de Bellman-Ford
// Initialisationd0(s) = 0;pour tout x≠s faire d0(x) = ∞
// Boucle principalePour k = 1 à n faire
dk(s) = 0Pour x≠s faire dk(x) = min{dk-1(a-)+c(a) | a+=x}Si dk(x) = dk-1(x) pour tout x alors stop: optimum
// Détection de circuitSi il existe x tel que dn(x) ≠ dn-1(x) alors il n'existe pas de plus court chemin entre s et x
Algorithme de Bellman-Ford
Exemple
0
∞ ∞
∞∞6
8
7
7-3 -4
9
-2
5
20
7 ∞
∞66
8
7
7-3 -4
9
-2
5
2
0
7 2
466
8
7
7-3 -4
9
-2
5
2 0
7 2
426
8
7
7-3 -4
9
-2
5
2
s
s
s
s
A
A A
A B
BB
B
C
C C
CD
DD
D
Preuve de l'algorithme
Preuve (récurrence sur k)
• Pour k=0, le théorème est vrai.
• Supposons qu'il est vrai jusqu'au rang k-1– Considérons un plus court chemin P de s à x avec au
plus k arcs. Soit y le prédécesseur de x sur ce chemin.– La longueur du chemin P entre s et y est forcément un
plus court chemin de s à y avec au plus k-1 arcs.– La longueur de P est donc dk-1(y) + c(y,x) ≥ dk(x)
ThéorèmeLes valeurs calculées dk(x) représentent le plus court chemin de s à x si on impose que les chemins contiennent au plus k arcs.
• Inversement,– Considérons l'arc a* qui minimise
{dk-1(a-)+c(a) | a+=x}– Comme il existe un chemin de s à a*- avec au plus k-1
arcs, il existe un chemin de s à x, de coût dk(x)– dk(x) est donc supérieur ou égal à la longueur de P.
• P est donc exactement de longueur dk(x).
Preuve de l'algorithme
Complexité
• Complexité temporelle en O(mn)
• Complexité en espace en O(n²) peut être réduite en O(n) si on ne stocke que les valeurs dk-1(.) et dk(.)
// Initialisationd0(s) = 0;pour tout x≠s faire d0(x) = ∞
// Boucle principalePour k = 1 à n faire
dk(s) = 0Pour x≠s faire dk(x) = min{dk-1(a-)+c(a) | a+=x}Si dk(x) = dk-1(x) pour tout x alors stop: optimum
// Détection de circuitSi il existe x tel que dn(x) ≠ dn-1(x) alors il n'existe pas de plus court chemin entre s et x
Graphes sans circuitsAlgorithme de Bellman
Donnée : G=(S,A) graphe sans circuits, Le sommet s racine de G, Fonction coût c sur les arcs.
Algorithme de Bellman (2 étapes) :Etape 1 : Déterminer une liste topologique L =(s1,…,sn) des sommets de G telle que s=s1;Initialisation;Etape 2 :Pour k de 1 à n faire Examiner(sk) FinPour.
Examiner(x)Pour tout successeur y de x faire
Si d(y) > d(x)+c(x,y) alors d(y) = d(x)+c(x,y); ouvrir(y);FinSi
FinPour fermer(x);
Initialisationd(s1) = 0; ouvrir(s1);Pour tout k de 2 à n faire
d(sk) = + ∞ ;Fin Pour
Preuve (Algorithme de Bellman)Si le sommet sj est ouvert lors de l’examen de sk, alors j > k.Un sommet fermé n’est donc jamais ré-ouvert.Après l’examen de sn, tous les sommets sont donc fermés.
Complexité : O(n+m)
• Un sommet est dit ouvert si son évaluation d décroit.• Il est dit fermé à l’issue de l’exécution de la procédure examiner.
Algorithme de Bellman (2 étapes) :Etape 1 : Déterminer une liste topologique L =(s1,…,sn) des sommets de G telle que s=s1;Initialisation;Etape 2 :Pour k de 1 à n faire Examiner(sk) FinPour.
2-1-1 0 21
-1
2
3
1 2
-3
-2 10 1 -3
2-1-1 0 31
-1
2
3
1 2
-3
-2 10 1
0-1-1 0 21
-1
2
3
1 2
-3
-2 10 1 -3
0-1-1 0 21
-1
2
3
1 2
-3
-2 10 1 -3
Coûts positifs ou nulsAlgorithme de Dijkstra
Donnée : Graphe orienté G=(S,A), Sommet s racine de G, Fonction coût c sur les arcs telle que pour tout arc (x,y)
c(x,y) ≥ 0.
Algorithme de Dijkstra :Initialisation;Pour k de 1 à n faire
Soit x un sommet ouvert tel que d(x) est minimum ; Examiner(x);FinPour.
Examiner(x)Pour tout successeur y de x faire
Si d(y) > d(x)+c(x,y) alors d(y)= d(x)+c(x,y); ouvrir(y);FinSi
FinPour fermer(x);
Initialisationd(s1) = 0; ouvrir(s1);Pour tout k de 2 à n faire
d(sk) = + ∞ ;Fin Pour
5
5
5
2
3
2
1
12
3
6
5
0 02
2
2
1
12
35
6
5
0 0
8
2
2
2
1
12
3
6
5
0 0
7
3
5
2
2
2
1
12
3
6
5
0 0
7
3
4
2
2
2
1
12
35
6
5
0 0
7
3
4
2
2
2
1
12
3
6
5
0 0
7
3
4
Interprétation physique
Front de propagation autour de la source = ronds dans l'eau
SourceVisités
Non visités
Bordure
Interprétation physique
Front de propagation autour de la source = ronds dans l'eau
SourceVisités
Non visités
Bordure
Interprétation physique
Front de propagation autour de la source = ronds dans l'eau
SourceVisités
Non visités
Bordure
Interprétation physique
Front de propagation autour de la source = ronds dans l'eau
SourceVisités
Non visités
Bordure
Preuve de l’algorithme de Dijkstra.A la fin de l’itération k, soit :F (resp. O) l’ensemble des sommets fermés (resp. ouverts) ;H l’arborescence courante ;z un sommet de O tel que : d(z) = MinyO d(y).
Théorème (invariant de la boucle Pour) :1) Pour tout x de F, le chemin de s à x dans H est un
chemin de coût minimum de s à x dans G ;2) La valeur d(z) est le coût minimum d’un chemin de s à z
dans G.
Complexité de l’algorithme de Dijkstra.
Rappel de l’algorithme :Initialisation;Pour k de 1 à n faire
Soit x un sommet ouvert tel que d(x) est minimum ; Examiner(x)FinPour
1) Initialisation : O(n) 2) Recherche d’un sommet ouvert / d minimum : O(n)3) Examiner(x) : O(d+(x))
Complexité de l’algorithme : O(n2).
• L’ensemble dynamique O des sommets ouverts peutêtre géré en utilisant une structure de donnéesimplémentant un TAS.
• En utilisant un tas pour gérer l’ensemble dynamique O, on peut implémenter l’algorithme de Dijkstra avec une complexité pire-cas de O((n+m)log(n)).
Gestion de l’ensemble des sommets ouverts dans l’algorithme de Dijkstra.
L’ensemble dynamique est O ;La priorité d’un sommet ouvert x est d(x) : coût du chemin de s à x dans l’arborescence H courante.
Soient à la fin de l’itération k :F l’ensemble des sommets fermés, O l’ensemble des sommets ouverts,
Un sommet ouvert z de priorité minimale est à la racine du tas.Donc, pour calculer z, complexité O(1)
Il faut insérer dans O chaque successeur y de z non couvert (c’est-à-dire ni dans O ni dans F) avec la priorité d(z)+c(z,y).Complexité : O(log(n)) par successeur
Pour chaque successeur y de z tel que y est ouvert et (z,y) est incompatible, il faut remplacer la priorité de y par la nouvelle évaluation de y : c’est-à-dire d(z)+c(z,y).Complexité : O(log(n)) par successeur
Il en résulte que si les sommets sont examinés dans l’ordre (z1,z2,…,zn), le nombre total d’opérations de mise à jour du tas est majoré par : C log(n)(n+d+(z1)+….+d+(zn)) = C (n+m)log(n).
Il faut supprimer z du tas :Complexité : O(log(n)) par sommet supprimé.
Complexité globale : O ((n+m)log(n))
top related