informatique (MP2I/MPI) · Chapitre 14 · Exercice de TD
Problème — Colorier un graphe, et casser les symétries
Exploration exhaustive et retour sur trace · niveau 3 (difficile)
Énoncé
Colorier les sommets d'un graphe avec couleurs de sorte que deux sommets voisins diffèrent.
- Écrire un compteur de colorations par retour sur trace.
- Observer que toute permutation des couleurs d'une coloration en donne une autre. En déduire un élagage.
- Mesurer sur le graphe de Petersen ( sommets, arêtes) pour .
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 :
| colorations | nœuds | colorations à renommage près | nœuds | |
|---|---|---|---|---|
| 2 | 0 | 9 | 0 | 5 |
| 3 | 120 | 658 | 20 | 111 |
| 4 | 540 | 1 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.