Algorithmes Gloutons Fin de la Partie 1
ACT
Sophie Tison Master Informatique
Universit´e de Lille
T
ROIS PARADIGMES▶ Diviser Pour R´egner
▶ Programmation Dynamique
▶ Algorithmes gloutons (greedy algorithms)
L
E PRINCIPE D’
UNE METHODE GLOUTONNE´
Avaler tout ce qu’on peut
=
Construire au fur et `a mesure une solution en faisant les choix qui paraissent optimaux localement
Dans certains cas, cela donnera finalement la meilleure solution: on parlera d’algorithmes gloutons exacts.
Dans d’autres, non, on parlera d’heuristiques gloutonnes.
U
N PREMIER EXEMPLE: L
E MONNAYEUROn dispose des pi`eces de monnaie correspondant aux valeurs {a0, . . . ,an−1}, avec 1=a0<a2. . . <an−1.
Pour chaque valeur le nombre de pi`eces est non born´e.
Etant donn´ee une quantit´ecenti`ere, on veut trouver une fac¸on de ”rendre” la sommecavec unnombre de pi`eces minimum.
U
N PREMIER EXEMPLE:
RENDRE LA MONNAIEUneinstancedu probl`eme est la donn´ee des valeurs faciales des pi`eces{a0, . . . ,an−1}, avec 1=a0 <a2. . . <an−1et de la sommec`a payer.
Unesolutionest pour chaque type de pi`ece ( 0≤i≤n−1) un nombre de pi`ecesnbitelle que∑n−1
i=0 nbi∗ai =c: on a bien pay´e c(exactement);
Elle estoptimalesi∑
i=0n1nbiest minimal: on a minimis´e la fonction objectif, ici le nombre total de pi`eces.
U
NE INSTANCE DU MONNAYEUR▶ Les pi`ecesa0=1,a1=2,a2 =5,a3=10,a4=20
▶ la somme `a payerc=26 Solution optimale?
1 pi`ece de 20, pas de pi`ece de 10, 1 pi`ece de 5, pas de pi`ece de 2, 1 pi`ece de 1.
Peut-on faire mieux?
Pourquoi?
C
OMMENT JUSTIFIER QUE LA SOLUTION EST OPTIMALEPour les pi`ecesa1=1,a2 =2,a3=5,a4=10,a5 =20 et la somme `a payerc=26, la solution: 20,5,1 est-elle optimale?
Preuve par cas?
▶ Si on utilise 1 pi`ece de 20, il reste 6 `a payer: au moins deux pi`eces!
▶ Si on utilise 0 pi`ece de 20, il reste 26 `a payer en 10, 5, 2, 1:
au moins 3 pi`eces Donc c’est optimal!
L’
ALGORITHME?
//c somme `a payer enti`ere ¿0
//valeurs des pi`eces: 1=a[0]< ... <a[n−1]
//les a[i] tri´es en croissant intnb pieces=0;//solution vide int[n]nb;
initialis´e `a 0 i=n−1;nb+ +;
while(c>0)do if(c≥a[i])then
nb[i] + +;nb pieces+ +;c=c−a[i];
else i− −;
end
A
UTRE VERSION//c somme `a payer enti`ere ¿0
//valeurs des pi`eces: 1=a[0]< ... <a[n−1]
//les a[i] tri´es en croissant int nbtotal←0; //solution vide int[n] nb;
for (inti=n−1;i≥0;i− −) do nb[i]←c/a[i];
nb pieces←nb pieces+nb[i];
c←c mod a[i];
end
L’
ALGORITHME EST-
IL CORRECT?
Par exemple, soit 26 `a payer en pi`eces de 7, 6, 1 algo glouton: 3 Pi`eces de 7, 5 pi`eces de 1 solution optimale: 2 pi`eces de 7, 2 pi`eces de 6
Donc,Non, l’algo n’est pas correct!
L’
ALGORITHME EST-
IL CORRECT?
Un ancien syst`eme britannique: 1, 2, 6, 12, 24, 30, 60, 240
L’algorithme glouton ´etait-il optimal?
Pour rendre 48, l’algorithme glouton n’est pas optimal.
On appellecanoniqueun syst`eme de pi`eces pour lequel l’algorithme glouton est optimal. Les syst`emes actuels le sont (presque?) tous.
Q
UAND EST-
IL CORRECT?
Par exemple, est-il toujours correct pour 1,2,5,10,20?
La solution produite par l’algorithme glouton est g20=c÷20
g10= (c mod 20)÷10
g5= ((c mod 20) mod 10)÷5 soitg5= (c mod 10)÷5 g2= ((c mod 10) mod 5)÷2 soitg2= (c mod 5)÷2 g1= (c mod 5) mod 2
Q
UE DIRE DE L’
OPTIMALE?
Soito20,o10,o5,o2,o1une solution optimale. On a c=20∗o20+10∗o10+5∗o5+2∗o2+o1
Alors,o1<2, sinon on peut remplacer 2 pi`eces de 1 par une de 2.
De mˆeme,o2<3, sinon, on remplace 3 pi`eces de 2 par une de 5 et une de 1.
De plus sio2=2, alorso1=0, sinon on remplace deux de 2 et une de 1 par une de 5;
o5<2, sinon, on remplace deux de 5 par une de 10.
o10<2, sinon, on remplace deux de 10 par une de 20.
Q
UE DIRE DE L’
OPTIMALE?
10∗o10+5∗o5+2∗o2+o1<=10+5+4<20 c=20∗o20+10∗o10+5∗o5+2∗o2+o1. Donco20 =c÷ 20=g20et
10∗o10+5∗o5+2∗o2+o1=c mod20.
De mˆeme, 5∗o5+2∗o2+o1 <10 donc o10=c mod20÷ 10=g10.
Donc 5∗o5+2∗o2+o1=c mod10;
Comme 2∗o2+o1<5,o5=c mod10÷5=g5et 2∗o2+o1 =c mod5
De mˆeme,o2= (c mod5)÷ 2=g2,o1=c mod5mod2=g1.
L
E GLOUTON EST-
IL OPTIMAL?
Pour ce syst`eme 1,2,5,10,20, la solution gloutonne est (l’unique) optimale.
Pour le syst`eme 1,2,5,10,20,50, la solution gloutonne est-elle optimale?
L
E CAS NON CANONIQUEQuand le syst`eme n’est pas canonique, comment calculer rapidement une fac¸on optimale de rendre la monnaie?
L
E PRINCIPE GEN´
ERAL D´ ’
UNE METHODE GLOUTONNE´
On est souvent dans le cadre de probl`emes d’optimisation, plus pr´ecis´ement:
On a un ensemble finiE.
Une solution est construite `a partir des
´el´ements deE: c’est par exemple une partie deEou un multi-ensemble d’´el´ements deEou une suite (finie) d’´el´ements deEou une permutation de Equi satisfait une certaine contrainte.
A chaque solution` Sest associ´ee une fonction objectifv(S): on cherche donc une solution qui maximise (ou
minimise) cette fonction objectif.
Le nombre de pi`eces
L
E SCHEMA G´
EN´
ERAL´
Il est bas´e sur un crit`erelocalde s´election des ´el´ements deE pour construire une solution optimale. En fait, on travaille sur l’objet ” solution partielle”- ”d´ebut de solution”- et on doit disposer de:
▶ select: qui choisit le meilleur ´el´ement restant selon le crit`ere glouton.
▶ complete? qui teste si une solution partielle est une solution (compl`ete).
▶ ajoutPossible? qui teste si un ´el´ement peut ˆetre ajout´e
`a une solution partielle, i.e. si la solution partielle reste un d´ebut de solution possible apr`es l’ajout de l’´el´ement. Dans certains cas, c’est toujours vrai!
▶ ajoutqui permet d’ajouter un ´el´ement `a une solution si c’est possible.
L
E SCHEMA D´ ’
ALGORITHME// on initialise l’ensemble des ”briques” des solutions.
Ens.init();
// on initialise la solution: ensemble (ou suite) ”vide” ou..
Sol.Init();
while(Non Sol.complete?() et Ens.NonVide?())do //on choisit x selon crit`ere glouton
x←Ens.select();
ifSol.ajoutPossible(x)then Sol.ajout(x); fsi;
//dans certains probl`emes, toujours le cas ifCertainesConditionsthen
Ens.retirer(x);
// selon les cas,xconsid´er´e une fois ou plus end
// la Solution partielle est a priori compl`ete returnSol;
L
E SCHEMA D´ ’
ALGORITHME// on initialise l’ensemble des ”briques” des solutions.
Ens.init();
// on initialise la solution: ensemble (ou suite) ”vide” ou..
Sol.Init();
while(Non Sol.complete?() et Ens.NonVide?())do //on choisit x selon crit`ere glouton
x←Ens.select();
ifSol.ajoutPossible(x)then Sol.ajout(x); fsi;
//dans certains probl`emes, toujours le cas ifCertainesConditionsthen
Ens.retirer(x);
// selon les cas,xconsid´er´e une fois ou plus end
// la Solution partielle est a priori compl`ete returnSol;
U
N EXEMPLE AVEC UN RAISONNEMENT TYPELe probl`eme:sont donn´eesndemandes de r´eservation -pour une salle, un ´equipement...- avec pour chacune d’entre elles l’heure de d´ebut et de fin (on supposera qu’on n’a pas besoin de p´eriode de battement entre deux r´eservations).
Bien s ˆur, `a un instant donn´e, l’´equipement ne peut ˆetre r´eserv´e qu’une fois!
On cherche `a donner satisfaction au maximum de demandes.
L
A FORMALISATION DU PROBLEME`
Donn´ee:
n–le nombre de r´eservations
(d1,f1), ...,(dn,fn)–pour chacune d’entre elles, le d´ebut et la fin- Sortie:les r´eservations retenues i.e.J ⊂[1..n]tel que:
. elles sont compatibles :i∈J,j∈J,i̸=j⇒di >=fj ou fi<=dj
. On satisfait le maximum de demandes, i.e.|J|(le cardinal deJ) est maximal.
U
NE INSTANCEDonn´ee:
n, le nombre de r´eservations=8
(3,8),(0,6),(1,4),(6,8),(4,7),(5,11),(7,9),(9,10) Sortie:
(3,8),(0,6), (1,4),(6,8), (4,7),(5,11), (7,9),(9,10)
Q
UEL CRITERE GLOUTON` ?
▶ dur´ee croissante?
▶ dur´ee d´ecroissante?
▶ d´ebut croissant?
▶ d´ebut d´ecroissant?
▶ fin croissante?
▶ fin d´ecroissante?
Q
UEL CRITERE GLOUTON` ?
SYMETRIE´
▶ dur´ee croissante
▶ dur´ee d´ecroissante
▶ d´ebut croissant ou fin d´ecroissante
▶ d´ebut d´ecroissant ou fin croissante
Q
UEL CRITERE GLOUTON` ?
SYMETRIE´
▶ dur´ee croissante
▶ dur´ee d´ecroissante
▶ d´ebut croissant ou fin d´ecroissante
▶ d´ebut d´ecroissant ou fin croissante
L’
ALGORITHME GLOUTONg=Vide;
Lib=0; //la ressource est dispo nb=0; //nb de r´es. accept´ees
trier les demandes par fin croissante;
pour chaque demande i si d_i>=Lib
//on peut la planifier {g.ajouter(i);
Lib=f_i;
nb++;}
co ˆut= celui du tri = enO(nlogn)
P
ARENTHESE`
On aurait pu tester tous les sous-ensembles possibles de r´eservations.
Il y en a 2n.
C
OMMENT PROUVER QUE L’
ALGORITHME EST CORRECT?
1. La solution est correcte, i.e. les r´eservations retenues sont bien compatibles: facile `a v´erifier par induction.
On prend pour invariant{les demandes de g sont compatibles et finissent toutes au plus tard `a Lib}.
2. La solution est optimale...?
C
OMMENT PROUVER QUE L’
ALGO EST CORRECT?
On d´efinit une notion dedistancesur les solutions.
Une solution est une liste de demandes accept´ees; on les suppose tri´ees dans l’ordre des fins croissantes.
Soient deux solutionsA,Bdiff´erentes; soitile plus petit indice tel queAisoit diff´erent deBiou tel queAi soit d´efini et nonBi
ou inversement. Alors on d´efinit la distance deAetBpar:
dist(A,B) =2−i
P
REUVE DE L’
OPTIMALITE DE L´ ’
ALGORITHMERaisonnons par l’absurde: Supposons que la solution gloutonnegne soit pas optimale.
Soit alorsoune solution optimale telle quedist(g,o)soit
minimale (une telleoexiste bien, l’ensemble des solutions ´etant fini).
Soit doncitelle quedist(g,o) =2−i; il y a trois possibilit´es:
C
AS1
gi̸=oi
alors, la demandeoia une date de fin au moins ´egale `a celle de gi: sinon comme elle est compatible avec les pr´ec´edentes, l’algo glouton l’aurait examin´ee avantgiet l’aurait choisie.
Mais alors, si on transformeoeno′en remplac¸ant l’activit´eoi
pargi, on obtient bien une solution, de mˆeme cardinal queo donc optimale, et telle quedist(o′,g)<dist(o,g): on aboutit `a une contradicition!
C’est ce qu’on appellela propri´et´e d’´echange.
C
AS2
ET3
Cas 2:oin’est pas d´efinie: alors|o|<|g|: contradiction,one serait pas optimale.
Cas 3:gin’est pas d´efinie: impossible car l’activit´eoi ´etant compatible avec les pr´ec´edentes, l’algo glouton l’aurait choisie.
Donc, dans tous les cas, on aboutit `a une contradiction;
l’hypoth`ese “la solution gloutonnegn’est pas optimale” est fausse: la solution gloutonne est bien optimale!
G
RAPHE D’
INTERVALLESOn peut mod´eliser les demandes par ungraphe d’intervalles:
un sommet est un intervalle, deux sommets sont reli´es si les intervalles correspondants se chevauchent.
On cherche un ensemble ind´ependant maximal.
Q
UELQUES VARIANTES DU PROBLEME`
Que se passe-t-il si on veut maximiser la dur´ee totale de r´eservation? Le crit`ere glouton par dur´ee d´ecroissante marche-t-il?
Que se passe-t-il avec plusieurs ressources?
C
OMPLEXITE´
La complexit´e est donc souvent de l’ordre den logn(le tri selon le crit`ere)+n∗f(n), sif(n)est le co ˆut de la v´erification de la contrainte et de l’ajout d’un ´el´ement. Les algorithmes gloutons sont donc en g´en´eral efficaces...
C
ORRECTIONEncore faut-il que l’algorithme donne bien une solution optimale... et qu’on sache le prouver...: l`a r´eside souvent la difficult´e dans les algorithmes gloutons.
Les preuves de correction d’algorithmes gloutons, sont souvent bas´ees sur une propri´et´e appel´ee de type ”´echange”:
Propri´et´e d’´echange: Soit une solution quelconque diff´erente de la gloutonne: on peut la transformer en une autre solution au moins aussi bonne et ”plus proche” de la solution gloutonne .
G
LOUTON VERSUSD
YNAMIQUEDans les deux cas on peut se repr´esenter l’ensemble des solutions sous forme d’un arbre, les solutions pouvant ˆetre vues comme une suite de choix.
Dans le cas de la programmation dynamique, on parcourt toutes les solutions mais on remarque que de nombreux
noeuds de l’arbre correspondent aux mˆemes sous-probl`emes et l’arbre peut donc ˆetre ´elagu´e, ou plut ˆot repr´esent´e de fac¸on beaucoup plus compacte comme un graphe (DAG: directed acyclic graph).
Dans le cas d’un algorithme glouton, on construit uniquement et directement-sans backtracking- une -et une seule- branche de l’arbre qui correspond `a une solution optimale.
L
AT
HEORIE´
Les algorithmes gloutons sont bas´es sur la th´eorie des matro¨ıdes.
E
XEMPLES CLASSIQUES▶ Les algorithmes de Prim et de Kruskal de calcul d’un arbre de recouvrement d’un graphe de poids minimal
▶ l’algorithme des plus courts chemins dans un graphe de Dijkstra
▶ le code de Huffman,
▶ de nombreuses versions de probl`emes d’affectations de tˆaches...
B
ILANPour mettre au point un algorithme glouton, il faut donc:
▶ Trouver un crit`ere de s´election: souvent facile ... mais pas toujours
▶ Montrer que le crit`ere est bon, c.`a.d. que la solution obtenue est optimale: souvent dur!
▶ L’impl´ementer: en g´en´eral facile et efficace!
B
ILAN DES3
PARADIGMESD
IVISERP
OURR ´
EGNER, D
IVIDE ANDC
ONQUERPb de taille n
taille n/k
n/k*k
cas de base
n/k*k
taille n/k
n/k*k n/k*k
cas de base La hauteur de l’arbre est ”petite”, en logn, la complexit´e d´epend du nombre et de la taille des sous-probl`emes `a chaque
´etape, du co ˆut de la recombinaison (Master Theroem)
P
ROGRAMMATIOND
YNAMIQUEPb de taille n
ss-pb
ss-pb
cas de base
ss-pb
ss-pb
ss-pb ss-pb
ss-pb
ss-pb ss-pb
Il y a de nombreux sous-probl`emes identiques.
P
ROGRAMMATIOND
YNAMIQUEPb de taille n
ss-pb1
ss-pb2
cas de base
ss-pb3
ss-pb 2
ss-pb ss-pb
ss-pb 4
ss-pb3 ss-pb5
Il y a de nombreux sous-probl`emes identiques.
P
ROGRAMMATIOND
YNAMIQUEPb de taille n
ss-pb1
ss-pb2
cas de base
ss-pb3
ss-pb 2 ss-pb 4
ss-pb 3 ss-pb 5
On transforme l’arbre en un graphe acyclique des
sous-probl`emes. Souvent de complexit´e polynomiale, mais parfois de degr´e assez ´elev´e, parfois pseudo-polynomial.
A
LGORITHMESG
LOUTONSD´epart
choix 1
choix 1.1 choix 1.2
choix 2
choix 2.1 choix 2.2
choix 3
choix 3.1
Le glouton fait ses choix localement pour ne pas explorer tout l’arbre.
A
LGORITHMESG
LOUTONSD´epart
choix 1
choix 1.1 choix 1.2
choix 2
choix 2.1 choix 2.2
choix 3
choix 3.1
Le glouton fait ses choix localement pour ne pas explorer tout l’arbre.
A
LGORITHMESG
LOUTONSD´epart
choix 1
choix 1.1 choix 1.2
choix 2
choix 2.1 choix 2.2
choix 3
choix 3.1
Le glouton fait ses choix localement pour ne pas explorer tout l’arbre.
A
LGORITHMESG
LOUTONSD´epart
choix 1
choix 1.1 choix 1.2
choix 2
choix 2.1 choix 2.2
choix 3
choix 3.1
Le glouton fait ses choix localement pour ne pas explorer tout l’arbre. Souvent tr`es efficace et simple `a ´ecrire, mais la preuve n´ecessite un peu de travail.
Fin de la premi`ere partie du Cours!