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