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.