\nOn dispose d’un sac pouvant supporter une masse maximale donnée et de divers objets ayant chacun une valeur et une masse. Il s’agit de choisir les objets à emporter dans le sac afin d’obtenir la valeur totale la plus grande tout en respectant la contrainte de masse maximale. C’est un problème d’*optimisation avec contrainte*.\n\nCe problème peut se résoudre par force brute, c’est-à-dire en testant tous les cas possibles. Mais ce type de résolution présente un problème d’efficacité. Son coût en fonction du nombre d’objets disponibles croît de manière exponentielle.\n\nNous pouvons aussi envisager une stratégie gloutonne. Le principe d’un algorithme glouton est de faire le meilleur choix pour prendre le premier objet, puis le meilleur choix pour prendre le deuxième, et ainsi de suite. Que faut-il entendre par meilleur choix ? Est-ce prendre l’objet qui a la plus grande valeur, l’objet qui a la plus petite masse, l’objet qui a le rapport valeur/masse le plus grand ? Cela reste à définir.\n***\n**Le problème à résoudre :**\n\nOn doit choisir parmi 7 objets, dont les valeurs et masses sont indiquées dans le tableau ci-dessous, lesquels nous pouvons mettre dans un sac à dos de capacité maximale 10 kg. On place dans le son sac à dos les objets dont le rapport valeur/masse est le plus grand possible tout en ne dépassant pas la capacité maximale (masse maximale) du sac à dos.\n\n| Objet | A | B | C | D | E | F | G |\n| :------------ |:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n| Valeur (en €) | 10 | 11 | 23 | 9 | 30 | 6 | 8 |\n| Masse (en kg) | 2 | 4,5 | 5 | 4 | 9 | 1 | 2,5 |\n\nUn objet est représenté par un triplet contenant son nom (de type `str`), sa valeur (de type `int`) et sa masse (de type `float`).\n\nLes triplets obtenus sont les éléments d’une liste :\n
"},{"metadata":{"trusted":false},"cell_type":"code","source":"objets = [['A', 10, 2], ['B', 11, 4.5], ['C', 23, 5], ['D', 9, 4], ['E', 30, 9], ['F', 6, 1], ['G', 8, 2.5]]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2. La méthode par algorithme glouton"},{"metadata":{},"cell_type":"markdown","source":"!!! note \nOn choisit la stratégie gloutonne suivante : tant qu'il reste un objet transportable, prendre l'objet qui a la plus grande valeur massique $\\mu=\\frac{valeur}{masse}$\n\nPour appliquer cette stratégie, on va devoir trier la liste des objets par ordre décroissant sur les valeurs massiques. Pour ce faire, nous allons utiliser une fonction `liste_triee` qui renvoie la liste des objets disponibles, triée par valeur massique décroissante.\n!!!"},{"metadata":{},"cell_type":"markdown","source":"## 2.1. Préparation de l'algorithme"},{"metadata":{},"cell_type":"markdown","source":"Un objet est représenté par une liste du type ['A', 10, 2].\n\n### Question 1\nEcrire les instructions permettant de calculer la valeur (en €) de la liste des objets renvoyée par l’algorithme glouton."},{"metadata":{"trusted":false},"cell_type":"code","source":"# Votre code ici\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"
\n\n### Question 2\n \nL'algorithme glouton est-il optimal pour le problème du sac à dos ?"},{"metadata":{},"cell_type":"raw","source":"# Votre réponse :\n"},{"metadata":{},"cell_type":"markdown","source":"# 3. Pour aller plus loin"},{"metadata":{},"cell_type":"markdown","source":"!!! question Travail à faire\nCompléter la fonction ci-dessous puis la tester. Elle doit renvoyer une liste triée (par ordre décroissant des valeurs massiques) de dictionnaires des objets.\n\nVérifier que cette liste est correctement triée et que les valeurs massiques correspondent au tableau suivant :\n\n| Objet | A | B | C | D | E | F | G |\n| :--------------- |:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n| Valeur (en €) | 10 | 11 | 23 | 9 | 30 | 6 | 8 |\n| Masse (en kg) | 2 | 4,5 | 5 | 4 | 9 | 1 | 2,5 |\n| $\\mu$ (en € / kg)| 5 |2,44 | 4,6 | 2,25| 3,33| 6 | 3,2 |\n!!!"},{"metadata":{"trusted":false},"cell_type":"code","source":"def listeDictionnaires(liste):\n '''Entrée: liste d'objets du type [['A', 10, 2], ['B', 11, 4.5], ...]\n Sortie : liste de dictionnaires triée par valeurs massiques décroissantes\n '''\n L = []\n for objet in liste:\n d = dict()\n d['Nom'] = ...\n d['Valeur'] = ...\n d['Masse'] = ...\n d['ValeurMassique'] = ...\n L.append(...)\n L.sort(key = lambda x: x[...], reverse = True) # il faut faire le tri sur la clé \"ValeurMassique\"\n return ...","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# Vous pouvez faire vos tests ici\n","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false,"trusted":false},"cell_type":"code","source":"# Cette cellule NE DOIT PAS ETRE modifiée\n# Test final de la fonction rebdu_monnaie\n# Si votre fonction est correcte alors aucun message d'erreur ne devrait apparaitre après l'exécution de cette cellule\n\nobjets = [['A', 10, 2], ['B', 11, 4.5], ['C', 23, 5], ['D', 9, 4], ['E', 30, 9], ['F', 6, 1], ['G', 8, 2.5]]\nassert listeDictionnaires(objets)==[{'Nom': 'F', 'Valeur': 6, 'Masse': 1, 'ValeurMassique': 6.0}, {'Nom': 'A', 'Valeur': 10, 'Masse': 2, 'ValeurMassique': 5.0}, {'Nom': 'C', 'Valeur': 23, 'Masse': 5, 'ValeurMassique': 4.6}, {'Nom': 'E', 'Valeur': 30, 'Masse': 9, 'ValeurMassique': 3.3333333333333335}, {'Nom': 'G', 'Valeur': 8, 'Masse': 2.5, 'ValeurMassique': 3.2}, {'Nom': 'B', 'Valeur': 11, 'Masse': 4.5, 'ValeurMassique': 2.4444444444444446}, {'Nom': 'D', 'Valeur': 9, 'Masse': 4, 'ValeurMassique': 2.25}]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"!!! question Travail à faire\nCompléter la fonction `sacAdosGlouton()` ci-dessous puis la tester. Elle doit renvoyer le même résultat que la fonction analogue du $3.2.\n!!!"},{"metadata":{"trusted":false},"cell_type":"code","source":"def sacAdosGlouton(liste, masseMax):\n ''' Entrée : une liste d'objet du type [['A', 10, 2], ['B', 11, 4.5], ...] et un entier masseMax (capacité du sac à dos)\n Sortie : la liste des objets renvoyée par l'algorithme glouton\n '''\n L = listeDictionnaires(...)\n masse_des_objets = 0\n listeObjetsAprendre = []\n i = 0\n while masse_des_objets + L[i][...] <= masseMax and i < len(liste):\n listeObjetsAprendre.append(L[i][...])\n masse_des_objets += L[i][...]\n i += 1\n return ...","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# Vous pouvez faire vos tests ici\n","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false,"trusted":false},"cell_type":"code","source":"# Cette cellule NE DOIT PAS ETRE modifiée\n# Test final de la fonction rebdu_monnaie\n# Si votre fonction est correcte alors aucun message d'erreur ne devrait apparaitre après l'exécution de cette cellule\n\nobjets = [['A', 10, 2], ['B', 11, 4.5], ['C', 23, 5], ['D', 9, 4], ['E', 30, 9], ['F', 6, 1], ['G', 8, 2.5]]\nassert sacAdosGlouton(objets, 10) == ['F', 'A', 'C']\nassert [sacAdosGlouton(objets, x) for x in range(20)] == [[], ['F'], ['F'], ['F', 'A'], ['F', 'A'], ['F', 'A'], ['F', 'A'], ['F', 'A'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C'], ['F', 'A', 'C', 'E'], ['F', 'A', 'C', 'E'], ['F', 'A', 'C', 'E']]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 4. Pour aller encore plus loin"},{"metadata":{},"cell_type":"markdown","source":"!!! question Travail à faire\nIl s'agit de convertir la liste initiale des objets en une liste de dictionnaires contenant, en plus des valeurs initiales (Nom, Valeur et Masse), la valeur massique puis réécrire les fonctions `valeurObjets()`, `liste_tries()` et `sacAdosGlouton()` en conséquence en faisant une sélection des objets non pas par valeur massique la plus élevée possible mais par valeur (en €) la plus élevée possible.\n!!!"},{"metadata":{"trusted":false},"cell_type":"code","source":"# Votre code ici\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# Vous pouvez faire vos tests ici\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"celltoolbar":"Éditer les Méta-Données"},"nbformat":4,"nbformat_minor":2}