Adloun

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.