Adloun

Probleme – La coupe maximale : le hasard, puis mieux

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 25 — Algorithmes probabilistes, approximation, séparation et évaluation

Énoncé

Une coupe d'un graphe non orienté est une partition des sommets en deux parties ; sa valeur est le nombre d'arêtes joignant les deux parties. On cherche la coupe de valeur maximale.

Corrigé

1. L'analyse tient en deux lignes. Une arête est coupée si et seulement si et tombent de part et d'autre, ce qui arrive dans deux cas sur quatre : la probabilité vaut . Par linéarité de l'espérance, sur arêtes,

la dernière inégalité venant de ce qu'aucune coupe ne peut dépasser le nombre total d'arêtes. C'est exactement l'argument de MAX2SAT, transposé — et comme lui, il n'exige aucune indépendance entre les arêtes, alors qu'elles partagent des sommets.

2. La borne est atteinte. Il suffit d'un graphe où l'optimum coupe toutes les arêtes, c'est-à-dire d'un graphe biparti. Sur — six sommets, neuf arêtes —, la coupe maximale vaut tandis que l'espérance vaut : le rapport est exactement .

Vérification sur graphes aléatoires : le rapport exact ne descend jamais sous , et vaut exactement dans cas — précisément ceux où le graphe est biparti.

3. La recherche locale. On part d'une coupe quelconque, et l'on fait basculer tout sommet qui a strictement plus de voisins de son côté que de l'autre.


(* Coupe de valeur au moins m/2, DETERMINISTE.
   Entrees : g.(u) = liste des voisins de u, graphe non oriente.
   Sortie  : cote.(u) = true ou false, la partition.
   Complexite : O(m^2) au pire -- au plus m basculements, chacun en O(m). *)
let coupe_locale g =
  let n = Array.length g in
  let cote = Array.make n true in                 (* tout le monde du meme cote *)
  let bouge = ref true in
  (* VARIANT : la valeur de la coupe, entiere, majoree par m, et qui augmente
     d'au moins 1 a chaque basculement. *)
  while !bouge do
    bouge := false;
    for u = 0 to n - 1 do
      let memes = List.fold_left
        (fun acc v -> if cote.(v) = cote.(u) then acc + 1 else acc) 0 g.(u) in
      let autres = List.length g.(u) - memes in
      if memes > autres then begin                (* on gagne memes - autres *)
        cote.(u) <- not cote.(u);
        bouge := true
      end
    done
  done;
  cote

Terminaison. Le variant est la valeur de la coupe elle-même. Faire basculer fait entrer dans la coupe les memes arêtes de son côté et en sortir les autres : la valeur varie de , puisqu'on ne bascule que si et que ce sont des entiers. La valeur est un entier strictement croissant majoré par : il y a au plus basculements. C'est un variant qui croît vers un maximum — l'exact miroir du variant décroissant habituel, et il est tout aussi rigoureux.

Garantie. À l'arrêt, tout sommet vérifie , donc au moins la moitié de ses arêtes sont coupées. En sommant sur tous les sommets, chaque arête étant comptée deux fois :

d'où valeur . La même garantie que le tirage aléatoire, sans aucun tirage.

4. Les mesures, sur graphes aléatoires de à sommets, l'optimum étant calculé par énumération des partitions :

rapport minimal observégarantie prouvée
Coupe aléatoire (espérance exacte)
Recherche locale

Le nombre de basculements n'a jamais dépassé sur ces instances, très en deçà de la borne .

Ce que le problème enseigne. La méthode probabiliste a d'abord servi à prouver qu'il existe une coupe de valeur — pur argument d'existence. La recherche locale la trouve, sans hasard, et sa preuve de garantie est une conséquence de sa condition d'arrêt. C'est le même mouvement qu'au problème « MAX2SAT : du hasard au déterminisme » : le hasard découvre le résultat, un algorithme déterministe le réalise.

Et une mise en garde, pour ne pas surestimer la recherche locale : elle rend un optimum local, pas global. Sur les instances mesurées, elle atteint au pire, mais rien ne garantit mieux que — et l'algorithme le plus fort connu pour la coupe maximale, celui de Goemans et Williamson, n'atteint qu'au prix d'une relaxation par programmation semi-définie, très au-delà du programme.

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.