Algorithmique et programmation L2 MIASHS-Math
TP 5 2020-2021
Programmation dynamique
Produit d’une suite de matrices
On rappelle que le produit de matrices est associatif, c’est-`a-dire que (AB)C = A(BC). Pour faire le produit de matrices A1A2. . . An, il existe de nombreuses fa¸cons de parenth´eser correctement cette expression. Le but de cet exercice est de trouver un parenth´esage optimal d’un produit de matrices A1A2. . . An minimisant le nombre de multiplications scalaires.
1. Combien de multiplications d’entiers faut-il faire pour calculer (3)× (4)× (2)× 6 7 8 9
? Et
(((3)×(4))×(2))× 6 7 8 9
?
2. `A partir de maintenant, on suppose avoirn matrices A1, . . . , An multipliables, c’est-`a-dire que : A1 a dimensionp0×p1,A2 a dimensionp1×p2, etc. jusqueAn qui a dimension pn−1×pn. Remarquer que les coefficients desAi importent peu et que seul lespi sont n´ecessaires pour r´esoudre le probl`eme du parenth´esage optimal.
Montrer que le nombre de parenth´esages de A1A2. . . An est sup´erieur ou ´egal `a 2n−2. Est-il efficace de tester tous les parenth´esages possibles ?
3. Pour calculer le parenth´esage optimal, on va utiliser la m´ethode de programmation dynamique.
Notonsmi,j (1≤i6j6n) le nombre minimal de multiplications scalaires `a effectuer pour calculer Ai. . . Aj. D´emontrer que les mi,j sont d´efinies par les relations suivantes :
mi,j =
(0 sii=j mini6k<j(mi,k+mk+1,j+pi−1pkpj) sinon
4. ´Ecrire une fonctionmatrixMultCout(p)prenant en param`etre la listepdes dimensionspi,06i6net renvoyant le nombre minimal de multiplications scalaires `a effectuer pour calculer le produitA1. . . An. 5. Modifier la fonction pr´ec´edente en une fonction matrixMultSol(p) prenant le mˆeme param`etre et renvoyant le couple (m1,n, s) o`um1,n est comme avant etsest la chaˆıne de caract`eres comportant le parenth´esage des Ai. Par exemple, pour les matrices de la question 1, la fonction doit retourner un parenth´esage de coˆut 6, par exemple :(6, ’((((A1)A2)A3)A4)’).
Plus long sous-mot commun
Soit Σ un alphabet fini. On rappelle que Σ∗ est l’ensemble des mots sur Σ. Pour u∈Σ∗, on note |u|
la longueur deu (son nombre de lettres).
Un sous-mot de u∈Σ∗ est un motw∈Σ∗, tel qu’il existe une suite strictement croissante d’indices 16i1 < i2 < . . . < i|w|6|u|v´erifiant
wk=uik pour 16k6|w|.
Le probl`eme duplus long sous-mot commun est le suivant : ´etant donn´e deux mots u et v, d´eterminer un mot de longueur maximale qui soit `a la fois un sous-mot deu et un sous mot de v.
1. Dans cette question, on s’int´eresse au calcul de la longueur maximale d’un sous-mot commun `a u et v. On note m la longueur deu etnla longueur de v.
Pour (i, j) ∈ {0, . . . , m} × {0, . . . , n}, notons `i,j la longueur maximale d’un sous-mot commun `a u[1, . . . , i] etv[1, . . . , j].
Bien sˆur `i,0 = `0,j = 0 pour tout i, j. De plus, on a montr´e dans le cours qu’on a la propri´et´e suivante :
Pour tout 0< i6met 0< j 6n:
`i,j =
(`i−1,j−1+ 1 si u[i] =v[j]
max{`i,j−1, `i−1,j} sinon
Ecrire une fonction Python´ longueur(u,v) renvoyant un tableau A tel que, pour tout 06i6m et 06j6n,A[i, j] =`i,j.
2. Montrer qu’un couple de mots peut avoir un nombre exponentiel de sous-mots communs de longueur maximale (sur un alphabet fix´e).
3. ´Ecrire une fonction Python solution(u,v) renvoyant un sous-mot commun `a u et v de longueur maximale.
Coupe de de tige
Supposons qu’une compagnie de m´etallurgie veuille optimiser ses profits sur la d´ecoupe de tige de m´etal. Elle re¸coit de ses sous-traitants une tige de m´etal de longueurn∈Net elle dispose d’un catalogue avec les prix de vente pk des tiges de longueurs k∈ {1, . . . , n}. La compagnie souhaite maximer le prix de vente d’une tige de longueur n en la d´ecoupant ´eventuellement en plusieurs morceaux. Elle cherche donc `a maximiser la sommepk1 +· · ·+pkj pour k1, . . . , kj ∈ {1, . . . , n} tels quen=k1+· · ·+kj.
1. Pour 0 6 i 6 n, notons ri le prix de vente maximal qu’on peut obtenir en d´ecoupant une tige de longueur i. Exprimer ri `a partir de r1, r2, . . . , ri−1 et de p1, . . . , pn. (On peut bien sˆur exprimer ri seulement `a partir despj mais l’objectif est d’obtenir une relation peu coˆuteuse `a calculer).
2. ´Ecrire une fonction prixVenteMax(p,n) prenant en param`etres le catalogue p des prix (sous forme d’une liste) et la longueur n d’une tige et renvoyant le prix de vente maximal rn obtenu en faisant une coupe optimale de la tige. On utilisera pour cela la m´ethode de programmation dynamique en utilisant la relation trouv´ee `a la question pr´ec´edente.
3. D´emontrer que votre algorithme est correct. Donner sa complexit´e.
4. Modifier la fonction pr´ec´edente en une fonction coupeMax(p,n) prenant les mˆemes param`etres que prixVenteMaxmais renvoyant le couple (rn, `) o`urnest comme avant et`est une listek1, . . . , kj d’une coupe d’efficacit´e maximale. En particulier, cette liste doit donc v´erifier :
k1+· · ·+kj =n et rn=pk1 +· · ·+pkj.
2