Adloun

Probleme – Colorier un graphe, et casser les symétries

Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 14 — Exploration exhaustive et retour sur trace

Énoncé

Colorier les sommets d'un graphe avec couleurs de sorte que deux sommets voisins diffèrent.

Corrigé

1. Le compteur.


(* Nombre de colorations propres de adj avec au plus k couleurs.
   Précondition : adj est une matrice d'adjacence n x n symétrique, k >= 1.
   Complexité : O(k^n) au pire. *)
let colorier adj k =
  let n = Array.length adj in
  let coul = Array.make n (-1) in
  let total = ref 0 in
  let rec explorer s =
    if s = n then incr total
    else
      for c = 0 to k - 1 do
        let ok = ref true in
        for j = 0 to s - 1 do
          if adj.(s).(j) && coul.(j) = c then ok := false done;
        if !ok then begin
          coul.(s) <- c; explorer (s + 1); coul.(s) <- (-1)
        end
      done
  in explorer 0; !total

Terminaison : variant . Correction : l'invariant est que est une coloration propre du sous-graphe induit par les premiers sommets ; le test le préserve, et à on a une coloration propre complète.

2. L'élagage par symétrie. Si est une coloration propre et une permutation des couleurs, alors en est une autre. Ces colorations sont la même à renommage près. On n'en garde qu'une : celle où les couleurs apparaissent dans l'ordre Concrètement, le sommet ne peut recevoir qu'une couleur déjà employée, ou la première couleur neuve :


(* plafond = 1 + (plus grande couleur déjà employée), borné par k *)
let plafond =
  let m = ref 0 in
  for j = 0 to s - 1 do if coul.(j) + 1 > !m then m := coul.(j) + 1 done;
  min k (!m + 1)
in
for c = 0 to plafond - 1 do (* ... *) done

Le premier sommet ne reçoit alors que la couleur , le deuxième la couleur ou , et ainsi de suite.

3. La mesure sur le graphe de Petersen :

colorationsnœudscolorations à renommage prèsnœuds
20905
312065820111
45401 210

Ce que le tableau dit. À , aucune coloration : Petersen contient des cycles impairs, il n'est pas biparti. À , il y en a : son nombre chromatique vaut donc .

Le facteur d'élagage est à et à sur le nombre de solutions — ce qui se vérifie exactement : et . Sur le nombre de nœuds, le facteur est et .

La leçon, et elle dépasse la coloration. Une symétrie du problème est une redondance de l'arbre de recherche : branches y calculent la même chose sous des noms différents. La casser ne demande ni structure ni heuristique — seulement de normaliser l'ordre dans lequel les objets interchangeables apparaissent. C'est le même procédé qu'à l'exercice 14.6 sur les lettres répétées, et l'un des élagages les plus rentables qui soient : il est exact, il est gratuit, et son gain est un facteur factoriel.

Et si l'on ne veut que le nombre chromatique, on n'énumère pas : on essaie et l'on s'arrête au premier qui donne une solution, en abandonnant l'exploration dès la première trouvée. Le graphe de Petersen répond alors en puis nœuds.

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.