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