Adloun

informatique (MP2I/MPI) · Chapitre 16 · Exercice de TD

Problème — La couverture par ensembles : un glouton qui perd un facteur logarithmique

Algorithmes gloutons · niveau 3 (difficile)

É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 .

  • Écrire le glouton naturel et sa complexité.
  • Construire une famille d'instances sur lesquelles il perd un facteur .
  • Démontrer qu'il ne perd jamais plus que .

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.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre