Aller au contenu

Algorithmes gloutons 😋

Programme

Notions Compétences Remarques
Algorithmes gloutons Résoudre un problème grâce à un algorithme glouton. Exemples : problèmes du sac à dos ou du rendu de monnaie.
Les algorithmes gloutons constituent une méthode algorithmique parmi d’autres qui seront vues en terminale.

Principe d'un algorithme glouton

Les algorithmes gloutons (ou greedy) algorithmes 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, ....).

Un algorithme glouton donc 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.
Activité 1 - Optimisation d'une trajectoire

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.

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

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

>>>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)
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

.128013rt=7CflbIG)1 2e/vyg.:,-]8sEw9nuph5aS(o3k_i46P;[cdm0050X0p0c0J0Q0h0A0n0W0h0J0A0A0d010c0Q0G010406050A0F0Y0Y0J0b0s040K0M0h0F0@0M0E050q0~1012140|0G04051k1d1n0q1k0|0X0Q0r0,0.0:0=0H0Q0t0H0h1B0H0c0`050%0i0h0p1w0/0;011A1C1E1C0c1K1M1I0c0b1l0c0H0,170A0G0J0E0=0o011O1y010g0)0p0E0J0Y0p1I1+1-1=1Q1^1M1{1}0`0a0n0T0b0M0G0M0A0Q1a0E0n0#1)0b0b0p0W2i1d200E1l0q1%2v1!1$1#1J0X220=1E0E1`2f1I1t1v0-1P2F0Q2H0E0M2L1I0G2o1l2t2v2Z0}1,2j2N1?2S0b110h0`0n0m2s2%0{2$212)1Q2+2-2/0o2=1-2@2t2E012|0J2.040n0N302u0|332`0=36380n0R3c322%343i2/0I3m3e3o3g350M2,372/0S3t2^2(1x2{3y2}390e3D3f3G3h3I3A390z3M3v3O3x3z3j0D3U2_3W3q040m0Z3m1o2X1d2L2y0X1$2D3w0W2T1~1l3:1m3.2#1e2?053_0#2Y3V2O350`0T0j0B0f0B0K3m0n3E340M0`0d4h4j3w0_040V3,3N480Y0Q0`3l41314p3W4r0w4o4v1?4x0`3b4B2u4D484F4H474J4y3)4u4T1Q4r0y3t3u3$480O0`0#0g4S4(2*0g0`0Y1b1{0Q0p0P0k0h0M191b4X4/4Z0`0L513F480E4=1b0%0E0c56344r0l0v3t0n5l4i4I2{0`0J0P2o0E0X2o4.571?4l044n4N394P2*5a5d1-5e5D065m5n4Y3h0`1E0A0c0p5x4k4m5W4q0`0V4#5L5N5F1Q4*040g3y5Z3%0`0G4_0W5V5D5O520=0M0C0`2Q5:584a4c4e4g5D5*0=4r5j5(5N5m69015,0C1A1M625G045r5t5v5_2Z5{5y1Q5A020t0c0U5C6t6g59045?2p6s425o6a0`6c2Z5M6e6R6E5R0Q5T6J4C6L015A0u5f3w6F0J0G0G1`0X6%4E546/636G5@6X4O6Z5h5k6R6e6T6o5s6-5w5`6g5A6C2?6u3p5q725u746D6Z5A0x6m5p6@6I6}5l6g5,2o0c0F0b1c756Z6F5S5U3D0q440p2v2W7F3/1u3;2y2B2w0J1L7I0q3:0|7S0$0(0*04.
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

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

>>> 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)
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

.128013rt=7*Cèflb)I1 2e/vygj.:,]8swE9nuph5aS(o3k_i4+6P;[cdxm0050Z0q0c0K0R0j0B0o0Y0j0K0B0B0d010c0R0H010406050B0G0#0#0K0b0t040L0N0j0G0`0N0F050r111315170 0H04051n1g1q0r1n0 0Z0R0s0/0;0?0^0I0R0u0I0j1E0I0c0}050*0k0j0q1z0=0@011D1F1H1F0c1N1P1L0c0b1o0c0I0/1a0B0H0K0F0^0p011R1B010i0,0q0F0K0#0q1L1.1:1^1T1{1P1~200}0a0o0V0b0N0H0N0B0R1d0F0o0(1,0b0b0q0Y2l1g230F1o0r1*2y1%1)1(1M0Z250^1H0F1}2i1L1w1y0:1S2I0R2K0F0N2O1L0H2r1o2w2y2$101/2m2Q1_2V0b140j0}0o0n2v2*0~2)242,1T2.2:2=0p2^1:2`2w2H012 0K2;040o0O332x0 362}0^393b0o0S3f352*373l2=0J3p3h3r3j380N2/3a2=0U3w2{2+1A2~3B303c0e3G3i3J3k3L3D3c0A3P3y3R3A3C3m0E3X2|3Z3t040n0$3(3I2R3!3M0n2@1h2_3x3)3;3+0n323_343{3:2-3T3b0n3e413g3H3s460}0n3o4a3q3|453#4f3v4i434d4m3,3F4p4c3z3~3O4i1r2!1g2O2B0Z1)2G3z0Y2W211o4E1p4C2(4A4K0(2#3Y3;0P0}0(0i3p0o4w3*0i0}2h0?0R0k0,2k0q0B3p4(3;0|040M4@3Q3}0}0#1e0*0F0c4}4W1_4`0l0x3w0o5d4%4~2-0}2r0F0Z2r4$4^1_0N0}0d5n5g1T4`0X0z5c5e5o1T4Y040i3B5t572~0}0R5H4k1T0N0C5K1f4i5f5I3k0k5i1:0u0q565N0^4`4|4A5u3k50521:555T5B0^5q040T5M441T0#0R4f5$5|5(0}5a5{370Y0n0}030o0K0G0o0H1b0.51545:6f0R0h0Y4=0o0M2o0n6f150o0q0!0q0#6g0q0l5z5e5A5,015D5F0b664x0}0v6N3Z5P5R6R3}5X040b5Z5#5+5V015)613s5.6k546V5p0}5`5=6I5~606$5%6(645b4p6G706H6%6K5G6?6%0F0}0P6/5O5Q042T7b5W5Y0F5!6*3z6)6`62386,535;2$5U6{5^6=7u5?016^3,7l3Z596~2$06717K726{5D0R4#766{787e7E3;5^0f7V5h040V0m0D0g0D0L7Z5v0}0X7,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}0w857T0K0H0H1}0Z8a0}0M7/8y5J7U8^63040y7~7T818$7p4`8~8M8t8n927^0}0z6E6 8W375D2r0c0G0b5S7z6I8Y8/5m4p4q3z5D4!8 4*046j1~0R0q0Q0k0b1c8#2_7A7n996O9z5/6.8{6|04659e5d7A7T4,2j1O4=8i5r8 4+2i9!4:0c9$9R9L9J9o8O9Q9M7F646F7v8X6X5~9m2_9}375^8L9n779@7t8T9f9u0}6L9)041H0B9.8i7d7f967!9Z4.1P4?9:0}8S427L7A7O7Qa77S6X1i8;4{8*0}aiakau9T9%04020j0c0W8 9 an9_4_av9|ay9?6Y4=0GaR0Kaa34a38J04a6a29XaJ0Raj9Iax8Va.3*aVa1a-7Aa5aU0}aFaM5*aX7!aKa`2x9K9{9Va}4X5i0)9kb02xbh8zaH9R9p11a*a,bd8g0}95aC9~50aW9=8Gbf7I1g4T0q2y2ZbK4D1x4F2B2E2z0K9#2y4E0 0r0(0*0,0B04.
Rendre le moins de pièces possibles

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.

Activité 3 - Problème du sac à dos ("Knapsack Problem")
Jouons un peu...

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. Évidemment, la somme de leur masse ne doit pas dépasser 15 kg.

Ce problème (de la catégorie des problèmes 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.
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)
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]]

