UFR IEEA
Algorithmique Avancée et Complexité
2009–2010
Master 1 d’Informatique
S.Tison
Fiche TD: Algorithmes gloutons
Exercice 1 : Le problème du sac à dos
Donnée du problème:
un entier cpositif –la capacité maximum du sac
un entier npositif –le nombre d’objets
nentiers p1,· · · , pnpositifs. –les poids des objets
nentiers v1,· · · , vn,1vic. –les valeurs des objets
Interprétation: il y a un sac de capacité maximale cet nobjets (ou projets ou..) de poids (ou coûts ou ..)
piet 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.
Le cas non fractionnable
Dans ce cas, un remplissage est juste le choix des objets qu’on emporte. Formellement, on cherche donc
J⊂ {1,· · · , n}qui vérifie les contraintes, i.e. PiJpicet qui maximise la valeur totale, i.e. PiJvi.
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 pour un sac de capacité pen utilisant les objets
de numéro i, i + 1, . . . , n, avec 1inet 1pc,
On a donc dans l’exemple 1:
Meill 1 2 3 4 5
1 4 4 7 8 8
2 4 4 7 7 7
3 4 4 4 7 7
4 4 4 4 4 4
Remplissez la table Meill pour l’exemple de la question 1.
Q 3.1. Que vaut Meill(n, p)? (distinguer deux cas).
Q 3.2. Exprimez Meill(i, p)en utilisant uniquement des Meill(j, k)avec j > i, k p(et pi, ci).
Q 3.3. Que dire de Meill(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
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
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
Considérez une galerie de peinture rectiligne. Les tableaux sont placés aux positions {x1, . . . , xn}(les xisont
réels). Un gardien peut surveiller des tableaux se trouvent à une distance au plus égale à 1 de lui-même à
gauche comme à droite. Concevez et écrivez un algorithme qui calcule le nombre minimal de gardiens requis
pour surveiller tous les tableaux et les place. Analysez la complexité et justifiez l’optimalité de la solution.
Exercice 3 : Optimal?
Q 1.Soit n tâches. Si elle est exécutée, la tâche idoit commencer au temps di, finir au temps fiet 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)
dliet 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 pidécroissantes, puis à examiner les tâches idans cet ordre: si il existe une unité
de temps disponible avant dli, on programme ile plus tard possible avant dli, sinon le plus tard possible avant
n. Cet algorithme est-il optimal?
Exercice 4 : Les activités
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))n
i=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.:
aff : [1..n][1..p], p n, aff(i) no de salle affectée à l’activité i
qui vérifie la contrainte:
si aff (i) = aff (j)et i6=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 npeptides. 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 wid’un des npeptides. 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. Malheureuse-
ment le spectromètre n’est pas exact ... On cherche donc à associer à chaque xjun wij-de façon injective, c’est
à dire deux peptides différents sont associés à des widifférents-, en minimisant Pj|xjwij|.
Q 1. Montrer qu’on peut toujours trouver une association optimale telle que: si jxjest 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 jde J, pour tout kde J, si j6=k, alors ]dj, fj[]dk, fk[=
Remarque: On suppose donc qu’on peut enchaîner les événements sans pause ... Si l’événement eise
termine à fiet si l’événement ejcommence à djavec 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 2suivant: 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
tout jde J, pour tout kde J, si j6=k, alors ]dj, fj[]dk, fk[= tel que PiJ(fidi)soit maximal.
Q 2.1. Quelle est maintenant la sortie pour l’exemple 2?
3
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 durila
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:
i1 2 3 4 5 6
duri210 190 150 150 150 80
Q 2.2.Donner les valeurs des duripour l’exemple 2.
i123456
duri??????
On cherche maintenant à calculer les duridans le cas général.
Q 2.3.Que vaut durnen fonction de dnet fn?
Soit i,1in. On dira que eiest 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 eiest final: exprimer durien fonction de fi,diet duri+1.
Q 2.7.Soit i,1i<net einon final.
Proposer en algorithme en O(log(n)) pour trouver jminimal tel que djfi. 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,1net einon final. Exprimer durien fonction de duri+1,di,fiet 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 nenregistrements 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 ipremiers. Par exemple pour deux enregistrements e1, e2, si ils sont stockés dans l’ordre (e2, e1),
le temps d’accès à l’enregistrement e2est cs2, pour e1, c’est c(s2+s1),cétant une constante. Pour chaque
enregistrement i, on connait la fréquence d’accès, fi( on a Pn
ifi= 1). Le temps moyen d’accès sera donc :
M=c
n
X
j=1
(fσ(j)
j
X
k=1
sσ(k))
Par exemple pour deux enregistrements, si les enregistrements sont stockés dans l’ordre (e2, e1), le temps
moyen est donc c(f2s2+f1(s2+s1)), soit c(s2+f1s1). 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, .., snles longueurs des enregistrements.
f1, f2, .., fnles fréquences d’accès
Sortie: L’ordre de stockage optimal, i.e. une permutation σ(1), .., σ(n)telle que M=cPn
j=1(fσ(j)
Pj
k=1 sσ(k))soit minimal.
4
1 / 2 100%