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é.