Problème — Comparer glouton et programmation dynamique sur le sac à dos entier
Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 8 — Les algorithmes gloutons
Énoncé
Problème — Comparer glouton et programmation dynamique sur le sac à dos entier.
On veut quantifier l'écart entre le glouton et l'optimum sur le sac à dos entier. Écrire les deux versions et comparer sur un exemple où le glouton échoue.
Corrigé
La version dynamique remplit un tableau dp[i][w] (valeur maximale avec les premiers objets et une capacité ).
def sac_entier_glouton(objets, W):
objets = sorted(objets, key=lambda o: o[1] / o[0], reverse=True)
reste, valeur = W, 0
for poids, val in objets:
if poids <= reste:
reste -= poids
valeur += val
return valeur
def sac_entier_dynamique(objets, W):
n = len(objets)
dp = [[0] * (W + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
poids, val = objets[i - 1]
for w in range(W + 1):
dp[i][w] = dp[i - 1][w] # objet i non pris
if poids <= w: # objet i pris
dp[i][w] = max(dp[i][w], dp[i - 1][w - poids] + val)
return dp[n][W]
objets = [(10, 60), (20, 100), (30, 120)]
print(sac_entier_glouton(objets, 50)) # 160 (sous-optimal)
print(sac_entier_dynamique(objets, 50)) # 220 (optimal)
Le glouton donne alors que l'optimum est : pour le sac à dos entier, le choix localement optimal (meilleur rapport valeur/poids) ne suffit pas. La programmation dynamique, en , examine toutes les combinaisons utiles et garantit l'optimum, au prix d'une complexité supérieure au du glouton.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.