Aller au contenu

Algorithme glouton

Glouton

I. Découverte⚓︎

Glouton

Les algorithmes gloutons ou "greedy algorithms" forment une catégorie d’algorithmes permettant de donner une solution à des problèmes d’optimisation qui visent à maximiser/minimiser une quantité (GPS (plus court chemin, temps minimum, côut minimum) - plus petit temps d’exécution, meilleure organisation d’un emploi du temps, ....)

Principe d'un algorithme glouton

Un algorithme glouton est un algorithme qui suit le principe suivant :

  • résout le problème étape par étape, en faisant un choix optimum local dans l'espoir d'obtenir un résultat optimum global.
  • Ce choix d'étape n'est jamais remis en cause lors des étapes suivantes.

Un exemple⚓︎

grille

Sur la grille ci-dessus, on part de la case tout à gauche marquée de la lettre D. On souhaite atteindre les cases vides sur la partie droite en se déplaçant de case en case. Lorsqu'on est sur une case on peut se déplacer sur une des deux cases voisines situées sur la droite. On note S la somme de toutes les cases traversées.
Par exemple on peut effectuer la trajectoire suivante (on ne note pas la dernière case, qui est vide) : D - 7 – 5 – 3 – 5 – 7 – 9 – 8 – 9 – 6 qui conduit à S = 59.

🤔 On cherche à effectuer la trajectoire qui rend la somme S la plus petite possible. Pour cela, on va utiliser un algorithme glouton. * A chaque étape, nous choisissons le plus petit nombre. * Nous ne revenons jamais en arrière.

trajectoire gloutonne

Quelle trajectoire et quelle somme S obtenez-vous sur cet exemple avec votre algorithme glouton ?

Solution

D – 4 – 4 – 2 – 5 – 7 – 7 – 8 – 8 – 1

S = 46

Trajectoire optimale

Sur cette grille, en cherchant bien, la trajectoire optimale donne une somme S = 23. Déterminer le chemin correspondant

Solution

D - 4 - 4 - 3 - 2 - 3 - 1 - 3 - 1 - 2

Algorithme par force brute

Pour obtenir la solution optimale de façon certaine on souhaite trouver toutes les trajectoires possibles et calculer pour chacune d'elles la somme associée.
On doit faire 9 déplacements, et à chaque déplacement on a deux possibilités.
On a donc \(2^9=512\) trajectoires différentes. Il faudrait donc calculer la somme pour chacune de ces 512 trajectoires différentes.
🌵 Cette méthode est exacte, mais beaucoup plus coûteuse en termes de calculs.

II. Le rendu de monnaie⚓︎

Situation :
Dans le pays nommé New Land, la monnaie est constituée de pièces de 4 nl, 3 nl et 1 nl.
L’unité de monnaie est le newland, symbolisé par nl.
Alice et Bob sont deux commerçants qui disposent dans leur caisse de beaucoup de pièces de chaque type, mais ils veulent rendre la monnaie en utilisant le moins de pièces possible.

1. La méthode de Bob : algorithme glouton⚓︎

La méthode gloutonne

Bob a une idée : il se dit que plus il rendra de pièces de grandes valeurs, mieux cela sera.

Pour donner 10 nl :

  • Il donne une pièce de 4 nl, il lui reste à rendre 6 nl,
  • puis il donne une pièce de 4 nl, il lui reste à rendre 2 nl,
  • puis il donne une pièce de 1 nl, il lui reste à rendre 1 nl,
  • puis il donne une pièce de 1 nl, il lui reste à rendre 0 nl.

La fonction monnaie_Glouton prend en paramètre un entier qui est le montant en nl, et renvoie la liste des pièces correspondantes, obtenue par l'algorithme glouton.

Exemple

🐍 Console Python
>>>monnaie_Glouton(6)
[4, 1, 1]
>>>monnaie_Glouton(9)
[4, 4, 1]

