Download - Algorithmique Cours 10 : Chemins de coût minimum ROB3 ...

Transcript

AlgorithmiqueCours 10 : Chemins de coût minimum

ROB3 – année 2014-2015

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

0

7 -2

426

8

7

7-3 -4

9

-2

5

2 0

7 -2

426

8

7

7-3 -4

9

-2

5

2ss

A A BB

C CDD

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.

Exemple.

1

-1 31 2

-3

-2 10

-1-1 31

-1

2

3

1 2

-3

-2 10 1

2

-1-11

-1 3

1 2

-3

-2 10 1

2

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.

Algorithme très proche de celui de Prim :

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))