Algorithmique TD 03 : Programmation dynamique Travail `a

publicité
Sup’Galilée
INFO1 S1– Année 2013–2014
Algorithmique
TD 03 : Programmation dynamique
Travail à risque
Une petite compagnie de développement de pages web reçoit chaque semaine des propositions de
travail pour la semaine. Certaines propositions sont “peu sensibles” (par exemple, refaire le site de
l’école élémentaire du quartier) tandis que d’autres sont “très sensibles” (par exemple, protéger le site
d’une grosse compagnie). Le stress engendré par un travail sensible est tel que les programmeurs ont
besoin d’une semaine de repos après (il est impossible d’accepter un travail immédiatement après un
travail à risque).
Chaque travail produit un gain, différent de celui des autres travaux, et la compagnie cherche bien sûr
à 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ès sensible”.
1/On suppose que sur 4 semaines la compagnie reçoit des offres dont les gains sont les suivants :
Semaine 1
p[i] 10
t[i] 15
2
10
15
3
10
50
4
10
15
Quels offres doit-on accepter pour maximiser le gain ?
2/Montrer que l’algorithme suivant ne résout pas le problème. Pour cela, on donnera une instance du
problème (une série d’offres “peu sensibles” et “très sensibles”) pour laquelle l’algorithme ne renvoie pas
le bon résultat.
i=1
Tant que i<n faire
Si t[i] > p[i] + p[i+1]
Alors
Écrire "Choisir t en semaine $i"
i = i+2
Sinon
Écrire "Choisir p en semaine $i"
i = i+1
Fin_si
Fin_Tantque
Pour l’instance trouvée, donner le bon résultat ainsi que le résultat renvoyé par l’algorithme.
3/On note GM (x) le gain maximum qu’on peut obtenir à partir de la semaine x. On note GMp (x)
(respectivement GMt (x)) le gain maximum qu’on peut obtenir à partir de la semaine x si on choisi le
travail peu sensible (respectivement le travail très 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éduire une expression récursive de GM (x).
Attention ! À cause du vide après les travaux sensibles, la récurrence est “à l’envers” : le cas de base
est en n et on descend au lieu de monter. D’où les appels récursifs “à l’envers” en fonction des valeurs
de x plus grandes !
4/Écrire un algorithme qui utilise la récurrence précédente pour calculer GM (1). Montrer que sa complexité est au moins exponentielle.
5/Dessiner l’arbre des appels pour le calcul de GM (1) avec l’exemple de la première question. Indiquer
les appels faits plusieurs fois.
6/En utilisant une technique de programmation dynamique, écrire un algorithme qui calcule le gain
maximum qu’on puisse obtenir. Quelle est sa complexité en temps ? En espace ?
1
Envois de matériel
Une entreprise fabrique des composants matériels puis les envoie à ses clients. Les délais de fabrications
étant longs, les commandes arrivent à l’avance et il est possible de planifier le poids de matériel à expédier
chaque semaine.
Pour l’expédition, l’entreprise a le choix entre deux transporteurs. Le premier, A, fait payer un prix
proportionnel au poids (e.g. 1 euros par kilo). Le deuxième, B, fait payer un prix fixe (e.g. 10 euros par
semaine) mais n’accepte que des contrats de 4 semaines exactement (renouvelables).
7/Quel choix de transporteur faut-il faire si les poids des composants sont (semaine par semaine) :
11, 9, 9, 12, 12, 12, 11, 13, 10, 8, 12, 9 ?
8/On note C(x) le coût minimal des envois pour les semaines 1 à x. On pose C(x) = 0 si x ≤ 0. On
note CA (x) (respectivement CB (x)) le coût minimal des envois pour les semaines 1 à x en supposant que
la semaine x soit la fin d’un contrat avec le transporteur A (respectivement la fin d’un contrat avec le
transporteur B). Écrire la définition de CA (x) et CB (x) en fonction de C(x − 1) et C(x − 4). En déduire
une définition récursive de C(x).
9/Écrire un algorithme correspondant à cette définition. Montrer que sa complexité est au moins exponentielle.
10/Dessiner l’arbre des appels pour le calcul de C(5) avec l’exemple précédent. Indiquer les appels faits
plusieurs fois.
11/En utilisant une technique de programmation dynamique, écrire un algorithme polynômial pour
calculer le coût minimal. Combien de mémoire utilise-t-il ?
12/Donner le tableau rempli par l’algorithme pour l’exemple de la question 7/.
13/Comment retrouver l’expéditeur avec qui travailler chaque semaine à partir du résultat de l’algorithme ?
2
Téléchargement