Compléter ci-dessous

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.1280130ldCy1,4-]k/weibmc_:35aPrG 7=9o[fIgt28;6sShE)(pu.nv050d0o0K0x0p0c0P0B0s0c0x0P0P0D010K0p0V010406050P0W0r0r0x0z0f040Q0F0c0W0@0F0Y050m0~1012140|0V04051k1d1n0m1k0|0d0p0Z0,0.0:0=0R0p0J0R0c1B0R0K0`050%0q0c0o1w0/0;011A1C1E1C0K1K1M1I0K0z1l0K0R0,170P0V0x0Y0=0L011O1y010H0)0o0Y0x0r0o1I1+1-1=1Q1^1M1{1}0`0a0B0y0z0F0V0F0P0p1a0Y0B0#1)0z0z0o0s2i1d200Y1l0m1%2v1!1$1#1J0d220=1E0Y1`2f1I1t1v0-1P2F0p2H0Y0F2L1I0V2o1l2t2v2Z0}1,2j2N1?2S0z110c0`0B0g2s2%0{2$212)1Q2+2-2/0L2=1-2@2t2E012|0x2.040B0v302u0|332`0=36380B0i3c322%343i2/0w3m3e3o3g350F2,372/0O3t2^2(1x2{3y2}390C3D3f3G3h3I3A390M3M3v3O3x3z3j0E3U2_3W3q040g0b3m1o2X1d2L2y0d1$2D3w0s2T1~1l3:1m3.2#1e2?053_0#2Y3V2O350`0y0I0S0e0S0Q3m0B3E340F0`0D4h4j3w0_040G3,3N480r0p0`3l41314p3W4r0h4o4v1?4x0`3b4B2u4D484F4H474J4y3)4u4T1Q4r0k3t3u3$480l0`0#0H4S4(2*0H0`0r1b1{0p0o0t0A0c0F191b4X4/4Z0`0U513F480Y4=1b0%0Y0K56344r0T0u3t0B5l4i4I2{0`0x0t2o0Y0d2o4.571?4l044n4N394P2*5a5d1-5e5D065m5n4Y3h0`1E0P0K0o5x4k4m5W4q0`0G4#5L5N5F1Q4*040H3y5Z3%0`0V4_0s5V5D5O520=0F0n0`2Q5:584a4c4e4g5D5*0=4r5j5(5N5m69015,0n1A1M625G045r5t5v5_2Z5{5y1Q5A020J0K0N5C6t6g59045?2p6s425o6a0`6c2Z5M6e6R6E5R0p5T6J4C6L015A0X5f3w6F0x0V0V1`0d6%4E546/636G5@6X4O6Z5h5k6R6e6T6o5s6-5w5`6g5A6C2?6u3p5q725u746D6Z5A0j6m5p6@6I6}5l6g5,2o0K0W0z1c756Z6F5S5U3D0m440o2v2W7F3/1u3;2y2B2w0x1L7I0m3:0|7S0$0(0*04.

2. La méthode d'Alice : La force brute⚓︎

La méthode par force brute

Alice est très méthodique. Elle va chercher toutes les possibilités dont la somme correspond, puis ensuite elle prendra celle qui correspond au plus petit nombre de pièces. Cette méthode, qui consiste à chercher toutes les possibilités s'appelle une méthode par force brute. Le nombre maximal de pièces est la somme totale (si on la donne uniquement avec des pièces de 1)

La fonction possibilites renvoie une liste de listes. Chaque liste donne une possibilité pour rendre le montant.
Par exemple [1, 0, 2] signifie qu'on rend une pièce de 4, 0 pièce de 3, et 2 pièces de 1.

Exemple

🐍 Console Python
>>> possibilites(6)
[[0, 0, 6], [0, 1, 3], [0, 2, 0], [1, 0, 2]]

La fonction monnaie_brute renvoie un tuple dont le premier élément est la liste optimale comme décrite ci-dessus, et le deuxième le nombre de pièces.

Exemple

🐍 Console Python
>>> monnaie_brute(6) 
([0, 2, 0], 2)

Compléter les fonctions :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.1280130ldCy1,4*]kj/weibmc:_35aPr+ 7=9o[fIgt28.6sS;h)E(pèunxv050d0p0L0y0q0c0Q0C0t0c0y0Q0Q0E010L0q0X010406050Q0Z0s0s0y0A0f040R0G0c0Z0`0G0!050n111315170 0X04051n1g1q0n1n0 0d0q0$0/0;0?0^0T0q0K0T0c1E0T0L0}050*0r0c0p1z0=0@011D1F1H1F0L1N1P1L0L0A1o0L0T0/1a0Q0X0y0!0^0M011R1B010I0,0p0!0y0s0p1L1.1:1^1T1{1P1~200}0a0C0z0A0G0X0G0Q0q1d0!0C0(1,0A0A0p0t2l1g230!1o0n1*2y1%1)1(1M0d250^1H0!1}2i1L1w1y0:1S2I0q2K0!0G2O1L0X2r1o2w2y2$101/2m2Q1_2V0A140c0}0C0g2v2*0~2)242,1T2.2:2=0M2^1:2`2w2H012 0y2;040C0w332x0 362}0^393b0C0i3f352*373l2=0x3p3h3r3j380G2/3a2=0P3w2{2+1A2~3B303c0D3G3i3J3k3L3D3c0N3P3y3R3A3C3m0F3X2|3Z3t040g0b3(3I2R3!3M0g2@1h2_3x3)3;3+0g323_343{3:2-3T3b0g3e413g3H3s460}0g3o4a3q3|453#4f3v4i434d4m3,3F4p4c3z3~3O4i1r2!1g2O2B0d1)2G3z0t2W211o4E1p4C2(4A4K0(2#3Y3;0l0}0(0I3p0C4w3*0I0}2h0?0q0r0,2k0p0Q3p4(3;0|040W4@3Q3}0}0s1e0*0!0L4}4W1_4`0U0u3w0C5d4%4~2-0}2r0!0d2r4$4^1_0G0}0E5n5g1T4`0H0k5c5e5o1T4Y040I3B5t572~0}0q5H4k1T0G0o5K1f4i5f5I3k0r5i1:0K0p565N0^4`4|4A5u3k50521:555T5B0^5q040B5M441T0s0q4f5$5|5(0}5a5{370t0g0}030C0y0Z0C0X1b0.51545:6f0q0Y0t4=0C0W2o0g6f150C0p0#0p0s6g0p0U5z5e5A5,015D5F0A664x0}0m6N3Z5P5R6R3}5X040A5Z5#5+5V015)613s5.6k546V5p0}5`5=6I5~606$5%6(645b4p6G706H6%6K5G6?6%0!0}0l6/5O5Q042T7b5W5Y0!5!6*3z6)6`62386,535;2$5U6{5^6=7u5?016^3,7l3Z596~2$06717K726{5D0q4#766{787e7E3;5^0j7V5h040z0J0V0e0V0R7Z5v0}0H7,0^7C3.7o374`5y7R7p7x7g7q046Q7@3z7X7:7 7$7(7*855w857C3^2(6I7_7~7}7{6+047a826S0}7Y8o4 7#7%7)7+8s587.8c5 04408f6%8h8k835r5s8I3*7r5:7~4`7H3`7L8U7M7p7T5j5l6#8F7w0}0O857T0y0X0X1}0d8a0}0W7/8y5J7U8^63040h7~7T818$7p4`8~8M8t8n927^0}0k6E6 8W375D2r0L0Z0A5S7z6I8Y8/5m4p4q3z5D4!8 4*046j1~0q0p0v0r0A1c8#2_7A7n996O9z5/6.8{6|04659e5d7A7T4,2j1O4=8i5r8 4+2i9!4:0L9$9R9L9J9o8O9Q9M7F646F7v8X6X5~9m2_9}375^8L9n779@7t8T9f9u0}6L9)041H0Q9.8i7d7f967!9Z4.1P4?9:0}8S427L7A7O7Qa77S6X1i8;4{8*0}aiakau9T9%04020c0L0S8 9 an9_4_av9|ay9?6Y4=0ZaR0yaa34a38J04a6a29XaJ0qaj9Iax8Va.3*aVa1a-7Aa5aU0}aFaM5*aX7!aKa`2x9K9{9Va}4X5i0)9kb02xbh8zaH9R9p11a*a,bd8g0}95aC9~50aW9=8Gbf7I1g4T0p2y2ZbK4D1x4F2B2E2z0y9#2y4E0 0n0(0*0,0Q04.

Comparaison des méthodes⚓︎

Le moins de pièces possibles à rendre

Comparer le résultat obtenu pour la méthode par algorithme glouton, ou par force brute pour le cas d'un rendu de monnaie de 6 nl, 10 nl, 22nl . Que constatez vous ?

Solution
montant algorithme glouton (liste triée) algorithme par force brute (liste triée)
6 [1, 1, 4] [3, 3]
10 [1, 1, 4, 4] [3, 3, 4]
22 [1, 1, 4, 4, 4, 4, 4] [3, 3, 4, 4, 4, 4]

L'algorithme glouton donne un résultat très rapidement, mais il n'est pas forcément optimal.

3. Utilisation d'un algorithme glouton récursif⚓︎

On s’intéresse à un algorithme récursif qui permet de rendre la monnaie à partir d’une liste donnée de valeurs de pièces et de billets.

Le système monétaire est donné sous forme d’une liste :

VALEURS = [100, 50, 20, 10, 5, 2, 1].

On suppose que les pièces et billets sont disponibles sans limitation.

On cherche à donner la liste des valeurs à rendre pour une somme donnée en argument. L’algorithme utilisé est de type glouton.

Compléter le code Python ci-dessous. La fonction rendu_glouton prend en paramètre un entier a_rendre qui est la somme à rendre, et un entier rang, qui correspond à l'indice du tableau VALEURS à partir duquel on peut prendre les valeurs du tableau VALEURS. Cette fonction renvoie la liste des pièces à rendre par l'algorithme glouton. On garantit que la somme à rendre est supérieure ou égale à 1.

Exemple

🐍 Console Python
>>> rendu_glouton(67, 0)
[50, 10, 5, 2]
>>> rendu_glouton(291, 0)
[100, 100, 50, 20, 20, 1]
>>> rendu_glouton(291, 1)  # On ne peut utiliser que les valeurs de VALEURS[1:]
[50, 50, 50, 50, 50, 20, 20, 1]
>>> rendu_glouton(33, 3)  # On ne peut utiliser que les valeurs de VALEURS[3:]
[10, 10, 10, 2, 1]
Compléter

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.1280130ldy1,4-AL]k/Ueibmc_:35aPr+ 7=o[fgt28V6sSR;h)E(punv050d0p0J0y0q0c0O0C0t0c0y0O0O0E010J0q0W010406050O0X0s0s0y0A0e040P0F0c0X0@0F0Y050n0~1012140|0W04051k1d1n0n1k0|0d0q0Z0,0.0:0=0S0q0I0S0c1B0S0J0`050%0r0c0p1w0/0;011A1C1E1C0J1K1M1I0J0A1l0J0S0,170O0W0y0Y0=0K011O1y010H0)0p0Y0y0s0p1I1+1-1=1Q1^1M1{1}0`0a0C0z0A0F0W0F0O0q1a0Y0C0#1)0A0A0p0t2i1d200Y1l0n1%2v1!1$1#1J0d220=1E0Y1`2f1I1t1v0-1P2F0q2H0Y0F2L1I0W2o1l2t2v2Z0}1,2j2N1?2S0A110c0`0f2s2%0{2$212)1Q2+2-0`0K2;1-2?2t2E012{0y2.040w2 2u0|322_0=35370h3a312%333g0`0x3j3c3l3e340F2,360`0N3q2@2(1x2`3v2|040D3A3d3D3f3F3x040L3j1o2X1d2L2y0d1$2D3t0t2T1~1l3V1m3T2#1e2=053#0#2Y3s3L010m0`0#0H3j0C3B3m0H0`2o0Y0d0X0u0I0c0F191b3R3K2O010_040V4d3?4f0Y0`0y0u430d2o4k2^3@4h0g3}3 3t4n040A1-0I4u3C4f4h0T0v3q0C4O3~4e1?3_040q3|3-304Q4l2*4o4q1`4s0p4z4R1Q0F0`0E0E4+4!1Q0s0q0`0b4H334h4M4X3b4P524Z4v4f4T2o0J0X0A1c5004544I1?4h0G0l4N4P4A3@4C0Z4=551?4.044;5d5f3m0`0M0j0k0U0o0Q0P4|3t5i5I5o424F5L4J0`5k5d06525n560`4V5r5g2`0`5q5x5W5t0`020c0J0R5w2Z5y4B4$4r4t5)4,0=4~5l535?3@570$5a5c5=5*1Q5K5d683f5%5P5h5R5!335u0B6i5@4D4(46484a0J4c6b5|4g0`4j6v4?6d044p5_4*5{6B015u0i6m5M045(2#6w4x6M4m5N0Y4G6A5s690`0T5 615X040p0*6G676R0`4 2Z5U606(4S42645b6T4#6o446q494b663.6/4i6f5$6D4%445`6Q6I6S6H6Z6C4E6W6}4-0`6l7h5#0=4^2/785}6#3A0n3:0p2v2W7B3U1u3W2y2B2w0y1L7E0n3V0|7O0$0(0*04.
Astuce

Avez-vous pensé à la concaténation des tableaux ?

III. Le problème du sac à dos ("Knapsack Problem")⚓︎

sac

Le problème est celui-ci : vous disposez d'un sac d'une contenance limitée (sur le dessin ci-dessus, 15kg) et vous souhaitez maximiser la valeur totale des objets que vous mettez dans votre sac. Evidemment, la somme de leur masse ne doit pas dépasser 15 kg.

Ce problème (de la catégorie des problème dits d'analyse combinatoire) malgré sa simplicité est un problème majeur d'optimisation.

Actuellement :

  • On sait trouver LA meilleure solution, mais en explorant toutes les combinaisons une par une. Cette méthode par force brute est inapplicable si beaucoup d'objets sont en jeu.
  • On sait facilement trouver une bonne solution, mais pas forcément la meilleure, par exemple en adoptant une stratégie gloutonne.
  • On ne sait pas trouver facilement (en temps polynomial) la meilleure solution. Si vous y arrivez, 1 Million de $ sont pour vous.

1. Petite aide technique avant de commencer⚓︎

Tri par deuxième élément

Supposons qu'on dispose d'une liste mylist = [["A",3], ["B",2], ["C",8]].

Comment classer les éléments de cette liste par leur deuxième élément ???

Nous allons procéder en 2 temps :

  • création d'une fonction qui renvoie le deuxième élément d'un objet liste
  • tri de la liste grâce à cette fonction
Tester ci-dessous

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

Il s'affiche : [['C', 8], ['A', 3], ['B', 2]]

2. Retour sur le problème du sac à dos⚓︎

On considère un sac de 40 kg et les objets suivants :

objet A B C D E F
masse 13 12 8 10 14 18
valeur 700 500 200 300 600 800

Quels objets faut-il prendre ?

Stratégie gloutonne

  • on va classer les objets dans l'ordre décroissant de leur taux de valeur (taux de valeur = valeur / masse). Ainsi le premier élément de la liste sera celui ayant le meilleur rapport valeur/masse.
  • on prend le premier élément de la liste, puis le deuxième, etc., tant que le sac peut encore les contenir.
trier dans l'ordre décroissant de leur taux de valeur

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013ldTyB1,4]kj/wJeibmc:_35qaPr =9o[fgt2;sSOh)(Epunxv050c0p0J0z0q0b0M0C0t0b0z0M0M0D010J0q0T010406050M0U0s0s0z0B0e040N0F0b0U0=0F0V050m0|0~10120`0T04051i1b1l0m1i0`0c0q0X0*0,0.0:0P0q0I0P0b1z0P0J0^050#0r0b0p1u0-0/011y1A1C1A0J1I1K1G0J0B1j0J0P0*150M0T0z0V0:0K011M1w010H0%0p0V0z0s0p1G1)1+1:1O1?1K1_1{0^0a0C0A0B0F0T0F0M0q180V0C0Z1%0B0B0p0t2g1b1~0V1j0m1#2t1Y1!1Z1H0c200:1C0V1^2d1G1r1t0+1N2D0q2F0V0F2J1G0T2m1j2r2t2X0{1*2h2L1;2Q0B0 0b0^0g2q2#0_2!1 2%1O2)2+0^0K2/1+2;2r2C012_0z2,040w2}2s0`302@0:33350i382 2#313e0^0x3h1m2V1b2J2w0c1!2B3c010t2R1|1j3s1k3q2Z1c2:053z0Z2W3j3x0k0^0Z0H3h0C2=2$1v2^0H0^0B0z183o3b3X0:0@040R3(3N3*320^0F0r0l0!3/2?3;3,0Q0u3h3a3:2M010n0^0C483U3H2~3V310M0c0^020y0U0F0J0L4i4k4m4o4l0L2m0V0X0F0q1L1K0C3#0T2c0B0J0C2U0q0W1o4x0c0)0c02030w0E0L0U2h3@3_0J4r4q4j4s4!0L41493U3)443P042m0J0U0B1a4b2s4,432(3?3^3`4_3M3|443,0G3{3W440s0q2{57313,0j3T4d3x0F0^0m5h4-4}044X502Z5o1O555d3x5a2-5x3}0^5g510642535p5r0J0M0v1Y4y0M5n4|1O5k040D5R5I2^0r0^0M0F4F0p0c5B540^3.515i3;0V0^0O0f0o0S0d0N5+1;3,0h5X585p0k0p0e5}5T0^5W5/5u3d3!3$0q0F673+0^60514{5Y6d4:0p0X0p0B0M0p6i015U6a5t5S0:0k0t0^0d0B0U6w6b6C013~411b3K0p2t2U6S3r1s3t2w2z2u0z1J6V0m3s0`6)0!0$0(04.
Résoudre le problème par la méthode gloutonne

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.1280130ldTy1,4]kj/weibmc_:35aPr+ 7=9o[f.gt28;6sSh)(punxv050d0o0K0x0p0c0P0B0s0c0x0P0P0D010K0p0U010406050P0V0r0r0x0z0f040Q0F0c0V0?0F0W050m0}0 11130{0U04051j1c1m0m1j0{0d0p0Y0+0-0/0;0R0p0J0R0c1A0R0K0_050$0q0c0o1v0.0:011z1B1D1B0K1J1L1H0K0z1k0K0R0+160P0U0x0W0;0L011N1x010H0(0o0W0x0r0o1H1*1,1;1P1@1L1`1|0_0a0B0y0z0F0U0F0P0p190W0B0!1(0z0z0o0s2h1c1 0W1k0m1$2u1Z1#1!1I0d210;1D0W1_2e1H1s1u0,1O2E0p2G0W0F2K1H0U2n1k2s2u2Y0|1+2i2M1=2R0z100c0_0B0g2r2$0`2#202(1P2*2,2.0L2;1,2?2s2D012{0x2-040B0v2 2t0{322_0;35370B0i3b312$333h2.0w3l3d3n3f340F2+362.0O3s2@2%1w2`3x2|380C3C3e3F3g3H3z380M3L3u3N3w3y3i0E3T2^3V3p040g0b3l1n2W1c2K2x0d1#2C3v0s2S1}1k3/1l3-2!1d2=053^0!2X3U2N010k0_0!0H3l0B3D3o0H0_0P0x0s3+3M470^040T4m462)0_0F0q0l0#0P4s3#4o0_0h4d4f3v0W0_2d0p0d0P0t100X4B3E4D040S0u3s0B4Z4e4n4u040q182P4G4$1P0F0_0D4,4t1P4p0G0j4Y4!4H3$4K0F4M4O4j4l40304#4?0;4/044;552t574C1=0r0p0_3*5d0`4!5f4T4%4w4y0K4O1Z0p0o4A5m5p335a5c2Y5B4I0q4i3x0K0o0d4S334p4r5m4}474J045s4z5O3v4p4F5A5T4%0k0o0f5Z3V5D5-5U0_0z0x195:1=5#4=5g2`5=0o0Y0o0z0P0o5_4.4:660;0k0s0_0e0z0V655S4-0;4p0S4{4Z5(1P49040H3x5|5q5~5W4x0#6v5C0n0_4+5%6j344v6z5u0t5w5y69014p4X5m065o5o6p3g4 510t5X0K6B3v5/6G586I6y5t6P4^6P5i0_2:6i6,4p4`6T6V4|6H6r0p4c6+5}6Y044L4N6#6K6(5.0_0A7c5;775079537g1=5a020c0K0N7m6x784O4Q7t6k0_6S2Y6U6~6V6X6-4)0?1b6_75015a0I6P5V0x0U0U1_5N7L6w7z4q7Q6J6/7X5P0_0G6=5j045l2!6H6{6m6}7E6W6H5V7v0t7l747Y7N7e5E2=5G4~7i6!6$6n85476r2n0K0V0z7K5F7G5V7I6F7C1c430o2u2V8r3.1t3:2x2A2v0x1K8u0m3/0{8E0#0%0)04.
Solution

Il faut donc choisir la combinaison A, F, C. Elle est bien valide (poids 39) et rapporte 1700.

Question

L'algorithme glouton nous a-t-il donné la solution optimale ?
Nous allons pour cela avoir recours à la force brute pour tester toutes les combinaisons possibles.

3. Force brute⚓︎

La méthode par force brute

Nous allons chercher toutes les possibilités pour lequel le poids total est inférieur au poids total autorisé, puis ensuite nous chercherons la possibilité qui donne la valeur totale maximale. Cette méthode, qui consiste à chercher toutes les possibilités s'appelle une méthode par force brute.

La fonction possibilites prend en paramètres la liste objets et l'entier poids qui est le poids maximal. Cette fonction renvoie une liste de listes. Chaque liste donne une possibilité de choix d'objets Par exemple [1, 1, 0, 1, 0, 1] signifie qu'on prend l'objet A, le B, pas le C, le D, pas le E et le F.

Exemple

On a :

🐍 Script Python
objets = [["A", 13, 700], ["B", 12, 500], ["C", 8, 200],\
["D", 10, 300], ["E", 14, 600], ["F", 18, 800]]
Appel de la fonction possibilites

🐍 Console Python
>>> possibilités(objets, 15)
[[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0]]
>>> 

La fonction butin_brut renvoie un tuple dont le premier élément est la liste optimale comme décrite ci-dessus, et le deuxième le magot obtenu.

Exemple

🐍 Console Python
>>> butin_brut(objets, 25)
([1, 0, 0, 1, 0, 0], 1000)

Compléter les fonctions :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Ctrl+Clic pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.1280130ldy1,4*]kjé/weibmc:_35aPr 7=9o[f.gt28;6sSh)(punxv050d0p0K0y0q0c0P0B0t0c0y0P0P0D010K0q0U010406050P0V0s0s0y0A0e040Q0F0c0V0?0F0W050n0}0 11130{0U04051j1c1m0n1j0{0d0q0Y0+0-0/0;0R0q0J0R0c1A0R0K0_050$0r0c0p1v0.0:011z1B1D1B0K1J1L1H0K0A1k0K0R0+160P0U0y0W0;0L011N1x010H0(0p0W0y0s0p1H1*1,1;1P1@1L1`1|0_0a0B0z0A0F0U0F0P0q190W0B0!1(0A0A0p0t2h1c1 0W1k0n1$2u1Z1#1!1I0d210;1D0W1_2e1H1s1u0,1O2E0q2G0W0F2K1H0U2n1k2s2u2Y0|1+2i2M1=2R0A100c0_0B0f2r2$0`2#202(1P2*2,2.0L2;1,2?2s2D012{0y2-040B0w2 2t0{322_0;35370B0h3b312$333h2.0x3l3d3n3f340F2+362.0O3s2@2%1w2`3x2|380C3C3e3F3g3H3z380M3L3u3N3w3y3i0E3T2^3V3p040f0b3!3E2N3W3I0f2:1d2=3t3#3-3%0f2~3=303@3,2)3P370f3a3}3c3D3o420_0f3k463m3^413X4b3r4e3 494i3(3B4l483v3`3K4r3M3_4a3(3S4w3U4y4o0f3Z4C4g3G4o0L3*4I404K3I0L3;2Y4m4t4z0L3|4U4s3$4X454!4x4h4R4d2!1p2W1c2K2x0d1#2C3v0t2S1}1k4=1l4:4.2!4{0!2X4D1=0k0_0!0H3l0B4#3_0H0_2d0/0q0r0(2g0m0P3l5f1=0^040T5r4*2`0_0F0r0l0#5q4e5s1P5u0g5d5H3g5i0F0q0d5F2!5y0;5u0S0u3s0B5!5e5U345i2n0W0d2n5L5%0F0_0D5.575I0_0G0j5Z5#5M0159040H3x5?4J5N040q4T2=5$5@0;0F0o0_2P644P3g0r0_0A1,0J0p5x6c015u5w5G5%0s0q0_4Z2=5~5W5Y4l5#6H6b655 0_620A6i3o6g6B306J6j016e6g1b4e6U3o6l046n0W6p6r6K6u6,6V6y6A6/336E5|6I6I5~606N6P4t6g4(6a5~6X676Z2Y6#4t6%6)6+6w6s6.7e6K6;046S2t6D0_5X6_6`7r6|6M636!5~0W6g4-735/6f766 3$7b6o6q7h6V7g5T6s7j7l566-7o6F4U7r7W6{5%6}7v787x6g4k7$7C6Y7F3_7H6*7J7N7S5v6?3v7P7^3V6^6G7X7 6H7t617#7B6s7y674q7*6s756h7w5%0W7/7d7=7L0_6v8j337`7K6@7T7q808u793$6m0p2d0W0P7;856K5:045=8e7f5_7{3_6g69307n045K8J6K870q7Q8R8T8a8V718M5t0_8!8E6V8W7A8Q5%5J7-2)7(8(5^8S8?5z888_5V0_5{7~8v8v7%042d5Q0P0v2n8A8C8|6d5;9f346%1e8 6t8l0G9m879c1a9e8q3v5u9p9v8x679m5u928n3v8G0i9q5A5C5E9C8L9z8N9B9P8)040j9y9F3V7j8P7m8;919i7!6O8U8-6g9i8c778,6$6m7I9N7@9S1P7j896C9$040S0j0S8t947X820q5c9+6Q975P5R9b8z9t8D6T740_020c0K0N9i87985R9^7U3?a5ax8w9Q2V1_5,ai9#8b0_0I9J040y0U0UaC9^0T9W9~868O9^8+aj8f6RaVaq8%9`908{aa70678/aF7?aW2taz8@677)aSa/a#8~a%9n9Ua393a=1P602n0K0V0A9:aXaT975*aD3s4V3V605baq5h040r182P0v0r0A18aPaJ5B5D0K5Sa_8ka)8#9,ac999^7pb1965j2f1K0pbzba8F9ha*9AbL5l5n0K5pbua}87bw9Ma}8=bTaAadbPa.bBb07V5}8f6%100X9.bSbD8o6z044Nb=5!962n0}an0y0Kb{8H9i9x9Eawb?6s9)a{1D0P0KaE38747D8db}a+bVbNb.7RbBav3~7W96116p0Wc9b+1=8G8Ics7G0_9lb)9oaJckcm9^aR8:bb0q9^cecWbR049Ib#9Kbxcw8RcVb/abcYcP9Uc.cxb~6=c=c!a;826~cH8}c;cL3-9/aq8hcn8R8mbAc_049}c#b:a2a4c37Z6ga9d3a?cD1_cGdn1P8G020Jaod60_b_audi7Ybbc50Vc7dr9;9Gb|dJ9AcScn068u7xb^0yb`d09gcbdW5(aK0AcEdIcAcg6Kb40#b7b9c}9 dadfabdFdHa!dZ8gdzdUbH3C0n540p2uaB2u4 2v4@1c2yea0ybNe61t2?0n0!0$0(0P04.
Solution

La combinaison A-B-E est bien valide (poids total 39) et rapporte 1800

Mon info

La force brute a mis en évidence une combinaison meilleure que celle donnée par l'algorithme glouton.

En effet la combinaison A-B-E est bien valide (poids total 39) et rapporte 1800, donc 100 de mieux que la solution gloutonne.

Par contre, la force brute est inenvisageable pour si le nombre d'objets est grand, alors que la stratégie gloutonne reste très rapide.

4. Pour approfondir⚓︎

interstices

V. La chasse au trésor⚓︎

tresor

⌛ Elle arrive ...

VI. Conclusion⚓︎

Mon info

La stratégie gloutonne donne très rapidement des solutions satisfaisantes mais pas forcément optimales. Pour beaucoup de problèmes (dont le problème du sac à dos), la recherche d'une solution optimale sans passer par la force brute semble impossible (mais n'est pas démontrée).
Dans ce cas-là, la stratégie gloutonne peut être employée pour avoir vite et bien une solution convenable, même si peut-être non optimale. On dit que la stratégie gloutonne est une heuristique de résolution. On sait que ce n'est pas forcément optimal, mais faute de mieux, on s'en contente...

VII. Crédits⚓︎

Le III. La résolution gloutonne du problème du sac à dos est une mise en forme du travail de Gilles Lassus.