(d1, f1), ..., (dn, fn)–pour chacune d’entre elles, le début et la fin :
Sortie: les réservations retenues i.e. J⊂[1..n]tel que:
. elles sont compatibles : i∈J, j ∈J, i 6=j⇒di>=fjou fi<=dj
. On a satisfait le maximum de demandes, i.e. |J|(le cardinal de J) est maximal.
L’algorithme glouton sera:
{ int lib=0; // date de disponibilité de la ressource
int nb=0; //nb de résa prises en compte
Liste g; //liste des réservations acceptées
g.Init(); // g=Vide;
pour chaque demande dem dans l’ordre croissant de fin
si dem.debut>=lib
//on peut la planifier
{g.ajouter(dem); //dem acceptee
lib=dem.fin; //ressource bloquee jusque f_i
nb++;}
fsi;
fin pour;}
Comment prouver que l’algo est correct?
1. La solution est correcte, i.e. les réservations retenues sont bien compatibles: facile à vérifier par induction
en prenant pour invariant { les demandes de g sont compatibles et finissent toutes au plus tard à Lib}.
2. La solution est optimale...
Préliminaire: on définit une notion de distance sur les solutions. Soient deux solutions A,Bdifférentes;
soit ile plus petit indice (les solutions étant supposées triées dans l’ordre des fins croissantes), tel que Aisoit
différent de Biou tel que Aisoit défini et pas Biou le contraire. On notera dist(A, B) = 2−i
Preuve de l’optimalité de l’algo: raisonnons par l’absurde: Supposons que la solution gloutonne gne soit pas
optimale. Soit alors oune solution optimale telle que dist(g, o)soit minimale (une telle oexiste bien, l’ensemble
des solutions étant fini). Soit donc itelle que dist(g, o) = 2−i; il y a trois possibilités:
cas 1: gi6=oi: alors, la demande oia une date de fin au moins égale à celle de gi: sinon comme elle est
compatible avec les précédentes, l’algo glouton l’aurait examinée avant giet l’aurait choisie.
Mais alors, si on transforme oen o′en rempla¸ant l’ctivité oipar gi, on obtient bien une solution, de même
cardinal que odonc optimale, et telle que dist(o′, g)< dist(o, g): on aboutit à une contradicition!
Note: on utilise ici ce qu’on appelle la propriété d’échange.
cas 2: oin’est pas définie: alors |o|<|g|: contradiction, one serait pas optimale.
cas 3: gin’est pas définie: impossible car l’activité oiétant compatible avec les précédentes, l’algo glouton
l’aurait choisie.
Donc, dans tous les cas, on aboutit à une contradiction; l’hypothèse “la solution gloutonne gn’est pas optimale”
est fausse: la solution gloutonne est bien optimale!
Remarque: On peut faire le même raisonnement en utilisant l’ordre alphabétique sur les solutions vues
comme une suite de choix d’activités, en prenant comme ordre sur les activités l’ordre d’énumération utilisé
dans l’algorithme. On a alors la solution gloutonne gqui est la plus petite solution pour cet ordre. Soit Opt
la solution optimale la plus petite pour cet ordre. On a Opt ≥g. Si Opt =gc’est fini. Sinon, en appliquant
le propriété d’échange comme ci-dessus, on construit une solution encore optimale et plus petite que Opt:
contradiction!
Bilan:
Pour mettre au point un algorithme glouton, il faut donc:
•Trouver un critère de sélection: souvent facile ... mais pas toujours
•Montrer que le critère est bon, c.à.d. que la solution obtenue est optimale: souvent dur!
•L’implémenter: en général facile et efficace!
4