nsi:premiere:sac_a_dos
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:premiere:sac_a_dos [2021/05/08 18:36] – goupillwiki | nsi:premiere:sac_a_dos [2022/05/09 20:00] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 5: | Ligne 5: | ||
| Il s'agit d'un problème classique d' | Il s'agit d'un problème classique d' | ||
| - | | + | C'est le problème du **cambrioleur** : Le cambrioleur doit choisir rapidement quels objets il emporte. Il veut emporter un maximum de valeur mais il doit les mettre dans son sac dont la capacité est limitée. |
| + | |||
| + | Plus formellement : | ||
| + | |||
| + | | ||
| * d'un assortiment d' | * d'un assortiment d' | ||
| * On cherche à placer des objets dans le sac en respectant la contrainte de capacité et en maximisant la valeur totale du contenu du sac. | * On cherche à placer des objets dans le sac en respectant la contrainte de capacité et en maximisant la valeur totale du contenu du sac. | ||
| Ligne 23: | Ligne 27: | ||
| L' | L' | ||
| - | - On trie le tableau selon un critère, | + | - on trie le tableau selon un critère, |
| - | - puis on remplit le sac en prenant les objets dans l' | + | - on remplit le sac en prenant les objets dans l' |
| - | == Valeur décroissante == | + | === Valeur décroissante |
| Par exemple, trions le tableau par valeur décroissante. | Par exemple, trions le tableau par valeur décroissante. | ||
| Ligne 45: | Ligne 49: | ||
| Le sac contiendra A et D totalisant une valeur de 131. | Le sac contiendra A et D totalisant une valeur de 131. | ||
| - | == Poids décroissant | + | === Poids croissant === |
| C'est un autre choix possible. Il aboutira à un contenu de sac différent. | C'est un autre choix possible. Il aboutira à un contenu de sac différent. | ||
| Ligne 76: | Ligne 80: | ||
| ===== Implémentation ===== | ===== Implémentation ===== | ||
| - | == Les objets == | + | === Les objets |
| - | Les items disponibles seront représentés | + | Les items disponibles seront représentés dans un dictionnaire. Par exemple : |
| <Code python> | <Code python> | ||
| - | objets = [ | + | objets = { |
| - | | + | "A": |
| - | | + | "B": |
| - | | + | "C": |
| - | | + | "D": |
| - | | + | "E": |
| - | | + | "F": |
| - | ] | + | } |
| </ | </ | ||
| - | == Sac == | + | === Sac === |
| Le contenu du sac sera lui aussi représenté par un tableau. Par exemple : | Le contenu du sac sera lui aussi représenté par un tableau. Par exemple : | ||
| <Code python> | <Code python> | ||
| - | sac = [ | + | sac = [" |
| - | { " | + | |
| - | { " | + | |
| - | ] | + | |
| </ | </ | ||
| - | == fonctions utiles == | + | === fonctions utiles |
| Nous avons besoin des fonctions suivantes : | Nous avons besoin des fonctions suivantes : | ||
| - | - ajouter un objet dans un sac si c'est possible, | ||
| - trier les objets dans un ordre défini, | - trier les objets dans un ordre défini, | ||
| + | - calculer le poids total d'un sac, | ||
| - calculer la valeur d'un sac | - calculer la valeur d'un sac | ||
| + | - tester si on peut ajouter un objet dans un sac, | ||
| + | - ajouter un objet dans un sac | ||
| - | Voici un modèle à compléter : | + | Voici un modèle |
| - | <file python sacados.py> | + | <code python> |
| - | ''' | + | # sacados.py |
| - | Algorithme glouton : problème du sac à dos | + | # la dictionnaire objets contenant les objets sera une variable globale. |
| - | ''' | + | |
| - | def ajouter_objet_dans_sac(sac, objet): | + | def tri(critere): |
| ''' | ''' | ||
| - | | + | |
| - | | + | exemple : si on tri par valeur décroissante, |
| - | | + | la valeur de l' |
| - | renvoie True en cas de succès, False sinon | + | |
| + | ''' | ||
| + | return | ||
| + | |||
| + | |||
| + | def poids(sac): | ||
| + | ''' | ||
| + | sac: tableau des noms des objets contenus | ||
| + | | ||
| + | ''' | ||
| + | return 0 | ||
| + | |||
| + | def valeur(sac): | ||
| + | ''' | ||
| + | sac: tableau des noms des objets contenus dans le sac | ||
| + | renvoie la valeur totale de ce sac. | ||
| + | ''' | ||
| + | return 0 | ||
| + | |||
| + | def rentre_dans_le_sac(nom, | ||
| + | ''' | ||
| + | nom: nom de l' | ||
| + | sac: tableau des noms des objets contenus | ||
| + | C: Capacité max du sac | ||
| + | renvoie True si l' | ||
| ''' | ''' | ||
| return False | return False | ||
| | | ||
| - | def tri_sac(sac, critere): | + | |
| + | def ajouter_objet_dans_sac(nom, sac): | ||
| ''' | ''' | ||
| - | | + | |
| - | critere: fonction qui pour un un objet donné renvoie sa valeur dans le tri | + | |
| - | exemple : si on tri par valeur décroissante, | + | modifie sac en y ajoutant nom |
| - | | + | |
| ''' | ''' | ||
| return | return | ||
| + | | ||
| - | def valeur_sac(sac): | + | def glouton(C, critere): |
| ''' | ''' | ||
| - | | + | |
| - | renvoie | + | critere: fonction utilisée dans le tri |
| + | renvoie | ||
| ''' | ''' | ||
| - | return 0 | + | return |
| - | </file> | + | |
| + | # démonstration | ||
| + | C = 15 | ||
| + | objets = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | |||
| + | # exemple de critère | ||
| + | def critere_valeur(nom): | ||
| + | obj = objets[nom] | ||
| + | return obj[" | ||
| + | |||
| + | sac = glouton(C, critere_valeur) | ||
| + | print(sac) | ||
| + | print(valeur(sac)) | ||
| + | </ | ||
| + | |||
| + | === Fonction lambda === | ||
| + | |||
| + | En mathématique, | ||
| + | |||
| + | Notre fonction '' | ||
| + | |||
| + | Il existe une notation pour cela en Python : | ||
| + | |||
| + | <code python> | ||
| + | lambda nom: objets[nom][' | ||
| + | </code> | ||
| + | |||
| + | C'est une fonction anonyme prenant comme argument (// | ||
| + | |||
| + | Alors nous pouvons remplacer : | ||
| + | <code python> | ||
| + | # code actuel | ||
| + | def critere_valeur(nom): | ||
| + | return objets[nom][' | ||
| + | sac = glouton(objets, | ||
| + | |||
| + | # en utilisant lambda | ||
| + | sac = glouton(objets, | ||
| + | </ | ||
| + | |||
| + | Le résultat est le même. | ||
| + | |||
| + | === Autre critères === | ||
| + | |||
| + | Exécutez le programme avec d' | ||
| + | * rapport valeur / poids décroissant, | ||
| + | * poids croissant\\ //Il faut trouver une astuce puisque le tri se fait dans l' | ||
| + | |||
| + | Essayez de le faire en utilisant '' | ||
| + | |||
nsi/premiere/sac_a_dos.1620491781.txt.gz · Dernière modification : de goupillwiki
