Transparents en partie traduits de ceux du livre de...

36
Programmation dynamique Transparents en partie traduits de ceux du livre de Kleinberg et Tardos “Algorithm Design”

Transcript of Transparents en partie traduits de ceux du livre de...

Page 1: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Programmation dynamique

Transparents en partie traduits de ceux du livre de Kleinberg et Tardos “Algorithm Design”

Page 2: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

2

Programmation dynamique

Technique algorithmique : générale et puissante

Programmation dynamique : (presque) de la recherche exhaustive

où on essaie toutes les possibilités d’une manière intelligente

Programmation dynamique : sous-problèmes et reutilisation

Page 3: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

3

Nombre de Fibonacci

Pourquoi le nom de programmation dynamique ?

Il a donné un nom impressionnant pour être accepté par le Secrétaire de Défense Américain qui n’aimait pas la recherche mathématique

Page 4: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

4

Nombres de Fibonacci

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …

!"

!#

$

=

=

≥+

=−−

0 if 0 1 if 1 2 if 21

NNNFF

FNN

N

fib(N) si N<2 : f=N sinon f=fib(N-1)+ fib(N-2) retourner f

Objectif: calculer le Nème nombre de Fibonacci

Exponentiel !!!

F(40)

F(39) F(38)

F(38)

F(37) F(36)

F(37)

F(36) F(35)

F(36)

F(35) F(34)

F(37)

F(36) F(35)

Page 5: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

5

Mémoisation

Algorithme de programmation dynamique avec mémoisation memo={} %un dictionnaire fib(N): si N dans memo : retourner memo[N] si N < 2 : f = N sinon : f = fib(N-1)+fib(N-2) memo[N]=f retourner f

Méthode générale pour rendre un algorithme récursif efficace

Pourquoi ? fib(k) fait des appels recursifs uniquement la première fois qu’elle est appelée, pour chaque k

un appels mémoisé : temps constant nombre d’appels non-mémoisés : N (fib(1),…,fib(N)) travail non-récursif à chaque appel : temps constant => temps en O(N)

Page 6: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

6

Programmation dynamique : (presque) recursion + mémoisation

mémoiser (se rappeler) et réutiliser des solutions à des sous-problèmes qui aident à la résolution du problème initial

temps= (nombre de sous-problèmes) x (temps par sous-problème)

Pour le nombre de Fibonacci :

nombre de sous-problèmes = N temps par sous-problème = constant (on ne compte pas les recursions)

Page 7: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

7

Du bas vers le haut (Bottom-up)

Itératif(N) f[0]=0, f[1]:=1 pour i=2 jusqu’à N: f[i]=f[i-1]+f[i-2] retourner f[N]

En général,

- même calcul que dans le cas de programmation dynamique mémoisée

- tri topologique du graphe orienté sans circuit des sous-problèmes

FnFn-1Fn-2Fn-3

On peut gagner en mémoire

Page 8: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

8

Plus court chemin δ(s,v) pour tout vOn ne connait pas la réponse ? Alors il faut la deviner !

s vu

un plus court chemin hypothétique

Deviner le dernier sommet

δ(s,v)=min (δ(s,u)+w(u,v))(u,v)

appel récursif

δ(s,s)=0Exponentiel sans mémoisation

Essayer toutes les possibilités (et choisir la meilleure)

Page 9: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

9

Plus court chemin δ(s,v) pour tout v

Est-il un bon algorithme ? (imaginons qu’on a utilisé la mémoisation)

b

a

vs

δ(s,v)

δ(s,a)

δ(s,b)

δ(s,s) δ(s,v)

=> temps infini pour graphes avec cycles

Page 10: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

10

Plus court chemin δ(s,v) pour tout v

Pour DAGs : O(|V|+|E|)

