04.Paradigmes de résolution

publicité
Algorithmique P2
Les paradigmes de résolution – Suite
Renaud Dumont, Ulg
2009-2010
Glouton : Exercice 1
Vous souhaitez vous rendre de Liège à Brest en
scooter
Votre réservoir vous permet de rouler R Km
Vous connaissez la liste des pompes à essence
disponibles sur la route, donnée sous la forme
d'une liste : s[d1,d2,…,dk]
Chaque élément s[i] donne la distance qui le sépare de la
station précédente (ou du départ)
s[0] à d1 kilomètres du départ
s[1] à d2 kilomètres de s[d1]
Etc.
on suppose di <= R pour i=1..k, dk symbolisant l'arrivée
Glouton : Exercice 1
On souhaite faire le moins d'arrêts possibles
1. Ecrire un algorithme glouton en pseudocode résolvant le problème, càd renvoyant
la liste des pompes à essence où l'on doit
s'arrêter.
2. Donner une version en python de votre
algorithme
3. Pour un réservoir de 250 Km, tester avec la
liste [120,142,90,70,130,150,84,25,110]
Solution
1.
Algorithme glouton
ReFuel(liste_pompes)
<Le réservoir est initialement rempli>
Tant que "Brest n'est pas atteint"
i = prochaine pompe
Si "Plein nécessaire pour atteindre i+1"
Faire le plein
Ajouter i à la liste des pompes sélectionnées
Retourner la liste des pompes sélectionnées
Glouton?
Oui. A chaque étape, on effectue un choix permettant
d'atteindre la pompe suivante la plus éloignée (prob local global).
Remarque : il est tout à fait possible d'établir une solution basée
sur la programmation dynamique.
Solution
2.
Python (exemple)
def station(chaine):
r = 600
i=0
listefinale = []
while (i+1) < len(chaine) :
r = r - chaine[i]
if chaine[i+1] > r :
r = 600
listefinale.append(i)
i=i+1
return listefinale
Glouton VS Dynamique
Soit un voleur dévalisant un magasin
Variante "entière"
◦ Il trouve n objets
Le ième vaut vi euros et pèse wi kilogrammes (vi et wi entiers)
◦ Il dispose d'un sac à dos ne pouvant porter que W
kilogrammes (W entier).
◦ Exemple : lingots d'or de qualité différente
Variante "fractionnaire"
◦ Même principe mais le voleur peut prendre des fractions
d'objets
◦ Exemple : poussière de métaux précieux
Problème : quels objets doit-il emporter pour
maximiser la valeur des biens volés ?
Glouton VS Dynamique
Variante entière (prog. dynamique)
◦ Soit le chargement de valeur maximale pesant au
plus W kilos.
◦ Si on retire l'objet j du sac, le reste du chargement
doit être le meilleur que puisse prendre le voleur
pour un poids maximum de W-wj à partir des n-1
objets initiaux, l'objet j étant exclu.
Variante fractionnaire (algo glouton)
◦ Si on retire un poids w d'un objet j, le reste du
chargement doit être le meilleur qu'il puisse
prendre pour un poids W-w à partir des n-1 objets
initiaux et des wj-w kilos de l'objet j.
Glouton VS Dynamique
Exercice 2:
1.
Sur le cas simple ci-contre, illustrer la
solution optimale dans le cas
1.
2.
2.
3.
4.
5.
6.
sac à
dos
de la variante entière
de la variante fractionnaire
Donner un algorithme de recherche
exhaustive et sa complexité
Donner un algorithme utilisant le
paradigme de l'algorithme glouton
pour la version fractionnaire
Montrez que cet algorithme est
optimal
Donnez un contre-exemple montrant
que l'algorithme glouton pour la
variante entière n'est pas optimal
Donnez un algorithme résolvant la
variante entière à l'aide de la
programmation dynamique
produit
3
25 kg
dispo.
produit
2
produit
1
15 kg
10 kg
5 kg
v.ent.
v. frac.
30 €
6€/kg
50 €
5€/kg
60 €
4€/kg
Glouton VS Dynamique
1.
Solution optimale
1. pour variante entière
sac à
dos
produit
3
25 kg
dispo.
produit
2
produit
1
15 kg
p3
15 kg
10 kg
p2
10 kg
5 kg
v.ent.
30 €
50 €
60 €
v. frac.
6€/kg
5€/kg
4€/kg
110 €
Glouton VS Dynamique
1.
Solution optimale
2. Pour variante fractionnaire
sac à
dos
10 kg
p3
produit
3
25 kg
dispo.
produit
2
10 kg
p2
produit
1
15 kg
10 kg
5 kg
5 kg
p1
v.ent.
30 €
50 €
60 €
v. frac.
6€/kg
5€/kg
4€/kg
120 €
Glouton VS Dynamique
2.
Algo Recherche exhaustive
◦ Il y a N objets, donc 2N combinaisons possibles
◦ On teste toutes ces combinaisons afin de trouver
celle de valeur maximale de poids total inférieur ou
égal à W
◦ Complexité O(2N)
Glouton VS Dynamique
3.
Algo glouton (Fract.)
◦ Trier les objets selon leur valeur décroissante au
kilo
◦ Prendre la plus grande quantité de l'objet de plus
grande valeur au kilo
Si le sac à dos le permet, on prend l'entièreté de l'objet
puis on recommence avec l'objet suivant jusqu'à ce
que le sac soit plein
Sinon la quantité nécessaire pour le remplir
Glouton VS Dynamique
4.
Algo glouton optimal ?
◦ Soit la solution construite (G) et une solution optimale (S).
◦ Les objets sont triés par valeur au kilo décroissante.
◦ Pour le premier objet dont les quantités diffèrent, on
rajoute dans S la quantité manquante de cet objet
◦ On retire alors un poids égal en objets de valeur au kilo
inférieure
Cela est toujours possible vu l'ordre de comparaison de G et S.
◦ Comme dans le cas de la location de voiture, cela conduit
à modifier un élément dans la solution optimale. La suite
de la démonstration est équivalente et notre solution sera
donc optimale.
Glouton VS Dynamique
5.
Contre-exemple algo glouton et variante
sac à
entière
dos
espace
perdu
produit
3
25 kg
dispo.
produit
2
10 kg
p2
produit
1
15 kg
10 kg
5 kg
5 kg
p1
v.ent.
30 €
50 €
60 €
v. frac.
6€/kg
5€/kg
4€/kg
80 €
Glouton VS Dynamique
6.
Algo Programmation dynamique
◦ Soit une récurrence définissant la valeur du butin
emporté.
◦ B(i,w) représente la valeur maximale du butin
composé de certains des i premiers objets
ici, les objets ne sont pas ordonnés (uniqu. numérotés)
et qu'il pèse au maximum w kilos.
Glouton VS Dynamique
◦ On a plusieurs cas à considérer :
Le ième objet est plus lourd que la capacité du sac
on ne peut pas le prendre
le problème revient à rechercher le meilleur butin parmi les i
-1 premiers objets
Il est possible de prendre le ième objet :
On ne le prend pas
Le problème revient à rechercher le meilleur butin parmi les i 1 premiers objets
On le prend
la valeur du butin est celle du ième objet + celle du butin
constitué à partir des i-1 premiers objets
Le poids portable pour la suite du calcul est diminué du poids
de l'objet i
La (non-)sélection du ième objet permettra de maximiser la
valeur dérobée.
Glouton VS Dynamique
On obtient alors l'équation suivante :
◦ B(i,w) =
B(i-1,w)
si wi>w
Max(vi+B(i-1,w-wi),B(i-1,w)) sinon
On tire de cette équation l'algorithme de
programmation dynamique qui suit.
Glouton VS Dynamique
SaD(W, n, (w,v)) {Poids du sac, # éléments, liste des éléments}
pour w 0 à W
B[0,w] = 0
pour i 1 à n
B[i,0] = 0
pour i 1 à n
pour w 0 à W
si wi > w
alors B[i,w] = B[i-1,w]
sinon B[i,w] = Max(vi+B(i-1,w-wi),B(i-1,w))
Que fournit cet algorithme ?
◦ Il renvoie la valeur maximale du butin emporté (B[n,W])
Comment connaitre les éléments contenus dans le sac ?
◦ Au départ de B[n,W]
Si B[i,k] != B[i-1,k], l'élément i est dans le sac à dos
Sinon, il n'est pas emporté.
Téléchargement