• Aucun résultat trouvé

Le plus court chemin

N/A
N/A
Protected

Academic year: 2022

Partager "Le plus court chemin"

Copied!
47
0
0

Texte intégral

(1)

Algorithme du plus court chemin

Michel Bierlaire

michel.bierlaire@epfl.ch

EPFL - Laboratoire Transport et Mobilit ´e - ENAC

Algorithme du plus court chemin – p. 1/47

(2)

Le plus court chemin

Le problème du plus court chemin consiste à déterminer le chemin de coût minimum reliant un nœud a à un nœud b.

On peut le voir comme un problème de transbordement.

Cependant, il est plus efficace d’utiliser des algorithmes spécialisés.

Algorithme du plus court chemin – p. 2/47

(3)

Le plus court chemin

Problème :

Soit un réseau G = (N, A).

Un coût aij est associé à chaque arc (i, j) A:

distance,

temps de trajet,

etc.

Soit un nœud appelé origine. Par convention, ce sera le nœud 1.

Nous cherchons le chemin de coût minimum reliant le nœud 1 à n’importe quel autre nœud du réseau.

Algorithme du plus court chemin – p. 3/47

(4)

Le plus court chemin

1

2

3

4

a12 = 3 a

24 = 2

a13

= 1 a34 = 3

a23 = 1 a32 = 1

Algorithme du plus court chemin – p. 4/47

(5)

Le plus court chemin

La solution est un arbre.

1

2

3

4

a12 = 3 a

24 = 2

a13 = 1 a34 = 3

a23 = 1 a32 = 1

Note : chaque nœud dans l’arbre a exactement un prédécesseur.

Algorithme du plus court chemin – p. 5/47

(6)

Le plus court chemin

La solution n’est pas nécessairement unique.

1

2

3

4

a12 = 3 a

24 = 2

a13 = 1 a34 = 3

a23 = 1 a32 = 1

Algorithme du plus court chemin – p. 6/47

(7)

Idée générale de l’algorithme

Parcours systématique du réseau à partir de l’origine.

A chaque nœud visité, une étiquette est associée.

Cette étiquette est potentiellement mise à jour à chaque visite du nœud.

Algorithme du plus court chemin – p. 7/47

(8)

Conditions d’optimalité

Soient di R, i N tels que

dj di + aij ∀(i, j) A.

Soit P un chemin entre un nœud 1 et un nœud .

Si

dj = di + aij ∀(i, j) P, alors P est un plus court chemin entre 1 et .

Algorithme du plus court chemin – p. 8/47

(9)

Conditions d’optimalité

Preuve:

P est composé d’arcs

(1, i1),(i1, i2), . . . ,(ik, ℓ)

Longueur de P:

L(P) = a1i1 + ai1i2 + · · · + aik

Comme aij = dj di,

L(P) = (di1 d1) + (di2 di1) + · · · + (d dik) = d d1.

Algorithme du plus court chemin – p. 9/47

(10)

Conditions d’optimalité

Soit Q un chemin quelconque entre 1 et .

Q est composé d’arcs

(1, j1),(j1, j2), . . . ,(jn, ℓ)

Longueur de Q:

L(Q) = a1j1 + aj1j2 + · · · + ajn

Comme aij dj di,

L(Q) (dj1 d1) + (dj2 dj1) + · · ·+ (d djm) = d d1 = L(P).

La longueur de P est donc plus courte que la longueur de Q.

Comme Q est arbitraire, P est le plus court chemin entre 1 et . CQFD

Algorithme du plus court chemin – p. 10/47

(11)

Algorithme

Idée :

On démarre avec un vecteur d’étiquettes (di)iN.

On sélectionne un arc (i, j) qui viole les conditions d’optimalité, c.-à-d. tel que

dj > di + aij.

On met à jour l’étiquette de j:

dj = di + aij.

Et ainsi de suite jusqu’à ce que tous les arcs vérifient la condition.

Algorithme du plus court chemin – p. 11/47

(12)

Interprétation

di : longueur d’un chemin entre le nœud 1 et le nœud i.

Si dj > di + aij, chemin 1 i j plus court que le chemin 1 j.

