nsi:terminales:sac_a_dos
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| nsi:terminales:sac_a_dos [2021/04/13 15:25] – créée goupillwiki | nsi:terminales:sac_a_dos [2023/02/03 12:08] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | < | + | ====== |
| - | # 13. Problème du sac à dos | + | |
| - | ## Qu' | + | **Version programmation dynamique** |
| - | Un problème classique d'algorithmique. On dispose d'un sac de capacité C en kg et d'un assortiment d' | + | ===== Qu'est-ce ? ===== |
| - | **Exemple :** On dispose d'un sac d'une capacité | + | Un problème classique d' |
| - | | Objet | Valeur | Poids | | + | <WRAP tip>On peut voir cela comme un problème de cambrioleur : le cambrioleur dispose d'un sac de taille forcément limitée, et se demande ce qu'il a intérêt à voler. On comprend qu'il prendra des bijoux qui sont précieux et peu encombrant. Prendra-t-il une statuette ? un appareil électronique ? Il cherche à emporter le plus de valeur possible mais est limité par son sac.</ |
| - | | ----- | ------ | ----- | | + | |
| - | | A | 126 | 14 | | + | |
| - | | B | 32 | 2 | | + | |
| - | | C | 20 | 5 | | + | |
| - | | D | 5 | 1 | | + | |
| - | | E | 18 | 6 | | + | |
| - | | F | 80 | 8 | | + | |
| - | ## Vu en première | + | **Exemple |
| - | L' | + | ^ Objet ^ Valeur ^ Encombrement ^ |
| + | | A | 126 | 14 | | ||
| + | | B | 32 | 2 | | ||
| + | | C | 20 | 5 | | ||
| + | | D | 5 | 1 | | ||
| + | | E | 18 | 6 | | ||
| + | | F | 80 | 8 | | ||
| - | Par exemple, si on choisit de trier par valeur décroissante, | + | ===== Vu en première |
| - | | Objet | Valeur | Poids | | + | L' |
| - | | ----- | ------ | ----- | | + | |
| - | | A | 126 | 14 | | + | |
| - | | F | 80 | 8 | | + | |
| - | | B | 32 | 2 | | + | |
| - | | C | 20 | 5 | | + | |
| - | | E | 18 | 6 | | + | |
| - | | D | 5 | 1 | | + | |
| - | Puis on complète le sac. On prend A en premier. Il ne reste alors que 1 kg de place disponible. On ne peut donc pas prendre les items suivants sauf le D. | + | <WRAP tip>Avec la méthode gloutonne, c'est le tri qui prend le plus de temps : les tris les plus rapides, pour un tableau de taille $n$, sont en $n\log(n)$. La suite de l' |
| + | C'est à dire qu'une liste de taille 100 prend consomme de l' | ||
| + | |||
| + | == Tri par valeur décroissante == | ||
| + | |||
| + | Par exemple, si on choisit de trier par **valeur décroissante**, | ||
| + | |||
| + | ^ Objet ^ Valeur ^ Encombrement ^ | ||
| + | | A | 126 | 14 | | ||
| + | | F | 80 | 8 | | ||
| + | | B | 32 | 2 | | ||
| + | | C | 20 | 5 | | ||
| + | | E | 18 | 6 | | ||
| + | | D | 5 | 1 | | ||
| + | |||
| + | Puis on complète le sac : | ||
| + | * On prend A en premier, | ||
| + | * il ne reste alors que 1 kg de place disponible. On ne peut donc pas prendre les items F, B, ... | ||
| + | * on prend D. | ||
| Le sac contiendra A et D totalisant une valeur de 131 | Le sac contiendra A et D totalisant une valeur de 131 | ||
| - | On aurait aussi pu trier selon le meilleur rapport | + | == Tri par valeur / poids décroissant == |
| - | | Objet | Valeur | + | On aurait aussi pu trier par **rapport valeur / encombrement décroissant** |
| - | | ----- | ------ | ----- | ----------- | | + | |
| - | | B | 32 | 2 | + | ^ Objet ^ Valeur |
| - | | F | 80 | 8 | + | | B | 32 | 2 | 16 | |
| - | | A | 126 | 14 | 9 | | + | | F | 80 | 8 | 10 | |
| - | | D | 5 | 1 | + | | A | 126 | 14 |
| - | | C | 20 | 5 | + | | D | 5 | 1 | 5 | |
| - | | E | 18 | 6 | + | | C | 20 | 5 | 4 | |
| + | | E | 18 | 6 | 3 | | ||
| Dans ce cas on prend B, F, pas A qui ne rentre plus, D, pas C ni E qui ne rentrent plus. | Dans ce cas on prend B, F, pas A qui ne rentre plus, D, pas C ni E qui ne rentrent plus. | ||
| Ligne 51: | Ligne 61: | ||
| Ce sac contenant B, F, D totalise une valeur de 117. | Ce sac contenant B, F, D totalise une valeur de 117. | ||
| - | La stratégie précédent était meilleure mais ce n'est pas vrai en général. | + | <WRAP important> |
| - | ## Programmation dynamique | + | ===== Programmation dynamique |
| - | L' | + | ==== Principe ==== |
| - | Par exemple `SaD[2, | + | L' |
| - | | Objet | Valeur | Poids | | + | <wrap important> |
| - | | ----- | ------ | ----- | | + | |
| - | | A | 126 | 14 | | + | |
| - | | B | 32 | 2 | | + | |
| - | Dans le cas de notre problème initial, on pourra prendre $0 \leqslant i \leqslant 6$ et $0 \leqslant c \leqslant C = 15$ . | + | Par exemple $msad_{2, |
| - | La notation `SaD[i][c]` avec des crochets est choisis car nous souhaitons stocker tous les résultats intermédiaires dans un tableau. | + | ^ Objet ^ Valeur ^ Encombrement ^ |
| + | | A | 126 | 14 | | ||
| + | | B | 32 | 2 | | ||
| - | Pour les besoins du programme, on stockera les objets | + | Il devrait être évident que dans ce cas, le meilleur sac contient seulement B. On pourra dire que $msad_{2, 8} = \{ B \}$. |
| - | ```python | + | Dans le cas de notre problème, on pourra prendre $0 \leqslant i \leqslant 6$ et $0 \leqslant c \leqslant |
| - | objets = [ | + | |
| - | (' | + | |
| - | (' | + | |
| - | ('C', 20, 5), | + | |
| - | (' | + | |
| - | (' | + | |
| - | (' | + | |
| - | ] | + | |
| - | ``` | + | |
| - | Faites attention que l' | + | <WRAP box> |
| + | == Questions == | ||
| - | **Questions :** | + | - Que vaut $msad_{0, |
| + | - Plus généralement, | ||
| + | - De même, que vaut $msad_{0, | ||
| + | - Pour quelle valeur de $i$ et $c$ faut-il trouver $msad_{i, | ||
| + | </ | ||
| - | 1. Quelles sont les valeurs de `i` et `c` pour lesquelles `SaD[i][c]` est la réponse au problème initial ? | + | La méthode dynamique consiste à chercher $msad_{i, |
| - | 2. Que peut-on dire de `SaD[i][0]` pour tous les `i` ? | + | | ^ c = 0 ^ c = 1 ^ c = 2 ^ c = 3 ^ ... ^ c = 14 ^ c = 15 ^ |
| + | ^ i = 0 | $\varnothing$ | $\varnothing$ | $\varnothing$ | $\varnothing$ | ... | $\varnothing$ | $\varnothing$ | | ||
| + | ^ i = 1 | $\varnothing$ | | ||
| + | ^ ... | $\varnothing$ | | ||
| + | ^ i = 6 | $\varnothing$ | | ||
| - | 3. Que peut-on dire de `SaD[0][c]` pour tous les `c` ? | + | Maintenant, nous devons réfléchir à la façon |
| - | 4. On en arrive au point délicat. On va commencez avec deux cas particulier avant de généraliser. | + | <WRAP box> |
| + | == Questions == | ||
| - | | + | - $msad_{2, |
| + | - $msad_{3, | ||
| + | | ||
| + | * $msad_{2,2} \cup \{ C \}$, c'est à dire le meilleur | ||
| + | </ | ||
| - | | + | D'une façon générale, pour $0 < i$ et $0 < c$, on calcule $msad_{i, |
| + | * le sac $msad_{i-1, c}$, c'est à dire le sac de même capacité dans lequel **on ne prend pas** le i< | ||
| + | * le sac $msad_{i-1, c-p_i} \cup \{\text{i}^\text{ème}\text{ item}\}$, où $p_i$ est le poids du i< | ||
| + | |||
| + | ==== Implémentation ==== | ||
| + | |||
| + | Pour les besoins du programme, on stockera les objets dans un tableau : | ||
| + | |||
| + | <code lang=python> | ||
| + | objets = [ | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | {" | ||
| + | ] | ||
| + | </ | ||
| - | * Je me demande quelle | + | <WRAP box> |
| + | == Questions == | ||
| + | - Écrire une fonction '' | ||
| + | >>> | ||
| + | 146 | ||
| + | </ | ||
| + | - Écrire une fonction '' | ||
| + | >>> | ||
| + | 19 | ||
| + | </ | ||
| + | </ | ||
| - | | + | On va maintenant réaliser une fonction '' |
| - | * soit le meilleur sac de 7 kg avec choix parmi A, B, | + | '' |
| - | * soit le meilleur sac de 2 kg avec choix parmi A, B et contenant l'objet C | + | |
| - | 5. Généralisation. Pour `i > 0`, notons `p_i` le poids de l'objet numéro `i` et `v_i` sa valeur. Justifiez que : | + | Il faudra d'abord initialiser '' |
| - | * si `c < p_i`, alors `SaD[i][c] = SaD[i-1][c]` | + | <WRAP box> |
| - | * sinon, `SaD[i][c] | + | == Questions == |
| - | 6. Réalisez | + | - Écrire |
| + | - Testez | ||
| + | - Évaluez | ||
| + | - On vous fournit les objets sous forme d' | ||
| + | </ | ||
| - | | ||
| - | </ | ||
nsi/terminales/sac_a_dos.1618320352.txt.gz · Dernière modification : de goupillwiki
