Adloun

Une parade qui vaut 2, et pourquoi elle vaut 2

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 16 — Algorithmes gloutons

Énoncé

Le cours annonce que « prendre le meilleur entre la solution gloutonne et le meilleur objet seul » donne une -approximation du sac à dos. Le démontrer, et le vérifier.

Corrigé

L'algorithme, avec le glouton du cours écrit au complet :


(* Valeur du glouton par rapport valeur/poids décroissant, objets ENTIERS.
   Précondition : p.(i) > 0. Complexité : Theta(n log n). *)
let sac_glouton p v c =
  let n = Array.length p in
  let idx = Array.init n (fun i -> i) in
  Array.sort (fun i j ->
    compare (float_of_int v.(j) /. float_of_int p.(j))
            (float_of_int v.(i) /. float_of_int p.(i))) idx;
  let reste = ref c and total = ref 0 in
  Array.iter (fun i ->
    if p.(i) <= !reste then begin
      reste := !reste - p.(i); total := !total + v.(i) end) idx;
  !total

(* Renvoie au moins la moitié de l'optimum du sac à dos entier.
   Précondition : p.(i) > 0 et v.(i) >= 0. Complexité : Theta(n log n). *)
let sac_parade p v c =
  let n = Array.length p in
  let seul = ref 0 in
  for i = 0 to n - 1 do
    if p.(i) <= c && v.(i) > !seul then seul := v.(i) done;
  max (sac_glouton p v c) !seul

La démonstration. Rangeons les objets par rapport décroissant, et notons l'indice du premier objet que le glouton ne peut plus mettre — le premier « refusé ». Notons la valeur des objets , tous pris, et l'optimum fractionnaire.

Le glouton fractionnaire prend les objets entièrement, puis une fraction de l'objet . Donc

Or l'optimum entier vérifie (exercice précédent). D'où , et par conséquent

La solution gloutonne vaut au moins , et le meilleur objet seul vaut au moins — car tient dans le sac, . Le maximum des deux vaut donc au moins . C'est une -approximation.

La vérification. Sur instances tirées au hasard ( à objets, poids , valeurs , capacité ), l'optimum a été calculé par table et comparé aux deux algorithmes :

pire rapport rencontré
glouton seul
parade

Le pire rapport de la parade reste sous , comme la preuve l'exige. Et la famille du cours — un objet et un objet — donne pour le glouton seul :

gloutonparadeoptimum
21010
2100100
21 000

Le rapport du glouton seul vaut : arbitrairement mauvais, exactement comme le cours l'annonce. La parade, elle, est exacte sur cette famille.

Ce qu'il faut retenir de la structure de la preuve. On n'a jamais comparé l'algorithme à l'optimum — qu'on ne sait pas calculer. On l'a comparé à une majoration de l'optimum, l'optimum fractionnaire, qui, elle, se calcule. C'est le patron de toute preuve d'approximation, et il est le même que pour la couverture des sommets : là on minorait par la taille d'un couplage, ici on le majore par le fractionnaire. Minimisation : minorer l'optimum. Maximisation : le majorer.

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.