Vous êtes sur la page 1sur 2

2010–2011

Algorithmique Avancée et Complexité Master 1 d’Informatique


S.Tison
UFR IEEA
Fiche TD correction : Algorithmes gloutons

Exercice 1 : Optimal ?
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 ? Non. Par exemple, en notant
(di , fi , pi ), le problème {(0, 3, 3), (0, 2, 2), (2, 3, 2)} ne donne pas 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 ? OUI. Supposons les tâches triées par pi décroissantes. Une solution est juste une affectation
af f qui à chaque tâche associe sa date(entière) d’exécution. Les tâches étant de durée 1, l’affectation est correcte Ssi
à deux tâches différentes sont associées deux dates différentes ( l’affectation est injective). On peut aussi associer à une
tâche sa date(entière) d’exécution si elle est exécutée à temps ou "non à temps" sinon.
Soit glou l’affectation gloutonne ci-dessus.
(H) Supposons glou non optimal.
Pour toute affectation optimale opt, soit j minimal tel que glou(j) 6= opt(j).
on choisit une optimale qui ressemble le plus possible à glou :
(P) Soit opt telle que le min des j tq glou(j) 6= opt(j) soit maximal et i cet indice.
Donc glou(j) = opt(j) pour j < i et glou(i) 6= opt(i).
Construisons opt′ comme suit :
Cas A : il n’existe pas de k tel que opt(k) = glou(i). On pose alors opt′ (j) = opt(j) pour tout j 6= i, et opt′ (i) = glou(i)
Cas B : il existe k tel que opt(k) = glou(i) : nécessairement k > i car si k < i opt(j) = glou(j) et opt(i) 6= glou(i) ;
On pose alors opt′ (j) = opt(j) pour tout j 6= i et j 6= k, opt′ (i) = glou(i) et opt′ (k) = opt(i)
Il est évident que opt′ est une affectation correcte. Montrons qu’elle est au moins aussi bonne que opt ; remarquons
qu’opt et op’ différent uniquement pour i dans le cas 1, pour i et k dans le ca B.
Cas 1 glou(i) ≥ opt(i) :
si opt(i) ≤ di , alors glou(i) ≤ di par définition du glouton (car opt et glou coïncident pour j < i).
Si opt(i) ≥ di , i était déjà pénalisée dans opt.
Donc dans les deux cas, pour la pénalité de i rien ne change entre opt et opt′ .
De plus si on est dans le cas B, k est terminée plus tôt dans opt′ que dans opt.
Donc opt′ est au moins aussi bonne que opt.
Cas 2. opt(i) > gloui ; mais alors par construction du glouton, nécessairement i est à temps dans glou mais pas dans
opt. Donc opt′ gagne pi sur opt ; même si elle perd la pénalité de pk , opt′ est au moins aussi bonne que opt puisque pk ≤ pi .
Donc opt′ est optimale. Mais opt′ (j) = glou(j) pour j ≤ i ; cela contredit (P ) et donc l’hypothèse (H) est fausse :
glou est optimale.

Exercice 2 : Permanence
Une association cherche à assurer une permanence lors d’une journée. Chaque adhérent donne l’intervalle
de temps pour lequel il est disponible.
Q 1.Proposer un algorithme efficace qui permet d’assurer la permanence en mobilisant un minimum de per-
sonnes.
Formalisation du problème :
Donnée :
d, f entiers (ou réels) , les début et fin de la permanence
n nombre d’adhérents
[d1 , f1 ], ...[dn , fn ] : pour chaque adhérent un intervalle ( on peut supposer [di , fi ] ⊂ [d, f ] pour tout i).
Sortie :
J ⊂ [1..n] // les adhérents à qui on demande de venir
tq : ∪j∈J [dj , fj ] = [d, f ] // contrainte de correction : la permanence est assurée
et Card J minimal // fonction objectif à minimiser

Algo :
//donnée, d, f, n , d_1,f_n,...,d_n,f_n
trier par d_i croissant
sol=ensvide; //sol solution ss-ensemble de 1..n
fin=d;
tant que fin<f /:permanence assurée de d à fin
{ max=-infini;
tant que i<=n && d_i<=d {
if f_i > max { max=f_i; ind=i;}
i++}
si max=-infini la permanence ne peut être assurée
sinon {sol.ajouter(ind); fin=max;} //ind sera choisi
}

Complexité : la complexité du tri qui l’emporte sur le reste qui est linéaire (en O(n)).

Correction :
Une solution est un ensemble J d’adhérents choisis, soit pour chaque adhérent, une valeur booléeene si il partiicpe ou
non.
Supposons les adhérents triés par di croissants. Soit gl la solution gloutonne produite par l’algo ci-dessus et opt une
solution optimale différente de gl.
Soit i minimal tel que gl(i) 6= opt(i).
. Cas 1 gl(i) = true, opt(i) = f alse; Mais il existe donc j > i tel que opt(j) = true puisque opt est solution. Soit j0 le
plus petit de ces j.
Si f in est la fin de la permanence assurée par les adhérents choisis de rang < i, nécessairement dj0 ≤ f in, sinon opt
ne serait pas solution. Mais donc, vu le critère glouton, fj0 ≤ fi . Donc on peut remplacer l’adhérent j0 par l’adhérent j.
. Cas 2 gl(i) = f alse; opt(i) = true;
Mais il existe donc j > i tel que gl(j) = true. Soit j0 le plus petit de ces j
Si f in est la fin de la permanence assurée par les adhérents choisis de rang < i, on a dj ≤ dj0 ≤ f in. Mais donc, vu
le critère glouton, fj0 ≤ fi . Donc on peut remplacer l’adhérent j0 par l’adhérent j.
Donc la propriété d’échange est assurée : si opt est une solution optimale différente du glouton, opt peut être trans-
formée en une solution optimale plus proche du glouton (la distance étant par exemple 2−i où i est l’indice de la première
différence entre les solutions, si elle existe)..
La solution gloutonne est bien optimale.
Q 2. Comment assurer la permanence en minimisant le temps maximum de présence d’un adhérent ?
Formalisation du problème (la spec. ci-dessus est ambiguë...)
Donnée :
d, f entiers (ou réels) , les début et fin de la permanence
n nombre d’adhérents
[d1 , f1 ], ...[dn , fn ] : pour chaque adhérent un intervalle ( on peut supposer [di , fi ] ⊂ [d, f ] pour tout i).
Sortie :
J ⊂ [1..n] // les adhérents à qui on demande de venir
tq : ∪j∈J [dj , fj ] = [d, f ] // contrainte de correction : la permanence est assurée
et maxj∈J (fj − dj ) minimal // fonction objectif à minimiser, interprétation contestable et contestée..

J= emptyset;
COUV=emptyset;
trier par f_i - d_i croissant;
tant que COUV ne contient pas [d, f] {
\\ la permanence ne peut être assurée avec les adhérents de rang <i
si COUV ne contient pas [d_i,f_i]
{ajouter i à J;
COUV = COUV union [d_i,f_i];}
i++;}
La preuve d’optimalité est immédiate d’après l’invariant.