Temps= (# de sous-problèmes) x (temps par sous-problème) # de sous-problèmes = |V| temps pour sous-problème δ(s,v) = (nombre d’arcs entrants à v)+1

Temps total = Σ degré entrant de v + 1= O(|V|+|E|)v

A retenir

les dépendances des sous-problèmes doivent être acycliques

Page 11: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

11

Plus Court chemin dans les graphes avec cycles

Rendre un graphe avec cycles acyclique

temps

δk(s,v) = le poids d’un plus court chemin de s à v utilisant au plus k arcs

δk(s,v)=min (δk-1(s,u)+w(u,v))(u,v)

Page 12: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

12

Plus Court chemin dans les graphes avec cycles

# de sous-problèmes : O(|V|2)

puisque on veut calculer δ|V|-1(s,v)

Temps total : O(|V||E|)

(Bellman-Ford)

Page 13: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Ordonnancement d’ Intervalles

Page 14: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

14

Ordonnancement d’intervalles

■ La tâche j commence à sj, finit à fj, et a un poids de valeur vj . ■ Deux tâches sont compatibles si elles ne se chevauchent pas. ■ But : déterminer un sous-ensemble de tâches mutuellement

compatibles de poids maximum.

Time0 1 2 3 4 5 6 7 8 9 10 11

f

g

h

e

a

b

c

d

Page 15: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

15

Ordonnancement d’intervalles non-pondérés

Fait. Si tous les poids sont 1, on peut utiliser glouton : ■ Considérons les tâches dans l’ordre croissant de leurs dates de fin. ■ Ajouter une tâche dans le sous-ensemble si elle est compatible avec

les tâches déjà choisies.

Observation. Dans le cas pondéré glouton peut se tromper énormément.

Temps0 1 2 3 4 5 6 7 8 9 10 11

b

a

poids = 999

poids = 1

Page 16: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

16

Ordonnancement d’intervalles pondérés

Notation. Numéroter selon les dates de fin : f1 ≤ f2 ≤ . . . ≤ fn . Déf. p(j) = l’indice max i < j tel que la tâche i est compatible avec j.

Ex: p(8) = 5, p(7) = 3, p(2) = 0.

Temps0 1 2 3 4 5 6 7 8 9 10 11

6

7

8

4

3

1

2

5

Page 17: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

17

Programmation Dynamique : Choix Binaire

Notation. OPT(j) = valeur de la solution optimale pour le problème avec les tâches 1, 2, ..., j.

■ Cas 1 : OPT choisit la tâche j. – tâches incompatibles : { p(j) + 1, p(j) + 2, ..., j - 1 } – doit inclure la solution optimale pour le problème 1, 2, ..., p(j)

■ Cas 2: OPT ne choisit pas la tâche j. – doit inclure la solution optimale pour le problème 1, 2, ..., j-1

OPT( j) =0 if j = 0

max v j + OPT( p( j)), OPT( j −1){ } otherwise# $ %

sous-structure optimale

Page 18: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

18

Entrée: n, s1,…,sn , f1,…,fn , v1,…,vn

Trier tâches par dates de fin f1 ≤ f2 ≤ ... ≤ fn.

Calculer p(1), p(2), …, p(n)

Calculer-Opt(j) { si (j = 0) retourner 0 sinon retourner max(vj + Calculer-Opt(p(j)), Calculer-Opt(j-1)) }

Ordonnancement d’intervalles pondéré : recherche exhaustive

Page 19: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

19

Ordonnancement d’intervalles pondérés : recherche exhaustive

Observation. algorithme exponentiel

Ex. Nombre d’appels récursifs pourrait augmenter comme dans le cas d’une suite de Fibonacci.

34

5

12

p(1) = 0, p(j) = j-2

5

4 3

3 2 2 1

2 1

1 0

1 0 1 0

Page 20: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Mémoisation. Stocker les résultats de chaque sous-problème.

20

Entrée: n, s1,…,sn , f1,…,fn , v1,…,vn

Trier tâches par date de fin f1 ≤ f2 ≤ ... ≤ fn. Calculer p(1), p(2), …, p(n)

pour j = 1 à n M[j] = vide M[j] = 0

M-Calculer-Opt(j) { si (M[j] est vide) M[j] = max(wj + M-Compute-Opt(p(j)), M-Compute-Opt(j-1)) return M[j] }

tableau global

Ordonnancement d’intervalles pondérés : Mémoisation

Page 21: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

21

Ordonnancement d’intervalles pondérés : Temps de calcul

Assertion. La version mémoisée prends un temps en O(n log n). ■ Tri par date fin : O(n log n). ■ Calculer p(⋅) : O(n) après un tri par date de début.

■ M-Calculer-Opt(j): chaque appel prend un temps en O(1) time et soit – (i) retourne une valeur existante M[j] – (ii) soit il remplit une nouvelle entrée M[j] et fait deux appels

récursifs

■ Mesure de progression Φ = # d’entrée non-vides M[]. – initialement Φ = 0, et Φ ≤ n. – (ii) augmente Φ de 1 ⇒ au plus 2n appels récursifs.

■ Temps total de M-Compute-Opt(n) est en O(n). ▪

Remarque. O(n) si les tâches sont triées par date de début et de fin.

Page 22: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Q. Comment déterminer la solution ? A. Effectuer un post-traitement

■ # d’appels récursifs ≤ n ⇒ O(n).

Faire Tourner M-Calculer-Opt(n) Faire Tourner Déterminer-Solution(n)

Déterminer-Solution(j) { si (j = 0) retourner rien sinon si (vj + M[p(j)] > M[j-1]) print j Déteminer-Solution(p(j)) sinon Déterminer-Solution(j-1) }

22

Ordonnancement d’intervalles pondérés : Déterminer une solution

Page 23: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

23

Ordonnancement d’intervalles pondérés : Bottom-Up

Entrée: n, s1,…,sn , f1,…,fn , v1,…,vn

Trier les tâches par date de fin f1 ≤ f2 ≤ ... ≤ fn.

Calculer p(1), p(2), …, p(n)

Itérativement-Calculer-Opt { M[0] = 0 pour j = 1 à n M[j] = max(vj + M[p(j)], M[j-1]) }

Page 24: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Le Problème du sac-à-dos

Page 25: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

25

Le Problème du sac-à-dos

■ n objets et un “sac-à-dos.” ■ Le poids de l’objet i est wi > 0 et sa valeur est vi > 0. ■ Le sac-à-dos a une capacité de W. ■ Objectif: remplir le sac-à-dos afin de maximiser la valeur totale

Ex: { 3, 4 } a une valeur de 40.

Glouton : ajouter à chaque fois l’objet maximisant vi / wi. Ex: { 5, 2, 1 } conduit à 35 ⇒ glouton n’est pas optimal.

1

valeur

182228

1

poids

56

6 2

7

objet

1

345

2W = 11

Page 26: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

26

Programmation Dynamique : un faux départ

Déf. OPT(i) = sous-ensemble de profit maximum de 1, …, i.

■ Cas 1 : OPT ne choisit pas l’objet i. – OPT choisit la solution optimale de { 1, 2, …, i-1 }

■ Cas 2 : OPT choisit l’objet i. – le choix de i n’implique pas immédiatement que nous devrons rejeter

d’autres objets – sans connaitre quels autres objets ont été choisis avant i, nous ne

connaissons pas combien de capacité reste pour i

Conclusion. nous avons besoin de plus de sous-problèmes !

Page 27: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

27

Programmation Dynamique : ajout d’une nouvelle variable

Déf. OPT(i, w) = sous-ensemble de profit max profit de 1, …, i avec un poids limite de w.

■ Cas 1 : OPT ne choisit pas i. – OPT choisit une solution optimale pour { 1, 2, …, i-1 } avec un poids

limite de w

■ Cas 2 : OPT choisit l’objet i. – nouveau poids limite = w – wi – OPT choisit une solution optimale pour { 1, 2, …, i–1 } avec le nouveau

poids limite

OPT(i, w) =

0 if i = 0OPT(i −1, w) if wi > wmax OPT(i −1, w), vi + OPT(i −1, w−wi ){ } otherwise

#

$ %

& %

Page 28: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Remplir un tableau n-par-W.

28

Entrée : n, w1,…,wN, v1,…,vN

pour w = 0 à W M[0, w] = 0

pour i = 1 à n pour w = 1 à W si (wi > w) M[i, w] = M[i-1, w] sinon M[i, w] = max {M[i-1, w], vi + M[i-1, w-wi ]}

retourner M[n, W]

Le Problème du sac-à-dos : Bottom-Up

Page 29: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

29

Le Problème du sac-à-dos

n + 1

1valeur

182228

1poids

56

6 2

7

objet1

345

2

φ

{ 1, 2 }

{ 1, 2, 3 }

{ 1, 2, 3, 4 }

{ 1 }

{ 1, 2, 3, 4, 5 }

0

0

0

0

0

0

0

1

0

1

1

1

1

1

2

0

6

6

6

1

6

3

0

7

7

7

1

7

4

0

7

7

7

1

7

5

0

7

18

18

1

18

6

0

7

19

22

1

22

7

0

7

24

24

1

28

8

0

7

25

28

1

29

9

0

7

25

29

1

34

10

0

7

25

29

1

34

11

0

7

25

40

1

40

W + 1

W = 11

OPT: { 4, 3 } valeur = 22 + 18 = 40

Page 30: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

30

Le Problème du sac-à-dos : temps d’exécution

Θ(n W). ■ Pas polynomial par rapport à la taille de l’entrée ! ■ "Pseudo-polynomial." ■ Version de décision du problem : problème NP-complet.

Page 31: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

Alignment de séquences

Page 32: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

32

Similarité de chaînes

■ ocurrance ■ occurrence

o c u r r a n c e

c c u r r e n c eo

-

o c u r r n c e

c c u r r n c eo

- - a

e -

o c u r r a n c e

c c u r r e n c eo

-

5 différences, 1 gap

1 différence, 1 gap

0 différences, 3 gaps

Page 33: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

33

Applications. ■ Unix diff. ■ Reconnaissance vocale. ■ Computational Biologie Computationnelle.

Distance d’Edition. [Levenshtein 1966, Needleman-Wunsch 1970] ■ Pénalité de gap δ; penalité de différence αpq. ■ Coût = somme de pénalités pour les gaps et les différences.

2δ + αCA

C G A C C T A C C T

C T G A C T A C A T

T G A C C T A C C T

C T G A C T A C A T

-T

C

C

C

αTC + αGT + αAG+ 2αCA

-

Distance d’Edition

Page 34: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

34

But: Etant données deux chaînes X = x1 x2 . . . xm et Y = y1 y2 . . . yn déterminer un alignment de coût minimum.

Déf. Un alignment M est un ensemble des paires ordonnées xi-yj chaque lettre apparait à au plus une paire sans croisements.

Def. The pair xi-yj and xi'-yj' cross if i < i', but j > j'.

Ex: CTACCG vs. TACATG. Sol: M = x2-y1, x3-y2, x4-y3, x5-y4, x6-y6.

Alignment de séquences

cost( M ) = αxi y j(xi, y j )∈ M∑

mismatch! " # $ #

+ δi : xi unmatched

∑ + δj : y j unmatched

gap! " # # # # # $ # # # # #

C T A C C -

T A C A T-

G

Gy1 y2 y3 y4 y5 y6

x2 x3 x4 x5x1 x6

Page 35: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

35

Alignment de séquences : Structure du Problème

Déf. OPT(i, j) = coût min pour l’alignement x1 x2 . . . xi and y1 y2 . . . yj. ■ Cas 1: OPT couple xi-yj.

– payer pour la différence xi-yj + coût min pour aligner les chaînesx1 x2 . . . xi-1 and y1 y2 . . . yj-1

■ Cas 2a: OPT laisse xi non-couplé. – payer le gap pour xi et le coût min pour aligner les chaînes x1 x2 . . . xi-1

et y1 y2 . . . yj ■ Cas 2b: OPT laisse yj non-couplé.

– payer le gap pour yj et le coût min pour aligner les chaînes x1 x2 . . . xi et y1 y2 . . . yj-1

OPT(i, j) =

"

#

$ $ $

%

$ $ $

jδ if i = 0

min

αxi y j+ OPT(i −1, j −1)

δ + OPT(i −1, j)δ + OPT(i, j −1)

"

# $

% $

otherwise

iδ if j = 0

Page 36: Transparents en partie traduits de ceux du livre de ...bampise/MOGPL/2015-2016/programmation-dynamique... · 26 Programmation Dynamique : un faux départ Déf. OPT(i) = sous-ensemble

36

Alignment de séquences : Algorithme

Analyse. Θ(mn) temps et espace. Mots français ou phrases : m, n ≤ 10. Biologie Computationelle: m = n = 100,000. 10 billions ops OK, mais tableau 10GB ?

Sequence-Alignment(m, n, x1x2...xm, y1y2...yn, δ, α) { pour i = 0 à m M[0, i] = iδ pour j = 0 à n M[j, 0] = jδ

pour i = 1 à m pour j = 1 à n M[i, j] = min(α[xi, yj] + M[i-1, j-1], δ + M[i-1, j], δ + M[i, j-1]) retourner M[m, n] }