Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Programmation dynamique :Optimisation d’un produit matriciel
Option Informatique 2015
Programmation dynamique : Optimisation d’un produit matriciel
De quoi s’agit-il ?
n matrices rectangulaires A1, · · · ,An.
On veut calculer le produit B = A1 · · ·An.
∀i ∈ {1, · · · ,n} , Ai est de format pi−1 × pi.
Divers parenthésages sont envisageables.
Ils donnent tous le même résultat (associativité), mais ...
peut-être pas avec la même efficacité !
Programmation dynamique : Optimisation d’un produit matriciel
Attention aux matrices en caml !
Comment définir une matrice 10× 10 d’entiers ?
matrice = vecteur de vecteurs→ type = int vect vect
let lgn = make_vect 10 0;;
let mat = make_vect 10 lgn;;
mat.(3).(1) ← 5;;
mat;;
on voulait modifier le terme (ligne 4, colonne 2) ...
c’est raté ! Le constater ...
Programmation dynamique : Optimisation d’un produit matriciel
Attention aux matrices en caml !
Solution correcte :
mat = make_vect 10 [||];;
for i = 0 to 9 domat.(i) ← make_vect 10 0
done;;
mat.(3).(1) ← 5;;
mat;;
→ on peut aussi utiliser make_matrix
Programmation dynamique : Optimisation d’un produit matriciel
Produit de 2 matrices
A =[ai,j
]16i6p16j6q
et B =[bi,j
]16i6q16j6r
C = AB =[ci,j
]16i6p16j6r
avec :
∀ (i, j) ∈ {1, · · · ,p} × {1, · · · , r} , ci,j =
q∑k=1
ai,k bk ,j
→ Algorithme “naïf”
Programmation dynamique : Optimisation d’un produit matriciel
Produit de 2 matrices en camllet mult_matrices a b =let p = vect_length a inlet q = vect_length a.(0) inlet q’ = vect_length b inlet r = vect_length b.(0) inif q <> q’ then failwith "produit impossible"elselet c = make_matrix p r 0 infor i = 1 to p dofor j = 1 to r dofor k = 1 to q doc.(i-1).(j-1) ← c.(i-1).(j-1) +
a.(i-1).(k-1) * b.(k-1).(j-1)donedonedone;c;;
→ Coût = pqr multiplications
Programmation dynamique : Optimisation d’un produit matriciel
Parenthésages possibles pour n = 3
A1 (A2A3)
(A1A2)A3
→ Total : 2
Programmation dynamique : Optimisation d’un produit matriciel
Parenthésages possibles pour n = 4
A1 (A2 (A3A4))
A1 ((A2A3)A4)
(A1A2) (A3A4)
(A1 (A2A3))A4
((A1A2)A3)A4
→ Total : 5
Programmation dynamique : Optimisation d’un produit matriciel
Impact du parenthésage sur le côut global
A1 de format 10× 100,
A2 de format 100× 5,
A3 de format 5× 50.
(A1A2)A3 → 10× 100× 5 + 10× 5× 50 = 7500
A1 (A2A3)→ 100× 5× 50 + 10× 100× 50 = 75000
Rapport de 1 à 10 ... !
Programmation dynamique : Optimisation d’un produit matriciel
Et si on les essaie tous ?
Pn = nombre de parenthésages pour n matrices.
P1 = 1.
Pour tout n > 2 : Pn =n−1∑k=1
Pk Pn−k .
P10 = 4 862; P20 = 1 767 263 190; P30 > 1015
C’est beaucoup trop ... !
On peut montrer que Pn =1n
(2n − 2n − 1
)∼
4n−1
n3/2√π
Programmation dynamique : Optimisation d’un produit matriciel
Et si on les essaie tous ?
Pn = nombre de parenthésages pour n matrices.
P1 = 1. Pour tout n > 2 : Pn =n−1∑k=1
Pk Pn−k .
P10 = 4 862; P20 = 1 767 263 190; P30 > 1015
C’est beaucoup trop ... !
On peut montrer que Pn =1n
(2n − 2n − 1
)∼
4n−1
n3/2√π
Programmation dynamique : Optimisation d’un produit matriciel
Parenthésage optimal
Structure nécessaire d’un parenth. Opt. de Ai · · ·Aj :
pour un certain k ∈ {i, · · · , j − 1} :parenth. opt. de Ai · · ·Ak+parenth. opt. de Ak+1 · · ·Aj
Car sinon, on pourrait réduire strictement le nb demultiplications scalaires en remplaçant le parenthésagede Ai · · ·Ak ou de Ak+1 · · ·Aj par un parenthésagemeilleur.
Programmation dynamique : Optimisation d’un produit matriciel
Parenthésage optimal
Notation
m (i, j) = nb minimal de multiplications pour Ai · · ·Aj.
Objectif calculer m (1,n) .
Formule de récurrence
m (i, j) =
0 si i = j
min{m (i, k ) + m (k + 1, j) + pi−1pk pj
}si i < j
On définit pour chaque (i, j) :
s (i, j) = un entier k ∈ {i, · · · , j − 1} t.q.m (i, j) = m (i, k ) + m (k + 1, j) + pi−1pk pj.
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
Approche récursive→ complexité exponentielle.
Approche “tabulaire” :
Calcul des m(i,i)
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
Approche récursive→ complexité exponentielle.
Approche “tabulaire” :
Calcul des m(i,i)
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
Approche récursive→ complexité exponentielle.
Approche “tabulaire” :
Calcul des m(i,i)
Calcul des m(i,i)
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
Approche récursive→ complexité exponentielle.
Approche “tabulaire” :
Calcul des m(i,i)
Calcul des m(i,i+1)
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
Approche récursive→ complexité exponentielle.
Approche “tabulaire” :
Calcul des m(i,i)
Calcul des m(i,i+2)
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
Approche récursive→ complexité exponentielle.
Approche “tabulaire” :
Calcul des m(i,i)
Calcul de m(1,n)
Programmation dynamique : Optimisation d’un produit matriciel
Calcul des m (i, j) et des s (i, j)
let calc_opt p =let n = (vect_length p) - 1 inlet m = make_matrix (n+1) (n+1) 0 inlet s = make_matrix (n+1) (n+1) 0 infor ` = 2 to n dofor i = 1 to n-`+1 dolet j = i+`-1 inm.(i).(j) ← ∞;for k = i to j-1 dolet q = m.(i).(k) + m.(k+1).(j) +
p.(i-1) * p.(k) * p.(j) inif q < m.(i).(j) then (m.(i).(j) ← q;s.(i).(j) ← k
)done
donedone;(m,s);;
Programmation dynamique : Optimisation d’un produit matriciel
Construction d’une solution optimale
Récursivement :(Ai · · ·As(i,j)
) (As(i,j)+1 · · ·Aj
)let rec aff_opt s i j =if i = j then (print_char ‘A‘;print_int i
)else(print_char ‘(‘;aff_opt s i s.(i).(j);aff_opt s (s.(i).(j) + 1) j;print_char ‘)‘;
);;
Programmation dynamique : Optimisation d’un produit matriciel
Construction d’une solution optimale
let par_opt_et_nb_mult p =let (m,s) = calc_opt p inlet n = (vect_length p) - 1 inaff_opt s 1 n;print_newline ();print_string "Nombre de multiplications = ";print_int m.(1).(n);print_newline ()
;;
par_opt_et_nb_mult [|10;100;5;50|];;((A1A2)A3)Nombre de multiplications = 7500
par_opt_et_nb_mult [|56;27;171;10;100;5;50|];;((A1(A2(A3(A4A5))))A6)Nombre de multiplications = 58195
Programmation dynamique : Optimisation d’un produit matriciel
�b�y�e
Programmation dynamique : Optimisation d’un produit matriciel