Sup’Galil´ee INFO1 S1– Ann´ee 2013–2014
Algorithmique
TD 03 : Programmation dynamique
Travail `a risque
Une petite compagnie de d´eveloppement de pages web re¸coit chaque semaine des propositions de
travail pour la semaine. Certaines propositions sont “peu sensibles” (par exemple, refaire le site de
l’´ecole ´el´ementaire du quartier) tandis que d’autres sont “tr`es sensibles” (par exemple, prot´eger le site
d’une grosse compagnie). Le stress engendr´e par un travail sensible est tel que les programmeurs ont
besoin d’une semaine de repos apr`es (il est impossible d’accepter un travail imm´ediatement apr`es un
travail `a risque).
Chaque travail produit un gain, diff´erent de celui des autres travaux, et la compagnie cherche bien sˆur
`a maximiser ses gains. Le tableau p[i] contient le gain de la meilleur offre “peu sensible” et le tableau
t[i] contient le gain de la meilleure offre “tr`es sensible”.
1/On suppose que sur 4 semaines la compagnie re¸coit des offres dont les gains sont les suivants :
Semaine 1 2 3 4
p[i] 10 10 10 10
t[i] 15 15 50 15
Quels offres doit-on accepter pour maximiser le gain ?
2/Montrer que l’algorithme suivant ne r´esout pas le probl`eme. Pour cela, on donnera une instance du
probl`eme (une s´erie d’offres “peu sensibles” et “tr`es sensibles”) pour laquelle l’algorithme ne renvoie pas
le bon r´esultat.
i=1
Tant que i<n faire
Si t[i] > p[i] + p[i+1]
Alors
´
Ecrire "Choisir t en semaine $i"
i = i+2
Sinon
´
Ecrire "Choisir p en semaine $i"
i = i+1
Fin_si
Fin_Tantque
Pour l’instance trouv´ee, donner le bon r´esultat ainsi que le r´esultat renvoy´e par l’algorithme.
3/On note GM(x) le gain maximum qu’on peut obtenir `a partir de la semaine x. On note GMp(x)
(respectivement GMt(x)) le gain maximum qu’on peut obtenir `a partir de la semaine xsi on choisi le
travail peu sensible (respectivement le travail tr`es sensible) en semaine x. Si x>n(nombre total de
semaines), on pose que les gains maximum valent 0.
Exprimer GMp(x) en fonction de GM(x+1). Exprimer GMt(x) en fonction de GM (x+ 2). Exprimer
GM(x) en fonction de GMp(x) et GMt(x). En d´eduire une expression r´ecursive de GM(x).
Attention ! `
A cause du vide apr`es les travaux sensibles, la r´ecurrence est “`a l’envers” : le cas de base
est en net on descend au lieu de monter. D’o`u les appels r´ecursifs “`a l’envers” en fonction des valeurs
de xplus grandes !
4/´
Ecrire un algorithme qui utilise la r´ecurrence pr´ec´edente pour calculer GM(1). Montrer que sa com-
plexit´e est au moins exponentielle.
5/Dessiner l’arbre des appels pour le calcul de GM(1) avec l’exemple de la premi`ere question. Indiquer
les appels faits plusieurs fois.
6/En utilisant une technique de programmation dynamique, ´ecrire un algorithme qui calcule le gain
maximum qu’on puisse obtenir. Quelle est sa complexit´e en temps ? En espace ?
1