1 i

j

aij

Algorithme du plus court chemin – p. 12/47

(13)

Exploration du graphe

Travailler nœud par nœud.

Pour un nœud donné, traiter tous les arcs sortants.

Dès qu’un nœud est atteint, on l’ajoute à la liste.

Dès qu’un nœud est traité, on le supprime de la liste.

On arrête lorsque la liste est vide.

Notons V la liste des nœuds à traiter.

Algorithme du plus court chemin – p. 13/47

(14)

Algorithme

Initialisation

Liste de nœuds: V = {1}.

Étiquettes : d1 = 0, di = +∞, ∀i 6= 1.

It ´erations Tant que V 6= ,

Choisir i dans V .

V = V \ {i}.

Pour chaque arc (i, j) A

Si dj > di + aij,

dj = di + aij.

V = V ∪ {j}.

Algorithme du plus court chemin – p. 14/47

(15)

Exemple

d1 = 0 1

2 d2 =

3 d3 =

4 d4 =

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

Algorithme du plus court chemin – p. 15/47

(16)

Exemple

d1 = 0 1

2 d2 =6∞ 3

3 d3 =

4 d4 =

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2 } 0 3 1

Algorithme du plus court chemin – p. 16/47

(17)

Exemple

d1 = 0 1

2 d2 = 3

3 d3 =6∞ 1

4 d4 =

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

Algorithme du plus court chemin – p. 17/47

(18)

Exemple

d1 = 0 1

2 d2 = 3

3

d3 = 1 3 + 1

4 d4 =

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3 } 0 3 1 1 1

Algorithme du plus court chemin – p. 18/47

(19)

Exemple

d1 = 0 1

2 d2 = 3

3 d3 = 1

4 d4 =6∞ 5

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

Algorithme du plus court chemin – p. 19/47

(20)

Exemple

d1 = 0 1

2 d2 = 3

3 d3 = 1

4 d4 =6 5 4

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

3 { 4 } 0 3 1 1 1 4 3

Algorithme du plus court chemin – p. 20/47

(21)

Exemple

d1 = 0 1

2 d2 =6 3 2

3 d3 = 1

4 d4 = 4

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

3 { 4,2 } 0 2 3 1 1 4 3 4

Algorithme du plus court chemin – p. 21/47

(22)

Exemple

d1 = 0 1

2 d2 = 2

3 d3 = 1

4 d4 = 4

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

3 { 4,2 } 0 2 3 1 1 4 3 4

4 { 2 } 0 2 3 1 1 4 3 2

Algorithme du plus court chemin – p. 22/47

(23)

Exemple

d1 = 0 1

2 d2 = 2

3

d3 = 1 2 + 1

4 d4 = 4

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

3 { 4,2 } 0 2 3 1 1 4 3 4

4 { 2 } 0 2 3 1 1 4 3 2

5 { } 0 2 3 1 1 4 3

Algorithme du plus court chemin – p. 23/47

(24)

Exemple

d1 = 0 1

2 d2 = 2

3 d3 = 1

4 d4 = 4 2 + 2

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

3 { 4,2 } 0 2 3 1 1 4 3 4

4 { 2 } 0 2 3 1 1 4 3 2

5 { } 0 2 3 1 1 4 3

Algorithme du plus court chemin – p. 24/47

(25)

Exemple

d1 = 0 1

2 d2 = 2

3 d3 = 1

4 d4 = 4

3 2

1 3

1 1

Iter V d1 d2 d3 d4 Traiter

0 { 1 } 0 1

1 { 2,3 } 0 3 1 1 1 2

2 { 3,4 } 0 3 1 1 1 5 2 3

3 { 4,2 } 0 2 3 1 1 4 3 4

4 { 2 } 0 2 3 1 1 4 3 2

5 { } 0 2 3 1 1 4 3

Algorithme du plus court chemin – p. 25/47

(26)

Propriétés à la fin de chaque itération

Si di < , alors di est la longueur d’un chemin reliant 1 à i.

Si i 6∈ V , alors

soit di = (le nœud n’a pas encore été atteint),

