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”

Upload: others

Post on 02-Jun-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

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] }