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.
| glouton | optimum | rapport | ||
|---|---|---|---|---|
| 3 | 14 | 3 | 2 | |
| 4 | 30 | 4 | 2 | |
| 5 | 62 | 5 | 2 | |
| 6 | 126 | 6 | 2 | |
| 8 | 510 | 8 | 2 |
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ème | Statut du glouton | Preuve |
|---|---|---|
| sélection d'activités | exact | é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 garantie | contre-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
- Un glouton exact que le cours ne traite pas : minimiser la somme des temps d'attente corrigé
- Le sac à dos fractionnaire : le même glouton, mais exact corrigé
- Pourquoi « au plus tard » et non « au plus tôt » corrigé
- Une parade qui vaut 2, et pourquoi elle vaut 2 corrigé
- La 2-approximation est-elle serrée ? et le glouton « degré maximal » a-t-il une garantie ? corrigé