soit dj di + aij, ∀j tel que (i, j) A (les arcs sortant ont été traités).

Algorithme du plus court chemin – p. 26/47

(27)

Propriétés si l’algorithme se termine

Pour tout nœud j tel que dj < ,

d1 = 0;

dj est la longueur du plus court chemin entre 1 et j;

Équation de Bellman :

dj = min

(i,j)Adi + aij si j 6= 1.

dj = si et seulement s’il n’y a pas de chemin reliant 1 et j.

Dans ce cas, le graphe n’est pas connexe.

L’algorithme se termine si et seulement s’il n’y a aucun chemin commençant en 1 et contenant un circuit à coût négatif.

Algorithme du plus court chemin – p. 27/47

(28)

Algorithme de Dijkstra

Algorithme “générique” ne précise pas comment choisir le nœud suivant à traiter.

Dijkstra : le nœud i à traiter est celui correspondant à la plus petite étiquette.

Algorithme du plus court chemin – p. 28/47

(29)

Algorithme

Initialisation

Liste de nœuds: V = {1}.

Étiquettes : d1 = 0, di = +∞, ∀i 6= 1.

It ´erations Tant que V 6= ,

Soit i V tel que di dj, j V .

V = V \ {i}.

Pour chaque arc (i, j) A

Si dj > di + aij,

dj = di + aij.

V = V ∪ {j}.

Algorithme du plus court chemin – p. 29/47

(30)

Exemple

d1 = 0 1

2 d2 =

3 d3 =

4

d4 =

5 d5 = 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

Algorithme du plus court chemin – p. 30/47

(31)

Exemple

d1 = 0 1

2 d2 =6∞ 2

3 d3 =6∞ 1

4

d4 =

5 d5 = 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3

Algorithme du plus court chemin – p. 31/47

(32)

Exemple

d1 = 0 1

2

d2 = 2 1 + 1

3 d3 = 1

4

d4 =6∞ 4

5 d5 = 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 4 (3) (-) 2

Algorithme du plus court chemin – p. 32/47

(33)

Exemple

d1 = 0 1

2 d2 = 2

3

d3 = 1 2 + 1

4

d4 =64 3