Revenons à notre 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 ?

Indice : stratégie gloutonne
  • 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.
  • Prendre 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)
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

.128013rt=flOb)J1 2e/vygj:,]BTswE9nuph5aS(o3qk_i4P;[cdxm050V0n0c0H0P0f0y0l0U0f0H0y0y0d010c0P0E010406050y0D0X0X0H0b0q040I0K0f0D0=0K0C050o0|0~10120`0E04051i1b1l0o1i0`0V0P0p0*0,0.0:0F0P0r0F0f1z0F0c0^050#0h0f0n1u0-0/011y1A1C1A0c1I1K1G0c0b1j0c0F0*150y0E0H0C0:0m011M1w010e0%0n0C0H0X0n1G1)1+1:1O1?1K1_1{0^0a0l0R0b0K0E0K0y0P180C0l0Z1%0b0b0n0U2g1b1~0C1j0o1#2t1Y1!1Z1H0V200:1C0C1^2d1G1r1t0+1N2D0P2F0C0K2J1G0E2m1j2r2t2X0{1*2h2L1;2Q0b0 0f0^0k2q2#0_2!1 2%1O2)2+0^0m2/1+2;2r2C012_0H2,040L2}2s0`302@0:33350Q382 2#313e0^0G3h1m2V1b2J2w0V1!2B3c010U2R1|1j3s1k3q2Z1c2:053z0Z2W3j3x0N0^0Z0e3h0l2=2$1v2^0e0^0b0H183o3b3X0:0@040J3(3N3*320^0K0h0s0!3/2?3;3,0i0t3h3a3:2M010z0^0l483U3H2~3V310y0V0^020M0D0K0c0S4i4k4m4o4l0S2m0C0p0K0P1L1K0l3#0E2c0b0c0l2U0P0W1o4x0V0)0V02030L0B0S0D2h3@3_0c4r4q4j4s4!0S41493U3)443P042m0c0D0b1a4b2s4,432(3?3^3`4_3M3|443,0T3{3W440X0P2{57313,0v3T4d3x0K0^0o5h4-4}044X502Z5o1O555d3x5a2-5x3}0^5g510642535p5r0c0y0O1Y4y0y5n4|1O5k040d5R5I2^0h0^0y0K4F0n0V5B540^3.515i3;0C0^0g0w0j0A0x0I5+1;3,0u5X585p0N0n0q5}5T0^5W5/5u3d3!3$0P0K673+0^60514{5Y6d4:0n0p0n0b0y0n6i015U6a5t5S0:0N0U0^0x0b0D6w6b6C013~411b3K0n2t2U6S3r1s3t2w2z2u0H1J6V0o3s0`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)
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

.128013rt=7flb)1 2e/vygj.:,]8Tsw9nuph5aS(o3k_i4+6P;[cdxm0050V0m0c0G0N0g0y0k0U0g0G0y0y0d010c0N0D010406050y0C0X0X0G0b0p040H0J0g0C0?0J0B050n0}0 11130{0D04051j1c1m0n1j0{0V0N0o0+0-0/0;0E0N0q0E0g1A0E0c0_050$0h0g0m1v0.0:011z1B1D1B0c1J1L1H0c0b1k0c0E0+160y0D0G0B0;0l011N1x010f0(0m0B0G0X0m1H1*1,1;1P1@1L1`1|0_0a0k0R0b0J0D0J0y0N190B0k0!1(0b0b0m0U2h1c1 0B1k0n1$2u1Z1#1!1I0V210;1D0B1_2e1H1s1u0,1O2E0N2G0B0J2K1H0D2n1k2s2u2Y0|1+2i2M1=2R0b100g0_0k0j2r2$0`2#202(1P2*2,2.0l2;1,2?2s2D012{0G2-040k0K2 2t0{322_0;35370k0O3b312$333h2.0F3l3d3n3f340J2+362.0Q3s2@2%1w2`3x2|380e3C3e3F3g3H3z380w3L3u3N3w3y3i0A3T2^3V3p040j0Y3l1n2W1c2K2x0V1#2C3v0U2S1}1k3/1l3-2!1d2=053^0!2X3U2N010L0_0!0f3l0k3D3o0f0_0y0G0U3+3M470^040I4m462)0_0J0h0r0#0y4s3#4o0_0u4d4f3v0B0_2d0N0V0y0M100W4B3E4D040i0t3s0k4Z4e4n4u040h182P4G4$1P0J0_0d4,4t1P4p0T0v4Y4!4H3$4K0J4M4O4j4l40304#4?0;4/044;552t574C1=0X0N0_3*5d0`4!5f4T4%4w4y0c4O1Z0N0m4A5m5p335a5c2Y5B4I0h4i3x0c0m0V4S334p4r5m4}474J045s4z5O3v4p4F5A5T4%0L0m0p5Z3V5D5-5U0_0b0G195:1=5#4=5g2`5=0m0o0m0b0y0m5_4.4:660;0L0U0_0x0b0C655S4-0;4p0i4{4Z5(1P49040f3x5|5q5~5W4x0#6v5C0z0_4+5%6j344v6z5u0M5w5y69014p4X5m065o5o6p3g4 510M5X0c6B3v5/6G586I6y5t6P4^6P5i0_2:6i6,4p4`6T6V4|6H6r0N4c6+5}6Y044L4N6#6K6(5.0_0P7c5;775079537g1=5a020g0c0S7m6x784O4Q7t6k0_6S2Y6U6~6V6X6-4)0?1b6_75015a0s6P5V0G0D0D1_5N7L6w7z4q7Q6J6/7X5P0_0T6=5j045l2!6H6{6m6}7E6W6H5V7v0M7l747Y7N7e5E2=5G4~7i6!6$6n85476r2n0c0C0b7K5F7G5V7I6F7C1c430m2u2V8r3.1t3:2x2A2v0G1K8u0n3/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.

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 :

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

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

>>> 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)
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

.128013rt=7*flb)1 2e/vygj.:,]8sw9nuph5aS(o3k_i46P;é[cdxm0050V0n0c0G0N0h0y0l0U0h0G0y0y0d010c0N0D010406050y0C0X0X0G0b0q040H0J0h0C0?0J0B050o0}0 11130{0D04051j1c1m0o1j0{0V0N0p0+0-0/0;0E0N0r0E0h1A0E0c0_050$0i0h0n1v0.0:011z1B1D1B0c1J1L1H0c0b1k0c0E0+160y0D0G0B0;0m011N1x010g0(0n0B0G0X0n1H1*1,1;1P1@1L1`1|0_0a0l0Q0b0J0D0J0y0N190B0l0!1(0b0b0n0U2h1c1 0B1k0o1$2u1Z1#1!1I0V210;1D0B1_2e1H1s1u0,1O2E0N2G0B0J2K1H0D2n1k2s2u2Y0|1+2i2M1=2R0b100h0_0l0k2r2$0`2#202(1P2*2,2.0m2;1,2?2s2D012{0G2-040l0K2 2t0{322_0;35370l0O3b312$333h2.0F3l3d3n3f340J2+362.0P3s2@2%1w2`3x2|380e3C3e3F3g3H3z380x3L3u3N3w3y3i0A3T2^3V3p040k0Y3!3E2N3W3I0k2:1d2=3t3#3-3%0k2~3=303@3,2)3P370k3a3}3c3D3o420_0k3k463m3^413X4b3r4e3 494i3(3B4l483v3`3K4r3M3_4a3(3S4w3U4y4o0k3Z4C4g3G4o0m3*4I404K3I0m3;2Y4m4t4z0m3|4U4s3$4X454!4x4h4R4d2!1p2W1c2K2x0V1#2C3v0U2S1}1k4=1l4:4.2!4{0!2X4D1=0L0_0!0g3l0l4#3_0g0_2d0/0N0i0(2g0S0y3l5f1=0^040I5r4*2`0_0J0i0s0#5q4e5s1P5u0v5d5H3g5i0J0N0V5F2!5y0;5u0j0u3s0l5!5e5U345i2n0B0V2n5L5%0J0_0d5.575I0_0T0w5Z5#5M0159040g3x5?4J5N040N4T2=5$5@0;0J0z0_2P644P3g0i0_0b1,0r0n5x6c015u5w5G5%0X0N0_4Z2=5~5W5Y4l5#6H6b655 0_620b6i3o6g6B306J6j016e6g1b4e6U3o6l046n0B6p6r6K6u6,6V6y6A6/336E5|6I6I5~606N6P4t6g4(6a5~6X676Z2Y6#4t6%6)6+6w6s6.7e6K6;046S2t6D0_5X6_6`7r6|6M636!5~0B6g4-735/6f766 3$7b6o6q7h6V7g5T6s7j7l566-7o6F4U7r7W6{5%6}7v787x6g4k7$7C6Y7F3_7H6*7J7N7S5v6?3v7P7^3V6^6G7X7 6H7t617#7B6s7y674q7*6s756h7w5%0B7/7d7=7L0_6v8j337`7K6@7T7q808u793$6m0n2d0B0y7;856K5:045=8e7f5_7{3_6g69307n045K8J6K870N7Q8R8T8a8V718M5t0_8!8E6V8W7A8Q5%5J7-2)7(8(5^8S8?5z888_5V0_5{7~8v8v7%042d5Q0y0M2n8A8C8|6d5;9f346%1e8 6t8l0T9m879c1a9e8q3v5u9p9v8x679m5u928n3v8G0f9q5A5C5E9C8L9z8N9B9P8)040w9y9F3V7j8P7m8;919i7!6O8U8-6g9i8c778,6$6m7I9N7@9S1P7j896C9$040j0w0j8t947X820N5c9+6Q975P5R9b8z9t8D6T740_020h0c0R9i87985R9^7U3?a5ax8w9Q2V1_5,ai9#8b0_0t9J040G0D0DaC9^0I9W9~868O9^8+aj8f6RaVaq8%9`908{aa70678/aF7?aW2taz8@677)aSa/a#8~a%9n9Ua393a=1P602n0c0C0b9:aXaT975*aD3s4V3V605baq5h040i182P0M0i0b18aPaJ5B5D0c5Sa_8ka)8#9,ac999^7pb1965j2f1K0nbzba8F9ha*9AbL5l5n0c5pbua}87bw9Ma}8=bTaAadbPa.bBb07V5}8f6%100W9.bSbD8o6z044Nb=5!962n0}an0G0cb{8H9i9x9Eawb?6s9)a{1D0y0caE38747D8db}a+bVbNb.7RbBav3~7W96116p0Bc9b+1=8G8Ics7G0_9lb)9oaJckcm9^aR8:bb0N9^cecWbR049Ib#9Kbxcw8RcVb/abcYcP9Uc.cxb~6=c=c!a;826~cH8}c;cL3-9/aq8hcn8R8mbAc_049}c#b:a2a4c37Z6ga9d3a?cD1_cGdn1P8G020raod60_b_audi7Ybbc50Cc7dr9;9Gb|dJ9AcScn068u7xb^0Gb`d09gcbdW5(aK0bcEdIcAcg6Kb40#b7b9c}9 dadfabdFdHa!dZ8gdzdUbH3C0o540n2uaB2u4 2v4@1c2yea0GbNe61t2?0o0!0$0(0y04.
Solution

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

Comparaison des méthodes

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.

Pour aller plus loin : interstices

Conclusion

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

Activité 4 - Conversion binaire

Pour convertir en base \(2\) un entier écrit en base \(10\), nous pouvons utiliser l'algorithme glouton de rendu de monnaie, en utilisant les puissances de \(2\) successives comme valeurs des pièces.

Par exemple, pour obtenir la représentation binaire de \(43\), on peut utiliser les valeurs \(32\), \(16\), \(8\), \(4\), \(2\) et \(1\). On se limite à \(32\) car la puissance suivante, \(64\), est strictement supérieure à \(43\).

On procède alors ainsi :

  • Pour \(43\) on doit prendre \(32\) , il reste \(11\),
  • Pour \(11\) on ne peut pas prendre \(16\) (en effet \(16>11\)),
  • Pour \(11\) on doit prendre \(8\), il reste \(3\),
  • Pour \(3\) on ne peut pas prendre \(4\),
  • Pour \(3\) on doit prendre \(2\), il reste \(1\),
  • Pour \(1\) on doit prendre \(1\), il reste \(0\).

On obtient la représentation binaire en observant les différentes étapes : s'il est possible de prendre une puissance, on note un 1, si c'est impossible, on note un 0.

Puissance de 2 Possible ? Bit correspondant
\(32\) Oui 1
\(16\) Non 0
\(8\) Oui 1
\(4\) Non 0
\(2\) Oui 1
\(1\) Oui 1

Dans la pratique, pour convertir « à la main » \(43\) en binaire, cela revient réaliser le tableau suivant :

\(32\) \(16\) \(8\) \(4\) \(2\) \(1\)
1 0 1 0 1 1

On en déduit que \(43\) en décimal s'écrit 101011 en binaire.

Résolution sur papier

Utiliser la méthode précédente pour convertir 100 en binaire.

Solution

on peut utiliser les valeurs \(64\), \(32\), \(16\), \(8\), \(4\), \(2\) et \(1\). On se limite à \(64\) car la puissance suivante, \(128\), est strictement supérieure à \(100\).

On procède alors ainsi :

  • Pour \(100\) on doit prendre \(64\) , il reste \(36\),
  • Pour \(36\) on doit prendre \(32\), il reste \(4\)
  • Pour \(4\) on doit prendre \(4\), il reste \(0\)

On obtient la représentation binaire en observant les différentes étapes : s'il est possible de prendre une puissance, on note un 1, si c'est impossible, on note un 0.

Puissance de 2 Possible ? Bit correspondant
\(64\) Oui 1
\(32\) Oui 1
\(16\) Non 0
\(8\) Non 0
\(4\) Oui 1
\(2\) Non 0
\(1\) Non 0

Dans la pratique, pour convertir « à la main » \(100\) en binaire, cela revient réaliser le tableau suivant :

\(64\) \(32\) \(16\) \(8\) \(4\) \(2\) \(1\)
1 1 0 0 1 0 0

On en déduit que \(100\) en décimal s'écrit 1100100 en binaire.

Résolution avec Python

Vous devez écrire une fonction binaire qui prend en paramètre un entier écrit en base \(10\), et renvoie la chaîne de caractères la plus courte possible (sans zéros inutiles) représentant sa conversion en binaire.

Exemples

>>> binaire(43)
'101011'
>>> binaire(32)
'100000'
>>> binaire(0)
'0'
>>> binaire(54321)
'1101010000110001'

Contraintes

Vous utiliserez obligatoirement un algorithme glouton qui met en oeuvre la méthode décrite dans cet exercice.
L'utilisation de la fonction bin et du modulo (%) est interdite.

Compléter le script ci-dessous"

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

.128073.128013tCèl12à/vyg.]sEw9huqiV6Pé[-dm0rA=7*fb)D e:,8Rnp5(aSo3k_4+;zcx050D0Q0c0Z0w0f0p0P0-0f0Z0p0p0I010c0w0W010406050p0u0E0E0Z0G0l040!0#0f0u120#0V0P020Z0E0W0+0P0U0Q1c0G0v0u0Q0p050j191b1d1f170W04051K1D1N0j1K170D0w0k0`0|0~100t0w0m0t0f1#0t0c15050=0M0f0Q1W0}0 011!1$1(1$0c1.1:1,0c0G1L0c0t0`1i0p0W0Z0V100h011=1Y010L0@0Q0V1q0Q1,282a2f1@2i1:2l0E2n040b0P0z0G0#0W0#0p0w1l1n0:260G0G0Q0-2I1D2p0V1L0j242U2123221-0D2r101(0V2k2F1,1T1V0{1?2(0w2*0V0#2.1,0W2N1L2S2U2 18291n2:2g2^0G1c0f150P0g2R3316322q351@37393b0h3e2a3g2S2%013l0Z3a040P0$3p2T173s3j103v3x0P0)3B3r333t3H3b0X3L3D3N3F3u0#383w3b0y3S3h341X3k3X3m3y0J3$3E3)3G3+3Z3y0T3/3U3;3W3Y3I0s3`3i3|3P040g0F413(2;3}3,0g3d1E3f3T424a440g3o4f3q4h49363?3x0g3A4n3C3%3O4s150g3K4w3M4i4r3~4B3R4E4p4z4I453#4L4y3V4k3.4R3:4j4A453_4W3{4Y4O0g404$4G3*4O0h474E1O2}1D2.2X0D232$3V0-2_2x0/1U1L2|0Q2~3f3L054 0:574-100%150:0L3L0P4S430L150M2?0?2N594X2g14040Y5u4%36152^0E0M5t4=5v1@5x0N0R3S0P5P5l5J5f150w5j4E5R5B3k5D0#5F5H2 5Y5e010#150I0I5k5m4a0E0w154;315S015x5N4L5Q615*4q1@5g042N0c0u0G0V5;5|0p2d04021z0#0c0+0F6i0u6k0+3S06615=5C040W0u0w0~2a0-1B0(1k2j1C5X6v1@5-045:6J5|5x0B0o5O5Q6K3G150W6d5Z106M6O5)6W015@4B6U5P6*660r1!1:6!5+0V6Y6^646$15020f6l6(3f633O5#5%0Q6|3t5~6.626*6`6x6z6B0V6D0p6F121:6I5{6#5,150n5A6_150Z0W0W2k0D7w6}5}155z5I7s7g6Z7J5+5L7d6u5|7L7a3V6%7U3|6,044m6)5|6M0K7X4j6{606V7S6Y7i0p6C0Q0(1c0.7*2g7W6P7K0M152u7E7b7H834T7:6A7=7k6E6G7p863|7P7~5+6M0C7{1@7Z4e2 066t7.7K152N19710Z0c8m6~6N8B016f6 6j6l6o6q5k62618s6/5|660L3X8E7g0w8E0#0r5U6c8i7F0V80672a0m797N7F5x7I7r7x7h897?7^0Z7`8/84040S8Y158l8~3V8o8f4a5x918%3t8k982g97958g155M7Q8t8@6y8_8b928D9c878^7j7l7n6H9f5K150B9B6X048X9i99156T7-8N6:5U5W7$8u045E5G8.9S8j6 0m728V889x9X586Q155 8q8N9O7/671B0u8y8A9u3|7}9Y8(8v9@9_9s0*8E8G6h8I0+0g8K6l9m9;9T9V5(746*9}ai9=ag9*3q757V939%9w8a6Dadaq3|660Q0^ao2T6*7c9N9:8Q9T8w9^0=9`9~9d5.ataLa29{4a6Ma4aV2ga6ab6ma$7d9P9?696baSa1aN3$0j5b564?a@0j4_1D0c4{a|2!2V0Z1/a_4_1J5d7F2N0E0(0L0Z0%7@0t0$151v1x1z1B0P9.581Q3g1K0a0P0d0;0P3w0m3X2H0t2w0P0m0f0#1k1m0P0V0A7l2G0c1;2K4 1b2k6D0G0P29bW7pbX1j0_0m0G2a0:0_9p9)0_2K0h0P8d1B7v5G0P0j160O2a0_0|0P0p1i6GbJ2|2D2F0A0Q0SbKbH0_0Z0k1m0_0-0G0A0Ab=2*0P1(0pbP0Pb+bX7;7?b/1;b;210wc9b,1d0P3X0D2N0`2C9q0c0Pblcc0ucecg0VcE0G4 6a1A0P0ibX1d12bW2Kc02i0V7vbqb6bt0H1kcJ2E0~0w5q1(0ccm2kb=7o6A2acN5a506x2D1Da?2U1R522/3|1_1%1)1+544@314=daa*5i8V5o045q2l0wah3qaF859J6wan9F7G049laHa*5VatdDaZ6L5.73ap6*7Z5`9+7saG9/9:a*686a8$aP3Va#a86na86s7R9Tb-av8c7o1B9sdQ2Tay9K046Sa)9=7Md(9|aRdN109hdYaJ5+6;6?aD3y7f7,e3aW6 710+d`efam5$9W8EdX4gaIegaucx9z8edBdO04c.8?9 047z7B0V7DeB108;dE7TeMdF0Naxewe2al7sakdR5|7Z7#eX9Z047)e63ueheu9neGd;8`7_d_8V8*82eReOeR7Lcw8b7mb?7qdV7O9k9s94ei9g5^45d.e:769?8xa:e,eZd{6*d*6p8Jd-dI8R156=2je_812kdEe}eFfge=f1ezd^e|f7fk9!ace,dTfA9-eUe1e^e,e 9q9yf3dE6MeEf5e;d8fI5yeTaHd/eb9QateWe!eYek9$fU77erf)bo4oaIf-eGaTfjfaeCend|6wg28za3a56ga$aafre9f ewdMg48Cg6gjeqdxfm7%asf_6xfR7saAaCfP04f}3Cf ff9vg9aOe(7FfleoaKa/gafK04aYgl8Fgdd+a(4L8Pg765a0a,d%gJfggHa;do1Q4@a`53c:bu1m215s1w2kcNc#6DcOcZ2^cRbxcT0_bc2Hctb~cp00bybA24bDbFbH0cbJ2K2NeK0uct1;0E1mdvca0P0@bK001BcN290_bLbNg_ho26cU12690QbZ0Zcp6AcscufE7lhFb;f30P0A1z1U3wg{1;c#c0cqhPbm0W0w0ehS0Dhnhlh:hFhq0Vhs0n0P0q1n0Q0L0L0;cbbJ21bH0k1;c0hRbQczc16z0kd3h$d00@6AhKcbbYc10w1r1:ct1U6A0wbJg{[email protected]=211;c21j2IbX2F2Gb3cbhYhW4 5EikcphMcj0A8ziv2J000ucoh)1;5 dc2.3tdg1{1*2{dlbp31doft04dqfUdsdug_gA8=f$fggkj33V5LgC16g03t66dKguj5f=e)5/8EfOf|gwf.a+d$gc8Hfpa%gge/eag1gOgIjhgKe5gTfo6qgX8qgZeVf0awgQgne#fc8pjwg!5T04fv6@guia9s70f^gT7gjggrdWfQf,gF439(d=8{8}gTgLjTe-ex9rj-jxfDjLeej_j^dSfce%dygse*ePj:7?fej~3VecfwjYk0j=j!9#6rfNfcdUk7j+gBjn7Fjd9Rg)9vj)gMe)02kmjOd:kje@jmj}7e9=g+jNa.figPj@15gSky3|jF6lgfjtaxjbkzgpk1ajjDkV7+9Uk(f8f:kH8|kujc15aB0peedzktkKk$j/fhaMkRk,7|k+jBg*jzgbe,kXjuk!kKjKfW7@kIkS9tj%kb8bkkgQ0j0jjkk5kdj_66d#a-gukN8qd9d6a^2Ub51M040x6A0u3wd2iKh?2|2?0-13bQhni dwi*5liW7Y0D0C0M1khi6`0P0t2N0L1Z1}0W0p0Rls0rl{0n0-0p2iaB0D0m6z0:0n3X0m0n0V0,0j2k0j2?bPb)2P1U1B0ji 1e0C0-1d0D0p0j2e2N0f3=2D2khK2e0=0G8-0c100(1/2a660dc%bmlY8w1D0Zdb3ga`0;0?0^04.