Adloun

Une heuristique n'est pas une approximation

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 25 — Algorithmes probabilistes, approximation, séparation et évaluation

Énoncé

Le glouton du sac à dos prend les objets par rapport valeur/poids décroissant.

Corrigé

1. Deux objets suffisent, et une capacité qu'on fait grandir :

Objetpoidsvaleurrapport valeur/poids

Le glouton prend d'abord — son rapport est le meilleur —, puis ne tient plus : il reste de capacité et pèse . Il rend . L'optimum prend seul et rend . Mesures :

gloutonoptimumrapport

Le rapport tend vers : aucune constante ne convient. Le glouton du sac à dos n'est pas une -approximation, pour aucun . C'est ce que le tableau récapitulatif du chapitre note d'un « aucune garantie ».

2. La correction tient en une ligne : comparer le résultat du glouton à celui de la meilleure solution à un seul objet, et garder le meilleur des deux.


(* 1/2-approximation du sac a dos.
   Entrees : poids p, valeurs v (positives), capacite c.
   Sortie  : une valeur atteignable >= OPT/2. Complexite : O(n log n). *)
let glouton_ameliore p v c =
  let meilleur_seul = ref 0 in
  for i = 0 to Array.length p - 1 do
    if p.(i) <= c && v.(i) > !meilleur_seul then meilleur_seul := v.(i)
  done;
  max (glouton p v c) !meilleur_seul

La preuve. On peut supposer que tout objet tient seul dans le sac : un objet plus lourd que la capacité n'entre dans aucune solution, et les deux algorithmes l'ignorent à l'identique. Soit alors le premier objet que le glouton refuse par manque de place, et la valeur qu'il a accumulée avant ; on a , puisque le glouton continue après .

La relaxation continue — objets triés par rapport décroissant, fractionnement autorisé — donne une borne supérieure de , et cette borne vaut plus une fraction de . Donc

La dernière inégalité vient de ce que est la valeur d'un objet qui tient seul dans le sac, donc meilleur_seul.

Vérification : sur instances tirées au hasard, le rapport minimal du glouton seul descend à , tandis que celui du glouton amélioré ne descend pas sous — au-dessus de la garantie , comme il se doit.

Ce que cet exercice enseigne. Une heuristique et une approximation peuvent différer d'une ligne de code, mais elles ne diffèrent pas d'un peu : l'une n'a aucune garantie, l'autre en a une, prouvée sur toute instance. Et remarquer que la preuve suit exactement le patron annoncé par le chapitre : on minore l'optimum — ici en le majorant par —, jamais on ne le calcule.

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.