5 d5 =6∞ 2 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 4 (3) (-) 2 3 { 4,5 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 5

Algorithme du plus court chemin – p. 33/47

(34)

Exemple

d1 = 0 1

2 d2 = 2

3 d3 = 1

4

d4 = 3

5 d5 = 2 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 4 (3) (-) 2 3 { 4,5 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 5

4 { 4 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 4

Algorithme du plus court chemin – p. 34/47

(35)

Exemple

d1 = 0 1

2 d2 = 2

3 d3 = 1

4

d4 = 3

5 d5 = 2 3 + 0 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 4 (3) (-) 2 3 { 4,5 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 5

4 { 4 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 4

5 { } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2)

Algorithme du plus court chemin – p. 35/47

(36)

Exemple

d1 = 0 1

2 d2 = 2

3 d3 = 1

4

d4 = 3

5 d5 = 2 2

1

1 1

1

0

3

0

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 4 (3) (-) 2 3 { 4,5 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 5

4 { 4 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 4

5 { } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2)

Algorithme du plus court chemin – p. 36/47

(37)

Exemple

Iter V 1 2 3 4 5 Traiter

0 { 1 } 0 (-) (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 4 (3) (-) 2 3 { 4,5 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 5

4 { 4 } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2) 4

5 { } 0 (-) 2 (1) 1 (1) 3 (2) 2 (2)

Note : Chaque nœud n’a été traité qu’une seule fois.

Algorithme du plus court chemin – p. 37/47

(38)

Algorithme de Dijkstra

Soit l’ensemble

W = {i|di < et i 6∈ V }.

Si les coûts sur les arcs sont non négatifs, alors à chaque itération

aucun nœud dans W au début de l’itération n’entre dans V lors de l’itération,

à la fin de l’itération, di dj si i W et j 6∈ W. W : ensemble des étiquettes permanentes.

Algorithme du plus court chemin – p. 38/47

(39)

Notes

Si l’on désire calculer le plus court chemin de 1 à b, on peut arrêter l’algorithme de Dijkstra dès que le nœud b est dans W.

Si au moins un arc a un coût négatif, rien ne garantit le caractère permanent des étiquettes.

Algorithme du plus court chemin – p. 39/47

(40)

Exemple : coût négatif

d1 = 0 1

2 d2 =

3 d3 =

4 d4 =

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

Algorithme du plus court chemin – p. 40/47

(41)

Exemple : coût négatif

d1 = 0 1

2 d2 =6∞ 2

3 d3 =6∞ 1

4 d4 =

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) 3

Algorithme du plus court chemin – p. 41/47

(42)

Exemple : coût négatif

d1 = 0 1

2 d2 = 2

3 d3 = 1

4 d4 =6∞ 2

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 2 (3) 2

Algorithme du plus court chemin – p. 42/47

(43)

Exemple : coût négatif

d1 = 0 1

2 d2 = 2

3 d3 =6 1 0

4 d4 = 2 2 + 1

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 2 (3) 2 3 { 3,4 } 0 (-) 2 (1) 0 (2) 2 (3) 3

!!!

Algorithme du plus court chemin – p. 43/47

(44)

Exemple : coût négatif

d1 = 0 1

2 d2 = 2

3 d3 = 0

4 d4 =6 2 1

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 2 (3) 2 3 { 3,4 } 0 (-) 2 (1) 0 (2) 2 (3) 3

4 { 4 } 0 (-) 2 (1) 0 (2) 1 (3) 4

Algorithme du plus court chemin – p. 44/47

(45)

Exemple : coût négatif

d1 = 0 1

2 d2 = 2

3 d3 = 0

4 d4 = 1

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 2 (3) 2 3 { 3,4 } 0 (-) 2 (1) 0 (2) 2 (3) 3

4 { 4 } 0 (-) 2 (1) 0 (2) 1 (3) 4

5 { } 0 (-) 2 (1) 0 (2) 1 (3)

Algorithme du plus court chemin – p. 45/47

(46)

Exemple : coût négatif

d1 = 0 1

2 d2 = 2

3 d3 = 0

4 d4 = 1

2 1

1 1

−2

Iter V 1 2 3 4 Traiter

0 { 1 } 0 (-) (-) (-) (-) 1

1 { 2,3 } 0 (-) 2 (1) 1 (1) (-) 3 2 { 2,4 } 0 (-) 2 (1) 1 (1) 2 (3) 2 3 { 3,4 } 0 (-) 2 (1) 0 (2) 2 (3) 3

4 { 4 } 0 (-) 2 (1) 0 (2) 1 (3) 4

5 { } 0 (-) 2 (1) 0 (2) 1 (3)

Algorithme du plus court chemin – p. 46/47

(47)

Dijkstra et coût négatif

L’algorithme converge.

Mais le concept d’étiquettes permanentes n’est plus pertinent.

Toute implémentation basée sur cette propriété ne peut fonctionner qu’avec des coûts positifs.

Algorithme du plus court chemin – p. 47/47

Références

Documents relatifs

Le parcours en largeur donne le plus court chemin mais utilise beaucoup de m´ emoire.. Dijkstra ´ etait le parcours en largeur avec

Le chemin de Mona est tracé en bleu sur le 2 ème dessin.. Le chemin d’Elio est tracé en noir sur le

Les coordonnées des différents points du plan sont stockées dans une liste à deux éléments [x, y].. Les différentes coordonnées des adresses sont stockées dans

une loi d’évolution décrivant le changement infinitésimal (temps continu) de l’état du système, ou une loi d’évolution donnant l’état du système au temps t+1 en fonction

Ce problème est résolu par programmation dynamique, avec comme variables d'état, des couples {temps, longueur) associés aux nœuds. Pour le problème classique d'un plus court

Mathias est dans sa maison et décide de rendre visite à quatre de ses amis (Julie, Léo, Fabien et Kevin) en VTT?. Dans quel ordre doit-il rencontrer ses amis pour effectuer le

Ils sont alors obligés de prendre un autre cap avant de virer vers la bouée d’arrivée, qui est aussi la bouée de départ.. Doc

[r]