Adloun

Probleme – La couverture par ensembles : un glouton qui perd un facteur logarithmique

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

Énoncé

On dispose d'un univers de éléments et d'une famille de parties dont la réunion est . On cherche le plus petit nombre de parties couvrant .

Corrigé

1. Le glouton : prendre l'ensemble qui couvre le plus d'éléments encore découverts.


(* Nombre d'ensembles choisis par le glouton. Précondition : la réunion des
   familles couvre l'univers {0, ..., n-1}.
   Complexité : O(n m) avec des ensembles représentés par des listes. *)
let couverture n familles =
  let couvert = Array.make n false in
  let restants = ref n and pris = ref 0 in
  while !restants > 0 do
    let meilleur = ref (-1) and gain = ref 0 in
    List.iteri (fun i s ->
      let g = List.length (List.filter (fun x -> not couvert.(x)) s) in
      if g > !gain then begin gain := g; meilleur := i end) familles;
    List.iter (fun x -> if not couvert.(x) then begin
      couvert.(x) <- true; decr restants end) (List.nth familles !meilleur);
    incr pris
  done;
  !pris

Terminaison : variant restants, qui décroît strictement — tant qu'il reste des éléments découverts, le meilleur gain est , puisque la réunion couvre .

2. L'instance qui le piège. On prend de taille , partitionné en blocs avec . On ajoute deux ensembles et qui partagent chaque bloc en deux moitiés égales : .

L'optimum vaut : .

Le glouton, lui, commence par , de taille , strictement plus grand que et que . Puis et n'ont plus que éléments découverts chacun, tandis que en a : il prend . Et ainsi de suite. Il prend les blocs.

gloutonoptimumrapport
31432
43042
56252
612662
851082

Le rapport vaut : il n'est borné par aucune constante.

3. La garantie logarithmique. Notons la taille d'une couverture optimale, et le nombre d'éléments encore découverts après étapes du glouton, avec .

Les ensembles optimaux couvrent en particulier les éléments restants. L'un d'eux en couvre donc au moins . Comme le glouton choisit le meilleur de tous les ensembles, il en couvre au moins autant :

D'où . Ce nombre devient — donc nul, car entier — dès que . Le glouton s'arrête donc après au plus étapes :

Une analyse plus fine, en comptant le coût imputé à chaque élément couvert, donne la borne exacte .

Ce que ce problème apporte au chapitre. Il complète le tableau des trois régimes possibles pour un glouton :

ProblèmeStatut du gloutonPreuve
sélection d'activitésexactéchange
couverture des sommets (par couplage)-approchéminoration par un couplage
couverture par ensembles-approchédécroissance géométrique du reste
sac à dos (par rapport)aucune garantiecontre-exemple

Et le résultat est optimal en un sens fort : on démontre qu'aucun algorithme polynomial ne peut faire mieux que pour la couverture par ensembles, sauf si (chapitre chap:decidabilite). Ce glouton simple est ce que l'on sait faire de mieux, et l'on sait aussi qu'on ne fera pas mieux.

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.