Algorithmique Avancée et Complexité 2009–2010 Master 1 d’Informatique S.Tison UFR IEEA Fiche TD: Algorithmes gloutons Q 5. Déduire de ce qui précède un algorithme utilisant la programmation dynamique pour calculer la valeur optimale d’un chargement et un chargement correspondant. Q 6. Evaluer la complexité de votre algorithme. Pourquoi est-il plus efficace que l’algorithme naïf? est-il polynômial? Quel avantage présente(rait) ici une version récursive "dynamique" (i.e. avec mémorisation) par rapport à la version itérative? Le cas fractionnable Exercice 1 : Le problème du sac à dos Donnée du problème: un entier c positif –la capacité maximum du sac un entier n positif –le nombre d’objets n entiers p1 , · · · , pn positifs. –les poids des objets n entiers v1 , · · · , vn , 1 ≤ vi ≤ c. –les valeurs des objets Interprétation: il y a un sac de capacité maximale c et n objets (ou projets ou..) de poids (ou coûts ou ..) pi et de valeur vi . On pourra supposer que les objets sont numérotés de 1 à n. Le problème On veut choisir les objets à emporter en respectant la capacité maximale et en maximisant la valeur. On peut considérer deux versions du problème: le cas fractionnable -on peut fractionner les objets-, ou non. Donnée du problème: On suppose donc maintenant qu’on peut fractionner les objets. Q 7. Comment formaliseriez-vous le problème? Q 8. Proposer un algorithme polynomial qui résout le pb dans ce cas. Montrer qu’il donne bien le remplissage optimal et étudier sa complexité. pour simplifier la preuve, vous pourrez supposer que les v[i]/p[i] sont tous distincts; Exercice 2 : Les gardiens de musée Le cas non fractionnable Considérez une galerie de peinture réels). Un gardien peut surveiller gauche comme à droite. Concevez pour surveiller tous les tableaux et Dans ce cas, un remplissage est juste le choix des objets qu’on emporte. Formellement, on cherche donc P P J ⊂ {1, · · · , n} qui vérifie les contraintes, i.e. i∈J pi ≤ c et qui maximise la valeur totale, i.e. i∈J vi . Exercice 3 : Optimal? Exemple 1: Soit c = 5, n = 4, p1 = 3, p2 = 2, p3 = 3, p4 = 1 et v1 = 4, v2 = 3, v3 = 3, v4 = 4. Alors, la valeur optimale d’un chargement sera 8 (ici, obtenu par un seul chargement qui correspond à prendre le premier et le quatrième objet). Q 1.Un exemple Proposez un chargement optimal pour: c=8 n=5 p1 = 3, p2 = 6, p3 = 5, p4 = 2, p5 = 2 v1 = 4, v2 = 4, v3 = 5, v4 = 3, v5 = 5. Q 2.Glouton? L’algorithme glouton suivant donne-t-il le chargement optimal? Trier les objets dans l’ordre des valeurs décroissantes pour chaque objet i si p_i+ poids <=c {prendre c; poids=poids+p_i;} Q 3.Un algorithme en programmation dynamique Appelons M eill(i, p) la valeur optimale d’un chargement de numéro i, i + 1, . . . , n, avec 1 ≤ i ≤ n et 1 ≤ p ≤ c, On a donc dans l’exemple 1: Meill 1 2 3 1 4 4 7 2 4 4 7 3 4 4 4 4 4 4 4 Q 1.Soit n tâches. Si elle est exécutée, la tâche i doit commencer au temps di , finir au temps fi et elle rapporte pi . On ne peut exécuter qu’une tâche à la fois. L’objectif est de réaliser un ensemble de tâches qui maximise le profit total. Soit l’algorithme qui consiste à trier les tâches par profit décroissant, puis à examiner les tâches une à une: si elle peut être exécutée sans conflit avec celles sélectionnées précédemment, on la sélectionne, sinon, non. Pensez-vous que cet algorithme produit toujours la solution optimale? Q 2. Soit maintenant n tâches, qui durent chacune une unité de temps. Chaque tâche a une date limite (entière) dli et une pénalité pi : si la tâche n’est pas terminée à la date dli , alors il y a une pénalité de pi . L’objectif est de programmer l’ensemble des tâches de façon à minimiser la somme des pénalités. Soit l’algorithme qui consiste à trier les tâches par pi décroissantes, puis à examiner les tâches i dans cet ordre: si il existe une unité de temps disponible avant dli , on programme i le plus tard possible avant dli , sinon le plus tard possible avant n. Cet algorithme est-il optimal? Exercice 4 : Les activités pour un sac de capacité p en utilisant les objets 4 8 7 7 4 rectiligne. Les tableaux sont placés aux positions {x1 , . . . , xn } (les xi sont des tableaux se trouvent à une distance au plus égale à 1 de lui-même à et écrivez un algorithme qui calcule le nombre minimal de gardiens requis les place. Analysez la complexité et justifiez l’optimalité de la solution. 5 8 7 7 4 Remplissez la table M eill pour l’exemple de la question 1. Q 3.1. Que vaut M eill(n, p)? (distinguer deux cas). Q 3.2. Exprimez M eill(i, p) en utilisant uniquement des M eill(j, k) avec j > i, k ≤ p (et pi , ci ). Q 3.3. Que dire de M eill(1, c)? Q 4. Déduire de ce qui précède un algorithme récursif naïf pour calculer la valeur d’un chargement optimal. Que peut-on dire de sa complexité? 1 La donnée du problème est un ensemble d’activités; pour chaque activité on a une "heure" de début et une "heure" de fin. Le problème est d’affecter des salles à toutes les activités, en respectant bien sûr la contrainte: "à un instant donné, il peut y avoir au plus une seule activité par salle" et en minimisant le nombre de salles utilisées. On suppose qu’il n’y a pas de temps de battement entre deux activités, i.e. que dans la même salle dès qu’une activité est terminée, une autre peut commencer. Un peu plus formellement, on a donc: Donnée: n - - nombre d’activités ((di , fi ))ni=1 , di < fi , di (resp. fi ): heure de début (resp. fin) de l’activité i Sortie Une affectation complète et correcte qui minimise le nombre de salles utilisées i.e.: af f : [1..n] → [1..p], p ≤ n , aff(i) no de salle affectée à l’activité i qui vérifie la contrainte: si af f (i) = af f (j) et i 6= j, alors ]di , fi [∩]dj , fj [= ∅ et qui minimise card(af f ([1..n])). Q 1. Soient les activités données par les "heures" de début et fin suivantes (1,5), (9,15), (4,8), (6,16). Proposer une affectation optimale. Q 2. Une première proposition consiste à remplir les salles une par une en utilisant le critère glouton “par date de fin croissante”. pensez-vous que cette méthode forunit une solution optimale? Justifier. 2 Q 3. Proposer un algorithme glouton qui donne une solution optimale ... et le prouver. Que dire du nombre de salles utilisées? Exercice 5 : Identification Soit un mélange de n peptides. On connaît la masse moléculaire de chacun des peptides présents w1 , ....wn (toutes distinctes). On sait séparer les peptides mais ensuite il faut les identifier, i.e. à chaque peptide séparé j, associer la masse moléculaire wi d’un des n peptides. Pour cela, on mesure la masse moléculaire de chaque peptide à l’aide d’un spectomètre de masse. On obtient ainsi pour le jième peptide une masse xj . Malheureusement le spectromètre n’est pas exact ... On cherche donc à associer à chaque xj un wij -de façon injective, c’est P à dire deux peptides différents sont associés à des wi différents-, en minimisant j |xj − wij |. Q 1. Montrer qu’on peut toujours trouver une association optimale telle que: si jxj est plus grand que xk , wij est plus grand que wik . En déduire un algorithme efficace pour optimiser l’association. Justifier. Exercice 6 : Foot ou Tennis? Le contexte général de l’exercice est le suivant: une chaîne sportive réfléchit à la programmation des événements qu’elle veut retransmettre en direct. Pour cela la donnée est une liste de n événements avec pour chacun l’heure de début et de fin. Pour simplifier on supposera que les heures sont données comme des entiers représentant le nombre de minutes depuis 0h. Un événement est toujours retransmis dans son intégralité. Les deux questions sont indépendantes. Q 1.Optimisation du nombre d’événements Dans un premier temps, la chaîne cherche à maximiser le nombre d’événements qu’elle va retransmettre. Donnée: n, nombre d’événements (di , fi ) les heures de début et fin des événements Sortie: Une programmation optimale en nombre d’événements, i.e. J, un sous-ensemble de [1, n] de cardinal maximal tel que pour tout j de J, pour tout k de J, si j 6= k, alors ]dj , fj [∩]dk , fk [= ∅ Remarque: On suppose donc qu’on peut enchaîner les événements sans pause ... Si l’événement ei se termine à fi et si l’événement ej commence à dj avec fi = dj , ils peuvent être programmés à la suite. Exemple 1: Soit n = 6, et les événéments donnés par e1 : (50, 180), e2 : (60, 100), e3 : (120, 240), e4 : (130, 250), e5 (150, 220), e6 : (220, 300). La programmation optimale en nombre d’événements sera (60, 100), (150, 220), (220, 300), donc J = {2, 5, 6}. Q 1.1. Soit l’exemple 2 suivant: n = 6 et les événements sont donnés par e1 : (50, 80), e2 : (120, 340), e3 : (90, 170), e4 : (110, 150), e5 : (160, 200), e6 : (220, 300). Quelle sera la programmation optimale en nombre d’événements? Q 1.2. Donner un algorithme polynômial pour le problème. Evaluer sa complexité et justifier la correction de l’algorithme. Q 2.Optimisation de la durée totale des retransmissions On cherche maintenant à maximiser la durée totale de la programmation. Par exemple, pour l’exemple 1, la sortie serait maintenant (50, 180), (220, 300). Formellement, le problème est donc: Donnée: n, le nombre d’événements (di , fi ) les heures de début et fin des événements Sortie: Une programmation optimale en durée totale de programmation, i.e. J, un sous-ensemble de [1, n] tel que pour P tout j de J, pour tout k de J, si j 6= k, alors ]dj , fj [∩]dk , fk [= ∅ tel que i∈J (fi − di ) soit maximal. On suppose maintenant dans tout le reste de l’exercice que les événements sont triés par di croissants. Pour résoudre le problème, on définit la notion suivante: pour un numéro d’événement i, on notera duri la durée totale d’une programmation optimale à partir des événements ei , ..., en . La valeur recherchée est donc dur1 . Pour l’exemple 1, on a donc: i 1 2 3 4 5 6 duri 210 190 150 150 150 80 Q 2.2.Donner les valeurs des duri pour l’exemple 2. i 1 2 3 4 5 6 duri ? ? ? ? ? ? On cherche maintenant à calculer les duri dans le cas général. Q 2.3.Que vaut durn en fonction de dn et fn ? Soit i, 1 ≤ i ≤ n. On dira que ei est final, si aucun événement ne peut être transmis après lui, i.e. pour tout j dj < fi . par exemple, dans l’exemple 1, sont finaux e3 , e4 , e6 . Q 2.4. Quels sont les événements finaux pour l’exemple 2? Q 2.5. Proposer un algorithme en O(1) pour tester si un événement est final. Q 2.6. Soit i < n tel que ei est final: exprimer duri en fonction de fi , di et duri+1 . Q 2.7.Soit i, 1 ≤ i < n et ei non final. Proposer en algorithme en O(log(n)) pour trouver j minimal tel que dj ≥ fi . On notera apr(i) cet entier j. Par exemple, dans l’exemple 1, on a apr(1) = 6, apr(2) = 3. Q 2.8. Soit i, 1 ≤ n et ei non final. Exprimer duri en fonction de duri+1 , di , fi et durapr(i) . Q 2.9. Déduire de ce qui précède un algorithme polynômial pour le problème. Evaluer sa complexité temporelle. Vous pouvez dans un premier temps vous contenter de calculer la durée optimale d’une solution, puis ensuite la solution. Exercice 7 : Stockage Soient n enregistrements de longueur variable stockés dans un fichier à accès séquentiel. L’enregistrement ei est de longueur si . On suppose que le temps d’accès au ième enregistrement est proportionnel à la somme des longueurs des i premiers. Par exemple pour deux enregistrements e1 , e2 , si ils sont stockés dans l’ordre (e2 , e1 ), le temps d’accès à l’enregistrement e2 est c ∗ s2 , pour e1 , c’est c ∗ (s2 + s1 ), c étant une constante. Pour chaque P enregistrement i, on connait la fréquence d’accès, fi ( on a ni fi = 1). Le temps moyen d’accès sera donc : M =c∗ n X (fσ(j) ∗ j=1 sσ(k) ) k=1 Par exemple pour deux enregistrements, si les enregistrements sont stockés dans l’ordre (e2 , e1 ), le temps moyen est donc c ∗ (f2 ∗ s2 + f1 ∗ (s2 + s1 )), soit c(s2 + f1 ∗ s1 ). Proposer une méthode gloutonne de stockage qui donnera toujours une temps moyen d’accès optimal: Entrée: n –le nombre d’enregistrements. s1 , s2 , .., sn les longueurs des enregistrements. f1 , f2 , .., fn les fréquences d’accès P Sortie: L’ordre de stockage optimal, i.e. une permutation σ(1), .., σ(n) telle que M = c ∗ nj=1 (fσ(j) ∗ Pj k=1 sσ(k) ) soit minimal. Q 2.1. Quelle est maintenant la sortie pour l’exemple 2? 3 j X 4