Sac à dos
Problème du sac à dos
Soit un ensemble de objets de valeurs et de poids respectifs .
Comment remplir un sac à dos en maximisant la valeur totale emportée tout en ne dépassant pas le poids maximal admissible par le sac à dos ? On suppose que les objets sont uniques et insécables, toutes les valeurs et tous les poids sont des entiers.
Formellement, comment maximiser en respectant la contrainte où est l'ensemble des objets emportés dans le sac ?
Ce problème est à sous-structure optimale : on peut exprimer une solution optimale au problème en fonction des solutions optimales des sous-problèmes. La programmation dynamique est donc une option possible pour résoudre ce problème. Voici les équations de Bellman pour ce problème, où est la solution optimale au problème du sac à dos avec n objets et un poids maximum admissible de :
Ces équations sont à interpréter comme suit :
- S'il n'y a pas d'objets ou si l'on ne peut pas mettre d'objets, on ne peut pas emporter de valeur dans le sac.
- Si l'objet peut être mis dans le sac, la solution optimale est le maximum de deux cas possibles :
- soit l'objet fait partie de la solution optimale.
- soit la solution optimale est obtenue sans l'objet.
- Si l'objet ne peut pas être mis dans le sac, la solution optimale est obtenue sans cet objet.
En Python, on se donne une liste globale d'objets:
OBJETS = ((100, 7), (700, 15), (500, 2), (400, 9), (300, 3), (200, 2))
- Écrire une fonction impérative1IndiceConstruire une matrice de dimensions (n+1) x (pmax+1) puis remplir chaque cellule en comparant les solutions avec et sans l'objet courant.
dyn_kp(pmax)qui renvoie la valeur maximale d'un sac à dos de capacitépmaxcontenant des objets uniques et insécables définis par leurs valeurs et poids. Cette fonction utilise la variable globaleOBJETSun tableau de résolution qu'elle complète en suivant les équations de Bellman du problème. Par exempledyn_kp(10)renvoie1000. - Écrire une fonction récursive sans mémoïsation2IndiceDéfinir les conditions d'arrêt pour un sac vide ou sans objets puis calculer le maximum entre l'inclusion et l'exclusion de l'élément actuel.
rec_kp(n, pmax)qui renvoie la valeur optimale d'un sac à dos de capacitépmaxen considérant lesnpremiers objets disponibles. Par exemplerec_kp(6,5)renvoie800. - Écrire une fonction récursive avec mémoïsation3IndiceVérifier la présence des paramètres dans un cache avant tout calcul puis stocker le résultat obtenu pour éviter les appels redondants.
mem_kp(n, pmax, S)qui renvoie la valeur optimale d'un sac à dos de capacitépmaxen mémorisant les résultats intermédiaires dans le dictionnaireSpassé en paramètre. Par exemplemem_kp(6, 5, {})renvoie800.
Console initialisée. En attente de l'interpréteur...