Upload
lediep
View
220
Download
0
Embed Size (px)
Citation preview
Programmation dynamique
UFR d’Informatique
2015--2016
F. Laroussinie
Programmation dynamiqueDiviser-pour-régner:
1) on décompose un problème en sous-problèmes pertinents (dont la taille est une fraction de celle de départ), 2) on résout les sous-problèmes, 3) on construit une solution pour le problème initial…
Approche “top-down”
Programmation dynamique 1) on résout des sous-problèmes et on stocke leurs solutions, 2) on voit quels sous-problèmes sont pertinents et 3) on les utilise pour construire une solution pour le problème initial…
Approche “bottom-up”
3 idées !
Exemple : la suite de FibonacciF0=0 F1=1 Fn+2 = Fn+1 + Fn
Def fibonaif(n) : if n==0 : return 0 elif n==1 : return 1 else: return fibonaif(n-1)+fibonaif(n-2)
“top-down”
Exemple : la suite de FibonacciF0=0 F1=1 Fn+2 = Fn+1 + Fn
Def fibocache(n) : if n==0 : return 0 elif n==1 : return 1 T = [None] * (n+1) T[0]=0 T[1]=1 return fibocacheAux(T,n)
Def fibocacheAux(T,n) : if T[n]==None :
T[n]=fibocacheAux(T,n-1)+fibocacheAux(T,n-2) return T[n]
toujours “top-down” (et beaucoup mieux !)
Exemple : la suite de FibonacciF0=0 F1=1 Fn+2 = Fn+1 + Fn
Def fibo(n) : T = [0]*(n+1) T[1]=1 for i = 2 … n : T[i] = T[i-1]+T[i-2] return T[n]
“bottom-up”
(2 idées sur les 3…)
Exemple : la suite de FibonacciF0=0 F1=1 Fn+2 = Fn+1 + Fn
Def fiboopt(n) : if n==0 : return 0 elif n==1 : return 1 a , b = 0 , 1 for i = 2 … n-1 : a , b = b , a+b return a+b
(évite le stockage des valeurs inutiles pour la suite)
Exemple : la plus grande sous-séquence croissante
Le problème: Input:Output: une plus longue sous-séquence croissante
sous-séquence = suite d’indices 1≤i1< i2< … < ik ≤ n
… croissante : si ai1 < ai2 < … < aik
Exemple: 5 2 8 6 3 6 9 7 x x x x
Au travail !
Exemple : la plus grande sous-séquence croissante
Le problème: Input:Output: une plus longue sous-séquence croissante
indice: Soit L[j] la longueur d’une sous-séquence croissante maximale terminant en j.
L[j] = 1 + max ({0} U { L[i] | i<j ^ ai < aj })
Longueur de la solution = max({L[i] | 1≤i≤n})
Exemple: 5 2 8 6 3 6 9 7
Exemple : la plus grande sous-séquence croissante
L[j]: 1 1 2 2 2 3 4 4
L[1]=1 5 2 8 6 3 6 9 7 L[2]=1 5 2 8 6 3 6 9 7 L[3]=2 5 2 8 6 3 6 9 7 L[4]=2 5 2 8 6 3 6 9 7 L[5]=2 5 2 8 6 3 6 9 7 L[6]=3 5 2 8 6 3 6 9 7 L[7]=4 5 2 8 6 3 6 9 7 L[8]=4 5 2 8 6 3 6 9 7
Les plus grandes sous-séquences croissantes
sont de taille 4.
Algorithme: 1) calcul des L[j] avec:
- mémorisation du L[-] max (et du jmax) - pour chaque L[j], on stocke dans Pred[j] un indice i tel que L[j]=1+L[i].
2) On retrouve les L[jmax] éléments d’une sous-séquence croissante maximale avec Pred[-]:
jmax, Pred[jmax], Pred[Pred[jmax]], …
Exemple : la plus grande sous-séquence croissante
L[j] = 1 + max ({0} U { L[i] | i<j ^ ai < aj })Complexité en O(n2)
Exemple : la plus grande sous-séquence croissante
Calcul de L[j]
MaJ de max et jmax
Construction d’une solution
def plssc(T) : |T|=n maxsofar , imax = 0 , 0 L, Pred = [0,…0], [0,…,0] taille → n for j = 0 … n-1 : aux = 0 iaux = None for i in 0 … j-1 : if (T[i] < T[j] and L[i]>aux) : aux = L[i] iaux = i L[j] =1 + aux Pred[j] = iaux if (L[j] > maxsofar) : maxsofar = L[j] jmax = j #Construction de la ss-seq trouvee: iaux = jmax res = [0…0] taille → maxsofar
i = maxsofar-1 while (iaux != None) : res[i] = iaux iaux = Pred[iaux]
i = i-1 return maxsofar, res
Exemple : la plus grande sous-séquence croissante
Calcul de L[j]
MaJ de max et jmax
Construction d’une solution
def plssc(T) : maxsofar , imax = 0 , 0 L, Pred = [0]*len(T), [0]*len(T) for j in range(len(T)) : aux = 0 iaux = None for i in range(j) : if (T[i] < T[j] and L[i]>aux) : aux = L[i] iaux = i L[j] = 1 + aux Pred[j] = iaux if (L[j] > maxsofar) : maxsofar = L[j] jmax = j #Construction de la ss-seq trouvee: iaux = jmax res = [0] * maxsofar
i = maxsofar-1 while (iaux != None) : res[i] = iaux iaux = Pred[iaux] i=i-1 return maxsofar, res
Python
Les problèmes de sac à dos
Les problèmes de sac à dos
Taille du problème: les 2n+1 valeurs données
Le problème: Input: un poids maximal W ∈ N, un ensemble de n objets ayant chacun un poids Output: la valeur maximale pouvant être stockée dans le sac (sans dépasser sa capacité !).
On distingue des variantes… (et des cas particuliers): - avec répétitions : on peut prendre plusieurs fois le même objet. - sans répétition: chaque objet est pris au plus une fois. - …
Les problèmes de sac à dos
Taille du problème: les 2n+1 valeurs données
Le problème: Input: un poids maximal W ∈ N, un ensemble de n objets ayant chacun un poids Output: la valeur maximale pouvant être stockée dans le sac (sans dépasser sa capacité !).
- Cas avec répétitions: “Integer knapsack” - Cas sans répétition: “Knapsack” - Cas “borné” - …
Les problèmes de décision associés sont NP-complets… (Voir le “Garey & Johnson”, page 247).
Problèmes connus et
difficiles !
sac à dos avec répétitionsLe problème: Input: un poids maximal W ∈ N, un ensemble de n sortes d’objets ayant un poids Output: la valeur maximale pouvant être stockée dans le sac (sans dépasser sa capacité !).
Exemple:O: 1 2 3 4 5
wi 2 1 5 6 7
vi 6 1 18 22 24W=12Essais: - O5+O3 -> poids 12, valeur 42 - 2 x O3 + O1 -> poids 12, valeur 42 - 2x O4 -> poids 12, valeur 44, - …
sac à dos avec répétitionsInput: Output: la valeur maximale pouvant être stockée dans le sac.
Au travail !soit K[w] la valeur maximale pouvant être stockée dans un sac de capacité w∈{0,1,2,…,W}
- solution au problème: K[W] - K[0]=0
Comment calculer K[w] ?
sac à dos avec répétitions
Calcul de K[w]… Si une solution optimale pour réaliser K[w] contient au moins un objet i, alors… 1) sans cette occurrence de l’objet i, le contenu du sac
est optimal pour le poids w-wi, et 2) sa valeur est alors K[w-wi] !
K[w] = max ({0} U {K[w-wi]+vi | wi ≤ w})
sac à dos avec répétitionsDefinition:
K[w] = max ({0} U {K[w-wi]+vi | wi ≤ w})
Propriété: K[w] est la valeur maximale pouvant être stockée dans un sac de capacité w∈{0,1,2,…,W}
sac à dos avec répétitionsDefinition: K[w] = max ({0} U {K[w-wi]+vi | wi ≤ w})Propriété: K[w] est la valeur maximale d’un sac de capacité w∈{0,1,2,…,W}Preuve:par induction sur w.
Si K[w]=0 : Alors il n’existe pas d’objet de poids ≤w, donc la valeur maximale d’un sac de capacité w est 0.
Si K[w]>0 : Prenons un sac S optimal pour w. Supposons que ce sac contienne les objets I={i1, i2,…, ik}. Soit i un de ces i. La valeur de S est donc: vi + Σ vj Et le poids de S sans l’ojet i, est Σ wj et sa valeur est Σ vj
On a bien K[w-wi] = Σ vj car sinon S ne serait pas optimal !
j∈ I\{i}
j∈ I\{i}
j∈ I\{i}
j∈ I\{i}
≤ w-wi
sac à dos avec répétitions
def SaDrepet(W,T) : K = [None, … None] // taille → W+1 K[0] = 0 for w = 1 … W : M = 0 for (wi,vi) in T : if wi <= w : M = max(M,K[w-wi]+vi) K[w]=M
return K[W],K
sac à dos avec répétitions
def SaDrepet(W,T) : K = [None] * (W+1) K[0] = 0 for w in range(1,W+1) : M = 0 for (wi,vi) in T : if wi <= w : M = max(M,K[w-wi]+vi) K[w]=M return K[W],K
Python
sac à dos avec répétitions
O: 1 2 3 4 5wi 2 1 5 6 7
vi 6 1 18 22 24
0 1 6 7 12 18 22 24 28 30 36 40 44
0 1 2 3 4 5 6 7 8 9 10 11 12
K[-]
Exemple
def SaDrepet(W,T) : K = [None, … None] // taille → W+1 K[0] = 0 for w = 1 … W : M = 0 for (wi,vi) in T : if wi <= w : M = max(M,K[w-wi]+vi) K[w]=M
return K[W],K
sac à dos avec répétitions complexité
Complexité en Θ(W.n)
def SaDrepet(W,T) : K = [None, … None] // taille → W+1 K[0] = 0 for w = 1 … W : M = 0 for (wi,vi) in T : if wi <= w : M = max(M,K[w-wi]+vi) K[w]=M
return K[W],K
Instance:- une liste T d’objets
de taille n, - un entier W.
sac à dos avec répétitions complexité
On suppose que les 2n+1 valeurs sont codées en binaire. La taille d’une instance du problème du sac à dos est donc:
t = ∑ log(wi+1) + ∑ log(vi+1) + log(W+1)i i
Une complexité en Θ(W.n) est donc en Θ(2t).
wi,vi,W>0
sac à dos avec répétitionsConstruire une solution à partir de K[-]:
Complexité en O(W.n)
une solution S[-] est un tableau d’entiers tq:
∑S[i].vi = K[W] et ∑S[i].wi ≤ W
def SolSaDrepet(W,K,T) : n = |T| S = [0, … ,0] taille → n v = K[W] w = W while v>0 : for j = 0 … n-1 : (wj,vj) = T[j] if (wj <= w) and (v-vj == K[w-wj]) : S[j] += 1 v -= vj w -= wj return S
sac à dos avec répétitionsConstruire une solution à partir de K[-]:
def SolSaDrepet(W,K,T) : n = len(T) S = [0]*n v = K[W] w = W while v>0 : for j in range(n) : (wj,vj) = T[j] if (wj <= w) and (v-vj == K[w-wj]) : S[j] += 1 v -= vj w -= wj return S
Python
sac à dos sans répétition
sac à dos sans répétition
L’idée utilisée précédemment ne marche pas car les problèmes ne sont plus indépendants: le contenu du sac optimal pour le poids w sans l’objet i n’est pas forcément optimal pour le poids w-wi !
Exemple: W=10 et O: 1 2 3wi 5 5 6vi 20 2 3
K[10] = 22 (objet 1 + objet 2) K[5] = 20 (objet 1)
Calculer K[w] ?
Chaque objet est pris au plus une fois. Le problème: n objets, une capacité W…
Donc (objet 1+objet 2)\ objet 1 n’est pas optimal pour 10-w1 !
valeur=2 !
sac à dos sans répétitionIl faut affiner les calculs pour tenir compte des éléments potentiellement présents dans le sac (et qui ne peuvent pas être pris une seconde fois !).
Soit K[j,w] la valeur maximale que l’on peut stocker dans un sac de capacité w avec des objets 1,…,j.
K[j,w] = max (K[j-1,w], K[j-1,w-wj]+vj)K[0,w] = 0 et K[j,0]=0
Solution = K[n,W] : tous les objets sont autorisés et le poids max est W !
sac à dos sans répétitionAlgorithme de calcul des K[j,w]:
K[0,w]=0 ∀ w=0,…,W K[j,0]=0 ∀ j=0,…,n Pour j=1,…,n : Pour w = 1,…,W : Si w≤wj : K[j,w]=K[j-1,w] Sinon: K[j,w] = max(K[j-1,w],K[j-1,w-wj]+vj) Retourner K[n,W]
Complexité en O(W.n) Mémoire en O(W.n)
(NB: on peut aussi calculer par colonnes…)
sac à dos sans répétitionO: 1 2 3 4 5wi 1 2 5 6 7
vi 1 6 18 22 24
Exemple:
W=12
Ou :
def SaDsansrepet2(W,T) :
n = len(T)
Tab = [ ]
K = [0 for i in range(W+1)]
Tab.append(K[:])
for (wj,vj) in T :
for w in range(wj,W+1) :
K[w] = max(Tab[-1][w],Tab[-1][w-wj]+vj)
Tab.append(K[:])
return K[W],Tab
Remarque sur le programme Python : on recopie systematiquement les lignes precedentespour recuperer les valeurs des cas ou w < wj . . .
Exemple : On prend W = 12 et (toujours) le tableau suivant :
w 1 2 5 6 7
v 1 6 18 22 24
Et on construit le tableau K suivant :
j\w 0 1 2 3 4 5 6 7 8 9 10 11 12
0 0 0 0 0 0 0 0 0 0 0 0 0 01 0 1 1 1 1 1 1 1 1 1 1 1 12 0 1 6 7 7 7 7 7 7 7 7 7 73 0 1 6 7 7 18 19 24 25 25 25 25 254 0 1 6 7 7 18 22 24 28 29 29 40 415 0 1 6 7 7 18 22 24 28 30 31 40 42
Dans le tableau, on a illustre le calcul de deux valeurs (le 18 de la ligne n = 3, et le 30 de laderniere ligne) en mettant en gras les valeurs utilisees pour leurs calculs.
On retrouve les solutions avec :
def SolSaDsansrepet(W,Tab,T) :
n = len(T)
S = [False for i in range(n)]
v = Tab[n][W]
w = W
for j in reversed(range(n)) :
(wj,vj) = T[j]
if (wj <= w) and (v-vj == Tab[j][w-wj]) :
S[j] = True
v -= vj
w -= wj
return S
19
+v5 (=24) Solution=42 !
sac à dos sans répétitionAlgorithme de calcul des K[j,w]:
def SaDsansrepet(W,T) : n = len(T) Tab = [ ] K = [0] * (W+1) Tab.append(K[:]) for j in range(n) : (wj,vj) = T[j] for w in range(wj,W+1) : K[w] = max(Tab[-1][w],Tab[-1][w-wj]+vj) Tab.append(K[:]) return K[W],Tab
Python
ajout d’une copie de K à Tab
sac à dos sans répétitionRetrouver la solution (ie la composition du sac !) à partir de K[-,-] ?
def SolSaDsansrepet(W,Tab,T) : n = len(T) S = [False] * n v = Tab[n][W] w = W for j in reversed(range(n)) : (wj,vj) = T[j] if (wj <= w) and (v-vj == Tab[j][w-wj]) : S[j] = True v = v-vj w = w-wj
return S
sac à dos sans répétition
idée: Améliorer l’algorithme… en économisant de la mémoire…
sac à dos sans répétition0 1 w-wj w W
0
1
j-1
j K[j,w]
n
+vj
K[j,w] ne dépend que de la ligne K[j-1,-] !
� Construction du tableau: Pour w=W à 1:
K[w] = max(K[w],vj+K[w-wj])
sac à dos sans répétitionAlgorithme de calcul des K[j,w]:
K=[0,0,…,0] (taille W) Pour j=1,…,n : Pour w = W,…,1 : Si wj≤w :
K[w] = max(K[w] , K[w-wj]+vj) Retourner K[W]
Complexité en O(W.n) Mémoire: O(W)
sac à dos sans répétitiondef SaDsansrepet3(W,T) : n = len(T) K = [0] * (W+1) for j in range(n) : wj = T[j][0] vj = T[j][1] for w in range(W,wj-1,-1) : K[w] = max(K[w],K[w-wj]+vj)
return K[W]
Complexité en O(W.n) Mémoire: O(W)
Python
sac à dos avec répétitionle retour !
On peut aussi passer par un K[j,w]…
K[j,w] = max (K[j-1,w], K[j,w-wj]+vj)K[0,w] = 0 et K[j,0]=0
sac à dos avec répétition0 1 w-wj w W
0
1
j-1
j K[j,w]
n
+vj
� Construction du tableau: Pour w=1 à W:
K[w] = max(K[w],vj+K[w-wj])
les problèmes de sac à dosQuelques cas particuliers:
- sac à dos sans répétition et tel que vi=wi ∀i.
- sac à dos (avec ou sans répétition) avec vi=1 ∀i.
- sac à dos (avec ou sans répétition) avec des objets fractionnables.
- …
Difficile… ~“subset-sum problem”
Facile… maximiser le nb d’objets
Facile…
voir la partie “algorithmes gloutons”
Programmation dynamiqueUn algorithme de programmation dynamique n’est pas toujours possible.
Il faut que le problème à résoudre vérifie une propriété de “sous-structure optimale”:
Il faut qu’une solution optimale pour un problème contienne aussi des solutions optimales pour ses sous-problèmes.
Exemple: le sac à dos sans répétition avec K[j,w] ! (et K[j-1,w] et K[j-1,w-wi] ).
Rendre la monnaie
Autre problème…
Rendre la monnaie Input: Output: une manière de réaliser S avec les pièces de manière à avoir un nombre minimal de pièces.
Exemple: on veut constituer la somme 534€ à partir de billets(*) de 50€, de 20€, de 10€, de 5€ et de pièces de 2€ et 1€.
(*) oui, ça marche aussi avec les billets… !
➤ 10 x 50€ + 1x20€ + 1x10€ + 2x2€
Exemple: Constituer 8€ avec des pièces de 1€, de 4€ et de 6€.
Rendre la monnaie
➤ 2x4€ : 2 pièces.NB: et pas 6€ + 2x1€ … 3 pièces !
Exemple: le système monétaire de la Livre Sterling avant1971: 1 £ = 20 shilling 1 shilling = 12 pences + pièces de 1/4 de shilling (”3 pence”) + pièces de 1/3 de shilling (“4 pence” ou “groat”) + pièces de 1/2 shilling
Comment faire 8 pence ? ➤ 2x1 “groat”.
Rendre la monnaie
Comment faire ?
Input: Output: une manière de réaliser S avec les pièces de manière à avoir un nombre minimal de pièces.
☞ hypothèse importante : on dispose d’autant de pièces que nécessaire pour chaque sorte de pièces…
Rendre la monnaie Soit T[i,s] le nombre minimal de pièces de valeurs p1,…,pi pour constituer la somme s.
T[i,0]= T[0,s]=
0 ∀i ∞ ∀s
T[i,s] = min (T[i-1,s] , 1+T[i,s-pi]) si s≥pi T[i-1,s] sinon {
sans autre pi avec un autre pi
Rendre la monnaie Exemple: Constituer 8 avec des pièces de 1, de 4 et de 6.
i\s 0 1 2 3 4 5 6 7 8
0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
1 0 1 2 3 4 5 6 7 8
2 0 1 2 3 1 2 3 4 2
3 0 1 2 3 1 2 1 2 2
3x1 1x41x6+1x1
p1=1p2=4p3=6
Rendre la monnaie
Algorithme:
T[1…n,1…S] : tableau d’entiers Pour i=1…n :
Pour s=1…S : Si i=1 ^ s<pi Alors : T[i,s] = ∞ Si i=1 ^ s≥pi Alors : T[i,s] = 1 + T[1,s-p1] Si i>1 ^s<pi Alors : T[i,s] = T[i-1,s] Sinon : T[i,s] = min ( T[i-1,s] , 1+T[i,s-pi] )
Complexité: O(n.S)
Rendre la monnaie
Reconstituer un ensemble solution ?
Idée: ◆si T[i,s]=T[i-1,s] alors pi n’est pas (ou plus) utile ici et la solution est la même que pour T[i-1,s]; ◆si T[i,s]=1+T[i,s-pi] alors il faut ajouter une pièce pi à la solution de T[i,s-pi].
(et si T[i-1,s]=1+T[i,s-pi] alors les deux choix sont optimaux !)
Complexité: O(n+T[n,S])
Calcul des plus courts chemins dans un graphe
Autre problème…
Algorithmes dans les graphesBeaucoup de problèmes différents !
Dans cet exposé: 2 problèmes… et 4 algorithmes ! Trouver un chemin optimal
Comment aller de Chevaleret a Porte de Bagnolet ?
Funiculaire deMontmartre
Orlyvaltarificationspéciale
Stade de FranceSt-Denis
St-Denis–Porte de Paris
Basiliquede St-Denis
Portede St-Ouen
LamarckCaulaincourt
JulesJoffrinGuy
Môquet
Portede Clichy
ChâteletLes Halles
Stalingrad
MarcadetPoissonniers
Hôtel de Ville
Arts etMétiers
Château Rouge
StrasbourgSt-Denis
St-Mandé
Hoche
MarxDormoy
La CourneuveAubervilliers
Le Bourget
Jaurès
Placedes Fêtes
Belleville Jourdain Télégraphe
Ourcq Portede Pantin
JacquesBonsergent Saint-Fargeau
PelleportPorte
de Bagnolet
Danube
BotzarisButtes
Chaumont
République
Parmentier
SèvresBabylone
RichelieuDrouot
Palais RoyalMusée du
Louvre
RéaumurSébastopol
Raspail
Pyramides
MontparnasseBienvenüe
Mabillon
ClunyLa Sorbonne
MalakoffRue Étienne Dolet
Chaussée d’AntinLa Fayette
BonneNouvelle
GrandsBoulevards
Bourse Sentier
BarbèsRochechouart
LaChapelle
Pigalle
PoissonnièreLiège
Notre-Damede-Lorette
St-Georges
Abbesses
Anvers
La Fourche
Placede Clichy
Pereire–Levallois Blanche
Villiers
OpéraAuber
HavreCaumartin
Trinitéd’Estienne
d'Orves
FranklinD. Roosevelt
Neuilly–Porte Maillot
Avenue Foch
Bir-Hakeim
Invalides
Pasteur
Pontde l’Alma
JavelAndréCitroën
Javel
Michel-AngeMolitor
La Muette
Michel-AngeAuteuil
Boulainvilliers Champ de MarsTour Eiffel
ChampsÉlysées
ClemenceauTrocadéro
AvenueHenri
Martin
Avenue duPdt Kennedy
Commerce
Félix Faure
Ruede la Pompe Iéna
Ranelagh
Jasmin
Exelmans
ChardonLagache
Églised’Auteuil
Duroc
La MottePicquetGrenelle
Assemblée Nationale
Varenne
St-MichelNotre-DameSolférino
Musée d’Orsay
Concorde Les Halles
Jussieu
Odéon
Étienne Marcel
Vavin
St-Germaindes-Prés
St-Sulpice
St-PlacidePlace Monge
Pont NeufTuileries
Notre-Damedes-Champs
Luxembourg
Port-Royal
LouvreRivoli
St-Michel
Bastille
Daumesnil
Reuilly–Diderot
PèreLachaise
Oberkampf
Quai dela Rapée
SaintMarcel Bercy
Fillesdu Calvaire
Chemin Vert
St-SébastienFroissart
Ruedes Boulets
Charonne
SèvresLecourbe
Cambronne
PontMarie
SullyMorland
PhilippeAuguste
AlexandreDumas
Avron
Voltaire
Quatre Septembre
St-Ambroise
RueSt-Maur
Pte deVincennes
Maraîchers Portede Montreuil
Robespierre
Croix de Chavaux
Buzenval
Pyrénées
Laumière
Châteaud’Eau
Porte Dorée
Porte de Charenton
Ivrysur-Seine
Portede Choisy
Ported’Italie Porte d’Ivry
Olympiades
Créteil–UniversitéCréteil–L’Échat
Maisons-AlfortLes Juilliottes
Maisons-Alfort–Stade
DenfertRochereau
MaisonBlanche
CensierDaubenton
Tolbiac
Le KremlinBicêtre Villejuif
Léo LagrangeVillejuifPaul Vaillant-Couturier
GlacièreCorvisart
NationaleChevaleret
CitéUniversitaire
Gentilly
Antony
MalakoffPlateau de Vanves
MoutonDuvernet
Gaîté
EdgarQuinet
Bd Victor
Issy
Portede St-Cloud
Pantin
Magenta
Vitrysur-Seine
Saint-Ouen
Ledru-Rollin
Ménilmontant
Couronnes
ColonelFabien
Montgallet
Michel Bizot
Charenton–Écoles
Liberté
FaidherbeChaligny
École Vétérinairede Maisons-Alfort
St-Paul
MaubertMutualité
CardinalLemoine
Temple
ChâteauLandon
Bolivar
Église de Pantin
Bobigny–PantinR. Queneau
RiquetCrimée
Corentin CariouPorte de la Villette
Aubervilliers–PantinQuatre Chemins
Fortd’Aubervilliers
LesGobelins Campo
FormioQuai
de la GareCour
St-Émilion
Pierre et Marie Curie
Dugommier
Bel-AirPicpus
St-Jacques
Dupleix
Passy
Alésia
Pernety
Plaisance
Pte de Vanves
Convention
Vaugirard
Porte de Versailles
Corentin Celton
Volontaires
Falguière
Lourmel
Boucicaut
Ségur
Ruedu Bac
Rennes
SaintFrançoisXavier
Vaneau
ÉcoleMilitaire
La Tour Maubourg
AvenueÉmile Zola
CharlesMichelsMirabeau
Ported’Auteuil
BoulogneJean Jaurès
Billancourt
MarcelSembat
Cité
AlmaMarceau
Boissière
KléberGeorge V
Argentine
Victor Hugo
Les SablonsPorte Maillot
Pont de Neuilly
Esplanadede La Défense
St-Philippedu-Roule
MiromesnilSt-Augustin
Courcelles
Ternes
Monceau
RomeMalesherbesWagram
Porte de Champerret
Anatole FranceLouise Michel
Europe
Le PeletierCadet
Pereire
Brochant
Mairiede Clichy
Garibaldi
Mairiede St-Ouen
CarrefourPleyel
Simplon
Bérault
RichardLenoir
Goncourt
BréguetSabin
Rambuteau
La PlaineStade de France
Madeleine
Gabriel Péri
BibliothèqueFr. Mitterrand
Les Agnettes
Portede Clignancourt
Garede l’Est
Garede Lyon
St-Denis–Université
Portede la Chapelle
La Courneuve8 Mai 1945
BobignyPablo Picasso
PréSt-Gervais
Mairiedes Lilas
Mairiede Montreuil
Gallieni
LouisBlanc
Portedes Lilas
Gambetta
Gare du Nord
Charlesde Gaulle
Étoile
Pont de LevalloisBécon
PorteDauphine
La Défense
BoulognePont de St-Cloud
Châtelet
Gared’Austerlitz
Nation
Châteaude Vincennes
Créteil–Préfecture
Mairie d’Ivry
Placed’Italie
VillejuifLouis Aragon
Mairie d’Issy
Châtillon–Montrouge
Pontde Sèvres
IssyVal de Seine
Gare St-Lazare
GareMontparnasse
HaussmannSt-Lazare
Ported’Orléans
Balard
Pontdu Garigliano
St-Lazare
Asnières–GennevilliersLes Courtilles CDG
Grande Arche
Orly
Paris
www.ratp.fr
MR
Prop
riété
de
la R
ATP
- Age
nce
Cart
ogra
phiq
ue -
PMI 0
4-20
08- B
O D
esig
n: b
dcco
nsei
l - R
epro
duct
ion
inte
rdite
Comment sortir ?
novembre 29, 2010_1.pdf - Page 3
Les graphes
G = (S ,A)S est un ensemble fini de sommets.On va considerer des graphes orientes ou non-orientes :
q0 q1 q2
q3 q4 q5
q6
Plus courts cheminsDe quoi parle-ton ? Un graphe orienté valué G=(S,A,w) avec w:A➝R : La longueur d’un chemin est la somme du poids de ses transitions. : Un plus court chemin (PCC) entre s et u est un chemin s ➝* u de longueur minimale. Obj: trouver des PCC et/ou les longueurs des PCC.
Problèmes autour des PCC:1) trouver les PCC depuis une origine unique s. 2) trouver les PCC pour toutes les paires de sommets
de G.
q1
q2c
Plus courts chemins dans un graphe
2
5
-3
1
34
2-13
2
q2q1 q3
q4 q5 q6
Entre q1 et q3 ?
Entre q1 et q2 ?
1
Entre q1 et q5 ?
2
-4
Algorithme de Floyd-Warshallobj: trouver les PCC pour toutes les paires de sommets de G.
Données: G=(S,A,w) avec w:A➝R sans cycle négatif sous forme matricielle.
Résultat: Une matrice (!ij) où le coefficient !ij est la longueur d’un PCC entre xi et xj.
Représentation matricielle de G=(S,A,w)
Le probleme
Objectif : calculer les PCC entre tous les sommets. . .
On suppose que G = (S ,A,w) est donne sous forme matricielle :(MG ,w)
• S = {x1, . . . xn}
• w : A → R
• MG = (αij)1≤i ,j≤n : αij decrit l’arc entre xi et xj .
αijdef=
⎧
⎪
⎨
⎪
⎩
0 si i = j
w(xi , xj ) si i = j et (xi , xj) ∈ A
∞ si i = j et (xi , xj) ∈ A
Dans la suite, on notera δij la distance δ(xi , xj ) d’un PCC entre xiet xj .
S={x1,…xn}
Représentation matricielle de G=(S,A,w)Exemple
q0 q1 q2
q3 q4 q5
q6
2
7
4
4
4 3
31 8
5
⎛
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎝
0 2 ∞ 4 ∞ ∞ ∞∞ 0 ∞ 3 7 ∞ ∞∞ ∞ 0 ∞ ∞ 8 ∞∞ ∞ ∞ 0 4 ∞ 4∞ ∞ 1 ∞ 0 5 3∞ ∞ ∞ ∞ ∞ 0 ∞∞ ∞ ∞ ∞ ∞ ∞ 0
⎞
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎠
Algorithme de Floyd-WarshallQuestion: Comment calculer la matrice (!ij) ?
On va calculer une famille de matrices D(k) pour 0≤k≤n Le coefficient d(k)ij sera égal à la distance d’un PCC entre xi et xj ne passant que par des états dans {x1,…xk}.
d(k)ij = min(d(k-1)ij , d(k-1)ik + d(k-1)kj) k>0d(0)ij ="ij
� algorithme de programmation dynamique
Comment ?
Algorithme de Floyd-WarshallLa preuve de correction se fait par induction sur k.
Hyp: G sans cycle négatif !
Prop: Si G a un cycle négatif, il existe un coefficient de la diagonale de D(n) qui est <0…
d(k)ij = min(d(k-1)ij , d(k-1)ik + d(k-1)kj) k>0
Algorithme simplifie
Procedure PCC-Floyd(G )//On initialise D avec M:
pour i = 1 . . . n faire
pour j = 1 . . . n fairedij := αij
si αij = ∞ alors πij := i
pour k = 1 . . . n faire
pour i = 1 . . . n faire
pour j = 1 . . . n faire
si dij > dik + dkj alorsdij := dik + dkjπij := πkj
return D,Π
Algorithme de Floyd-Warshall
Complexité en O(n3)
� Comme pour le sac à dos, on peut utiliser une seule matrice d (au lieu de n).