Adloun

Le sac à dos fractionnaire : le même glouton, mais exact

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

Énoncé

Sur le sac à dos, le glouton par rapport valeur/poids n'a aucune garantie. Montrer que, si l'on autorise à couper les objets, ce même glouton devient optimal. Démontrer par échange.

Corrigé

Le problème fractionnaire. On peut prendre une fraction de chaque objet, pour un gain et un poids . On maximise sous la contrainte .


(* Valeur optimale du sac à dos FRACTIONNAIRE.
   Précondition : p.(i) > 0. Complexité : Theta(n log n), le tri.
   Postcondition : le résultat majore l'optimum du sac à dos entier. *)
let sac_fractionnaire p v c =
  let n = Array.length p in
  let idx = Array.init n (fun i -> i) in
  Array.sort (fun i j ->                                 (* rapport DÉCROISSANT *)
    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 (float_of_int c) and total = ref 0.0 in
  Array.iter (fun i ->
    let pris = min !reste (float_of_int p.(i)) in        (* on FRACTIONNE le dernier *)
    total := !total +. pris *. float_of_int v.(i) /. float_of_int p.(i);
    reste := !reste -. pris) idx;
  !total

La démonstration par échange. Soit , et supposons les objets rangés par décroissant. Soit une solution optimale. Si n'est pas la solution gloutonne, il existe avec et : on a pris du alors qu'il restait du , meilleur.

Transférons un poids de vers : le poids total est inchangé, et la valeur varie de

puisque . La solution obtenue est donc encore optimale, et elle a une variable de moins hors de du côté glouton. En itérant — au plus fois — on aboutit à la solution gloutonne sans jamais perdre de valeur. Elle est donc optimale.

Pourquoi cet argument tombe sur le sac entier. Il repose entièrement sur la possibilité de transférer un morceau . Avec , on ne peut plus transférer que des objets entiers, dont les poids ne coïncident pas — et il n'y a plus d'échange. Une seule hypothèse retirée, et la preuve entière s'effondre : c'est la marque des preuves de glouton, qui sont fragiles et doivent être refaites à chaque variante.

Ce que l'optimum fractionnaire vaut. Mesuré sur le contre-exemple du cours, avec et les objets et : le fractionnaire vaut , l'entier . Le fractionnaire majore toujours l'entier, puisque toute solution entière est une solution fractionnaire particulière.

C'est ce qui en fait la borne de la séparation et évaluation du chapitre chap:probabilistes : une borne optimiste, calculable en , et d'autant plus serrée que les objets sont petits devant . Le glouton exact d'un problème relâché sert de borne à son problème d'origine — c'est un procédé général, et le programme le cite sous le nom de relaxation continue.

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.