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/10 11:23] – [Implémentation] goupillwiki | nsi:premiere:sac_a_dos [2022/05/09 20:00] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 4: | Ligne 4: | ||
| 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 : | ||
| * On dispose d'un sac de capacité C, | * On dispose d'un sac de capacité C, | ||
| 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 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** puis **à exécuter** : | Voici un modèle **à compléter** puis **à exécuter** : | ||
| - | <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): |
| ''' | ''' | ||
| - | | + | critere: fonction qui pour nom d'objet donné renvoie sa valeur dans le tri |
| - | objet: objet à mettre dans le sac | + | exemple : si on tri par valeur décroissante, |
| - | ajoute l' | + | |
| - | renvoie True en cas de succès, False sinon | + | |
| - | ''' | + | |
| - | return False | + | |
| - | + | ||
| - | def tri(objets, critere): | + | |
| - | ''' | + | |
| - | objets: tableau des objets disponibles à trier | + | |
| - | | + | |
| - | exemple : si on tri par valeur décroissante, | + | |
| - | | + | |
| - | ne renvoie rien, trie objets en place | + | |
| ''' | ''' | ||
| return | return | ||
| - | def valeur_sac(sac): | + | |
| + | def poids(sac): | ||
| + | ''' | ||
| + | sac: tableau des noms des objets contenus dans le sac | ||
| + | renvoie la masse totale contenue dans le sac | ||
| + | ''' | ||
| + | return 0 | ||
| + | |||
| + | def valeur(sac): | ||
| ''' | ''' | ||
| - | sac: sac dont on veut la valeur | + | sac: tableau des noms des objets contenus dans le sac |
| renvoie la valeur totale de ce sac. | renvoie la valeur totale de ce sac. | ||
| ''' | ''' | ||
| return 0 | return 0 | ||
| + | |||
| + | def rentre_dans_le_sac(nom, | ||
| + | ''' | ||
| + | nom: nom de l' | ||
| + | sac: tableau des noms des objets contenus dans le sac | ||
| + | C: Capacité max du sac | ||
| + | renvoie True si l' | ||
| + | ''' | ||
| + | return False | ||
| | | ||
| - | def glouton(objets, critere): | + | |
| + | def ajouter_objet_dans_sac(nom, sac): | ||
| ''' | ''' | ||
| - | | + | |
| + | sac: tableau des noms des objets contenus | ||
| + | modifie sac en y ajoutant nom | ||
| + | ''' | ||
| + | return | ||
| + | |||
| + | |||
| + | def glouton(C, critere): | ||
| + | ''' | ||
| + | C: capacité max du sac | ||
| critere: fonction utilisée dans le tri | critere: fonction utilisée dans le tri | ||
| renvoie le sac obtenu par l' | renvoie le sac obtenu par l' | ||
| Ligne 148: | Ligne 167: | ||
| return [] | return [] | ||
| | | ||
| - | if __name__ | + | # démonstration |
| - | # tests | + | C = 15 |
| - | | + | objets = { |
| - | | + | "A": |
| - | | + | "B": |
| - | | + | "C": |
| - | | + | "D": |
| - | | + | "E": |
| - | | + | "F": |
| - | ] | + | } |
| - | + | ||
| - | def critere_valeur(objet): | + | # exemple de critère |
| - | return | + | def critere_valeur(nom): |
| + | obj = objets[nom] | ||
| + | | ||
| | | ||
| - | | + | sac = glouton(C, critere_valeur) |
| - | print(sac) | + | print(sac) |
| - | </file> | + | print(valeur(sac)) |
| + | </code> | ||
| - | == Fonction lambda == | + | === Fonction lambda |
| En mathématique, | En mathématique, | ||
| - | Notre fonction '' | + | Notre fonction '' |
| Il existe une notation pour cela en Python : | Il existe une notation pour cela en Python : | ||
| - | <Code python> | + | <code python> |
| - | lambda | + | lambda |
| - | </Code> | + | </code> |
| - | C'est une fonction anonyme prenant comme argument (// | + | C'est une fonction anonyme prenant comme argument (// |
| Alors nous pouvons remplacer : | Alors nous pouvons remplacer : | ||
| - | <Code python> | + | <code python> |
| - | # code actuel, dans les tests | + | # code actuel |
| - | def critere_valeur(objet): | + | def critere_valeur(nom): |
| - | return | + | return |
| sac = glouton(objets, | sac = glouton(objets, | ||
| # en utilisant lambda | # en utilisant lambda | ||
| - | sac = glouton(objets, | + | sac = glouton(objets, |
| - | </Code> | + | </code> |
| Le résultat est le même. | Le résultat est le même. | ||
| - | == autre critères == | + | === Autre critères |
| Exécutez le programme avec d' | Exécutez le programme avec d' | ||
| * rapport valeur / poids décroissant, | * rapport valeur / poids décroissant, | ||
| - | * poids croissant | + | * poids croissant\\ //Il faut trouver une astuce puisque le tri se fait dans l' |
| Essayez de le faire en utilisant '' | Essayez de le faire en utilisant '' | ||
nsi/premiere/sac_a_dos.1620638639.txt.gz · Dernière modification : de goupillwiki
