Le module itertools définit de nombreuses fonctions qui permettent de générer des listes. Ici, on utilise la fonction product qui prend en paramètre une liste valeurs et un entier n, et qui génère la liste de toutes les combinaisons de n éléments de valeurs, avec éventuellement des répétitions.
Dans notre cas, chaque booléen correspondra à un objet de la liste d'objets et indiquera s'il faut prendre ou pas cet objet.
Exercice 3
Compléter la fonction evaluer_solution qui prend en paramètres une liste de dictionnaires liste_objets et une liste de booléens solution de même taille, et qui renvoie le poids, la valeur et la liste des noms d'objets pris dans la solution solution.
###(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
.128013;)3=9+lwjqn8gv,S."5/:rf7uemkdas p
h10itP(_y2[46cb]o030x0u0H0y0G0b0z0A0Q0b0y0z0z080m0H0G0B0m020C030z0t0v0v0y0q0L020k0T0b0t0-0T0f030o0@0_0{0}0=0B02031d161g0o1d0=0x0G0i0$0'0)0+0D0G0h0D0b1u0D0H0:030X0R0b0u1p0(0*0m1t1v1x1v0H1D1F1B0H0q1e0H0D0$100z0B0y0f0+0M0m1H1r0m0r0Z0u0f0y0v0u1B1!1$1*1J1-1F1:1=0:040A0I0q0T0B0T0z0G130f0A0V1Y0q0q0u0Q2a161^0f1e0o1W2n1T1V1U1C0x1`0+1x0f1/271B1m1o0%1I2x0G2z0f0T2D1B0B2g1e2l2n2R0?1#2b2F1+2K0q0`0b0:0A0E2k2V0;2U1_2X1J2Z2#2%0M2)1$2+2l2w0m2:0y2$020A072@2m0=2`2.0+2}2 0A0O332_2V2{392%0n3d353f372|0T2!2~2%0P3k2,2W1q2/3p2;300s3u363x383z3r300g3D3m3F3o3q3a093L2-3N3h020E0F3d1h2P162D2q0x1V2v3n0Q2L1?1e3%1f3#2T172*033,0V2Q3M2G0m0w0:0V0r3d0A3v3g0r0:0u0i2~0t0u0q0K0z10120G143Z3E3~0/020J4m3}2Y0:1x0z0H0u0K0T0R0d0W0z4s3T4o0:0j44463n0f0:4h112j3@2^4M3N4p060p3k0A4#454n4u02260G0x4F4T2m4%4t1J0T0:084L4'1J0v0G0:3Y4.0;4$4:4H4(4b1F0t0q4_4;0+4?024^50533w3~4|4~4!4$4V3~4O024B4D0H0z4g0u1F0Q5a544=4@5A5i1+4p0N0S5m4#5o1+40020r3p5E3g0:0G5S3n0T0c5U155g5M2/0R0:0q1$0h0u4G5F1J4p4r505%385(021}5.2{5;5|4N4v0G4x4z5s4E5 4W0:064Y5K525h2{5O0G435$4`384P4i4S2T6k0m5H675p5U6t5G0:0S4Z500C6d6D6e604)0T4+4-2R6F3N5d5f6L5@2|0:4*4,5W6N0:0a6W6u5`624y4A4C665?6q6s6+5b6S025V6.5B0+4p0S0N6w1J0z1(02000e0t0T0H056U0z7173756|6^6y6c6E6M6#560u586!1+6O7m2/0:7j7l6j6/5d6Z7u6@6:4w6'655u7c6r0:6{6?5/6l6;7F6_7I6p6/6~0:7974057s0q7U7b7J5}7e6B7g526R5q7D5v0z5x2h7F5d0l7F5q0y0B0B1/0x7N0:5=7Q7z5q7B646)7E7#3n6-817K6:6=8b7$026`7F7S70727V2K0v7Z057~8h066c6R5O2g0H585#6Q6q5q778s4K7y8c5q7X8G7p7L7,5w5y3u0o3`0u2n2O8V3$1n3'2q2t2o0y1E8Y0o3%0=8+0W0Y0!02.
###(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
.128013;)3=9+lwjqn8gv,S."5/:rf7uemkdas p
h10itP(_y2[46cb]o030x0u0H0y0G0b0z0A0Q0b0y0z0z080m0H0G0B0m020C030z0t0v0v0y0q0L020k0T0b0t0-0T0f030o0@0_0{0}0=0B02031d161g0o1d0=0x0G0i0$0'0)0+0D0G0h0D0b1u0D0H0:030X0R0b0u1p0(0*0m1t1v1x1v0H1D1F1B0H0q1e0H0D0$100z0B0y0f0+0M0m1H1r0m0r0Z0u0f0y0v0u1B1!1$1*1J1-1F1:1=0:040A0I0q0T0B0T0z0G130f0A0V1Y0q0q0u0Q2a161^0f1e0o1W2n1T1V1U1C0x1`0+1x0f1/271B1m1o0%1I2x0G2z0f0T2D1B0B2g1e2l2n2R0?1#2b2F1+2K0q0`0b0:0A0E2k2V0;2U1_2X1J2Z2#2%0M2)1$2+2l2w0m2:0y2$020A072@2m0=2`2.0+2}2 0A0O332_2V2{392%0n3d353f372|0T2!2~2%0P3k2,2W1q2/3p2;300s3u363x383z3r300g3D3m3F3o3q3a093L2-3N3h020E0F3d1h2P162D2q0x1V2v3n0Q2L1?1e3%1f3#2T172*033,0V2Q3M2G0m0w0:0V0r3d0A3v3g0r0:0u0i2~0t0u0q0K0z10120G143Z3E3~0/020J4m3}2Y0:1x0z0H0u0K0T0R0d0W0z4s3T4o0:0j44463n0f0:4h112j3@2^4M3N4p060p3k0A4#454n4u02260G0x4F4T2m4%4t1J0T0:084L4'1J0v0G0:3Y4.0;4$4:4H4(4b1F0t0q4_4;0+4?024^50533w3~4|4~4!4$4V3~4O024B4D0H0z4g0u1F0Q5a544=4@5A5i1+4p0N0S5m4#5o1+40020r3p5E3g0:0G5S3n0T0c5U155g5M2/0R0:0q1$0h0u4G5F1J4p4r505%385(021}5.2{5;5|4N4v0G4x4z5s4E5 4W0:064Y5K525h2{5O0G435$4`384P4i4S2T6k0m5H675p5U6t5G0:0S4Z500C6d6D6e604)0T4+4-2R6F3N5d5f6L5@2|0:4*4,5W6N0:0a6W6u5`624y4A4C665?6q6s6+5b6S025V6.5B0+4p0S0N6w1J0z1(02000e0t0T0H056U0z7173756|6^6y6c6E6M6#560u586!1+6O7m2/0:7j7l6j6/5d6Z7u6@6:4w6'655u7c6r0:6{6?5/6l6;7F6_7I6p6/6~0:7974057s0q7U7b7J5}7e6B7g526R5q7D5v0z5x2h7F5d0l7F5q0y0B0B1/0x7N0:5=7Q7z5q7B646)7E7#3n6-817K6:6=8b7$026`7F7S70727V2K0v7Z057~8h066c6R5O2g0H585#6Q6q5q778s4K7y8c5q7X8G7p7L7,5w5y3u0o3`0u2n2O8V3$1n3'2q2t2o0y1E8Y0o3%0=8+0W0Y0!02.
Exercice 4
Compléter la fonction sac_a_dos_brute qui prend en paramètres une liste de dictionnaires liste_objets et un entier poids_max, et qui renvoie la valeur, le poids et les objets sélectionnés pour la meilleure solution possible avec la limite de poids poids_max.
Dans cet exemple, on voit que la meilleure solution consiste à prendre les objets 1 et 5, pour une valeur totale de 12, et un poids de 14, avec une limite fixée à 15.
###(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
.128013;)3=9xlTjwn8gv,S."5/:rCf7Fuemkdas p
h10itP(_y2[46cb]o030z0w0J0A0I0b0B0C0S0b0A0B0B080m0J0I0D0m020E030B0v0x0x0A0q0N020k0V0b0v0/0V0f030o0_0{0}0 0@0D02031f181i0o1f0@0z0I0i0'0)0+0-0F0I0h0F0b1w0F0J0=030Z0T0b0w1r0*0,0m1v1x1z1x0J1F1H1D0J0q1g0J0F0'120B0D0A0f0-0O0m1J1t0m0s0#0w0f0A0x0w1D1$1'1,1L1/1H1=1@0=040C0K0q0V0D0V0B0I150f0C0X1!0q0q0w0S2c181`0f1g0o1Y2p1V1X1W1E0z1|0-1z0f1;291D1o1q0(1K2z0I2B0f0V2F1D0D2i1g2n2p2T0^1%2d2H1-2M0q0|0b0=0C0G2m2X0?2W1{2Z1L2#2%2(0O2+1'2-2n2y0m2=0A2'020C072_2o0@2|2:0-2 310C0Q352{2X2}3b2(0n3f373h392~0V2$302(0R3m2.2Y1s2;3r2?320t3w383z3a3B3t320g3F3o3H3q3s3c093N2/3P3j020G0H3U3y2I3Q3C0G2*192,3n3V3%3X0G2^3+2`3-3$2!3J310G343?363x3i3{0=0G3e3 3g3.3`3R443l473^424b3Y3v471j2R182F2s0z1X2x3p0S2N1^1g4o1h4m2V4k4u0X2S3O3%0y0f0=0I0x280q0J3f0C413p0f4J022b0w4O0V1#3m4f3p0y0=0X0s4Q4S3W0s0=0B0A0S0M0A0M0z290M0T0q140w3f4-3%0;020L513G3/0=1z0B0J0w0M0V0T0d0Y0B574G1-540j4,582!0=280I0z0B0M0|0a5l491L54060p3m0C5I4R5r2;0=17475K5m1L0V0=085q5R3a0T5a1;5B3_5D0=564k5L3a5a0I5c5e5g5i0J5k5*5X0m5E5H5J525s021@0#1H0v0q0M0i305W5C0-5T025V5P5~1L0x0I0=3!4e5J5Q6a2~0=610b63655u5w695%6b5U6y2}6i6k5|5I6g5,600w620w640M0B0w1H0S6C3p6c6e2T6o6z5`0=0P0U6G6Z3i5-5/6P12140I165@6Y6I0m6W6U3W4K5d4Z4#5^6p6c0l5$6*022Q2N0v2k743p540L0P7b3P0y0S0=0u306Q7g530=5p6f5+0m7i0=0c4~50706!540U7r6?7t4V2i0D0w0A4P7A2}6_7N4T5N7o5n0=066(6@4(020s3r6`59020B6.2l7s5_0V0e4K5O7F5_4V5b5d6-132c6=2,6@545G6m6n5}7G5t0V5v7}2`7 7q7%5 676u7T5'027E2,6)7R7(6R2j8d5S6B7,6p4V0w8f0v4Y7`6/168h0-7d8E6q027^5:5h5j8H5o8r6J7)7{6:7;7~7t5{82838m7h4K4+8u6!4V6w892o8#3%6c000b0J056X8l6@8*875w5y0A5A8(7O7/021'0z8Q8I8f6N0q978:0h8?974V6s6u66687Q3P806(8!6H7t0S0G0=010C0r00010709050w5c0C0v2B0C8S8C2d8f5v1I0Y0C9i9a7z2T0E9q838`6r6L6t9a9k0b9c8t7=8v0=99649p9q9Z6K6M6O8+9)6d9g86889:8!9=9S6O6Q6S9`8^2`8.5 a48q8Za91L7Z2i0J648Va8a19#9j8f8O8c918na26v8|8,4F6p8Pas6{9?9$a38p6T4e184D0w2p2QaL4n1p4p2s2v2q0A1GaO0o4o0@aY0Y0!0$02.
###(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
.128013;)3=9xlTjwn8gv,S."5/:rCf7Fuemkdas p
h10itP(_y2[46cb]o030z0w0J0A0I0b0B0C0S0b0A0B0B080m0J0I0D0m020E030B0v0x0x0A0q0N020k0V0b0v0/0V0f030o0_0{0}0 0@0D02031f181i0o1f0@0z0I0i0'0)0+0-0F0I0h0F0b1w0F0J0=030Z0T0b0w1r0*0,0m1v1x1z1x0J1F1H1D0J0q1g0J0F0'120B0D0A0f0-0O0m1J1t0m0s0#0w0f0A0x0w1D1$1'1,1L1/1H1=1@0=040C0K0q0V0D0V0B0I150f0C0X1!0q0q0w0S2c181`0f1g0o1Y2p1V1X1W1E0z1|0-1z0f1;291D1o1q0(1K2z0I2B0f0V2F1D0D2i1g2n2p2T0^1%2d2H1-2M0q0|0b0=0C0G2m2X0?2W1{2Z1L2#2%2(0O2+1'2-2n2y0m2=0A2'020C072_2o0@2|2:0-2 310C0Q352{2X2}3b2(0n3f373h392~0V2$302(0R3m2.2Y1s2;3r2?320t3w383z3a3B3t320g3F3o3H3q3s3c093N2/3P3j020G0H3U3y2I3Q3C0G2*192,3n3V3%3X0G2^3+2`3-3$2!3J310G343?363x3i3{0=0G3e3 3g3.3`3R443l473^424b3Y3v471j2R182F2s0z1X2x3p0S2N1^1g4o1h4m2V4k4u0X2S3O3%0y0f0=0I0x280q0J3f0C413p0f4J022b0w4O0V1#3m4f3p0y0=0X0s4Q4S3W0s0=0B0A0S0M0A0M0z290M0T0q140w3f4-3%0;020L513G3/0=1z0B0J0w0M0V0T0d0Y0B574G1-540j4,582!0=280I0z0B0M0|0a5l491L54060p3m0C5I4R5r2;0=17475K5m1L0V0=085q5R3a0T5a1;5B3_5D0=564k5L3a5a0I5c5e5g5i0J5k5*5X0m5E5H5J525s021@0#1H0v0q0M0i305W5C0-5T025V5P5~1L0x0I0=3!4e5J5Q6a2~0=610b63655u5w695%6b5U6y2}6i6k5|5I6g5,600w620w640M0B0w1H0S6C3p6c6e2T6o6z5`0=0P0U6G6Z3i5-5/6P12140I165@6Y6I0m6W6U3W4K5d4Z4#5^6p6c0l5$6*022Q2N0v2k743p540L0P7b3P0y0S0=0u306Q7g530=5p6f5+0m7i0=0c4~50706!540U7r6?7t4V2i0D0w0A4P7A2}6_7N4T5N7o5n0=066(6@4(020s3r6`59020B6.2l7s5_0V0e4K5O7F5_4V5b5d6-132c6=2,6@545G6m6n5}7G5t0V5v7}2`7 7q7%5 676u7T5'027E2,6)7R7(6R2j8d5S6B7,6p4V0w8f0v4Y7`6/168h0-7d8E6q027^5:5h5j8H5o8r6J7)7{6:7;7~7t5{82838m7h4K4+8u6!4V6w892o8#3%6c000b0J056X8l6@8*875w5y0A5A8(7O7/021'0z8Q8I8f6N0q978:0h8?974V6s6u66687Q3P806(8!6H7t0S0G0=010C0r00010709050w5c0C0v2B0C8S8C2d8f5v1I0Y0C9i9a7z2T0E9q838`6r6L6t9a9k0b9c8t7=8v0=99649p9q9Z6K6M6O8+9)6d9g86889:8!9=9S6O6Q6S9`8^2`8.5 a48q8Za91L7Z2i0J648Va8a19#9j8f8O8c918na26v8|8,4F6p8Pas6{9?9$a38p6T4e184D0w2p2QaL4n1p4p2s2v2q0A1GaO0o4o0@aY0Y0!0$02.
L'algorithme glouton
Le temps de calcul avec la méthode par force brute devient très rapidement trop long. C'est pour cela qu'on utilise un algorithme glouton.
On construit une liste de t-uplets (rentabilité, poids, valeur, nom) et on la classe dans l'ordre décroissant. On parcourt ensuite cette liste en regardant objet par objet s'il est possible de le prendre ou pas.
Exercice 5
Compléter la fonction sac_a_dos_glouton qui prend en paramètres une liste de dictionnaires liste_objets et un entier poids_max, et qui renvoie une solution obtenue avec l'algorithme glouton.
Cette fonction est bien plus rapide que la méthode par force brute, mais ne donne pas forcément la meilleure solution :
###(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 : ∞/∞
Expliquer les différences observées.
Explication
L'objet 1 est plus rentable que l'objet 2. L'algorithme glouton va donc le prendre, empèchant de prendre l'autre objet. Pourtant, l'autre objet, moins rentable mais bien plus lourd donne une meilleure solution.
Comparaison des deux algorithmes
Afin de tester les deux méthodes, nous allons générer des listes d'objets au hasard.
On fixera à l'avance des poids min et max, ainsi que des valeurs min et max.
Exercice 7
Compléter la fonction ci-dessous qui permet de générer au hasard une liste d'objets en indiquant les valeurs minimales et maximales ainsi que les poids minimums et maximums.
On rappelle que la fonction random.randint(a,b) renvoie une valeur entière comprise entre a et b inclus.
# Tests
(insensible à la casse)(Ctrl+I)