Problème de la couverture exacte

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Le problème de la couverture exacte est un problème d'optimisation combinatoire NP-complet qui fait partie des 21 problèmes NP-complets de Karp.

Énoncé[modifier | modifier le code]

Étant donné un univers U d'éléments et une collection \mathcal{S} d'ensembles, une couverture exacte est un sous-ensemble \mathcal{S}^* de \mathcal{S} tel que tout élément dans U est aussi un élément dans exactement un des ensembles de \mathcal{S}^*.

En d'autres termes, une couverture exacte est une sous-collection \mathcal{S}^* de \mathcal{S} qui est une partition de U : les ensembles dans \mathcal{S}^* sont disjoints et leur union est U.

Étant donné un univers U d'éléments et une collection \mathcal{S} d'ensembles, le problème de la couverture exacte consiste en trouver une couverture exacte \mathcal{S}^* ou bien de déterminer qu'il n'en existe pas.

Le problème de la couverture exacte est un exemple d'un problème de satisfaction de contraintes.

Exemple 1[modifier | modifier le code]

Soit U = {0, 1, 2, 3, 4, ...} l'univers des entiers naturels et soit \mathcal{S} = {E, I, P} une collection de trois ensembles d'entiers naturels :

Alors, la sous-collection \mathcal{S}^* = {E, I} est une couverture exacte, puisque chaque nombre naturel est soit pair ou impair, mais pas les deux.

En revanche, {E, P} n'est pas une couverture exacte, puisque certains nombres naturels ne sont contenus dans aucun ensemble : par exemple, 1 est ni pair ni premier. De plus, certains nombres naturels sont contenus dans plusieurs ensembles : par exemple, 2 est pair et premier.

Exemple 2[modifier | modifier le code]

Soit U = {1, 2, 3, 4, 5, 6, 7} un univers de 7 éléments et soit \mathcal{S} = {A, B, C, D, E, F} une collection de 6 ensembles :

  • A = {1, 4, 7} ;
  • B = {1, 4} ;
  • C = {4, 5, 7} ;
  • D = {3, 5, 6} ;
  • E = {2, 3, 6, 7} ; et
  • F = {2, 7}.

Alors, la sous-collection \mathcal{S}^* = {B, D, F} est une couverture exacte, puisque chaque élément est contenu dans exactement un des ensembles B = {1, 4}, D = {3, 5, 6}, ou F = {2, 7}.

De plus, {B, D, F} est la seule couverture exacte, comme le démontre l'argument suivant : Une couverture exacte doit couvrir 1 et A et B sont les seuls ensembles contenant 1, ainsi une couverture exacte doit contenir A ou B, mais non les deux. Si une couverture exacte contient A, alors elle ne contient ni B, C, E, ou F, comme chacun de ces ensembles ont au moins un élément en commun avec A. Alors D est le seul ensemble restant qui soit une partie de la couverture exacte, mais la collection {A, D} ne couvre pas l'élément 2. En conclusion, il n'existe pas de couverture exacte contenant A. D'un autre côté, si une couverture exacte contient B, alors elle n'inclut ni A ni C, comme chacun de ces ensembles ont au moins un élément en commun avec B. Alors D est le seul ensemble restant qui contient 5, donc D doit être une partie de la couverture exacte. Si une couverture exacte contient D, alors elle ne contient pas E, comme D et E ont les éléments 3 et 6 en commun. Alors F est le seul ensemble restant qui soit une partie de la couverture exacte, et la collection {B, D, F} est vraiment une couverture exacte. Voir l'algorithme X de Knuth pour une version de cet argument basée sur une matrice.

Représentation matricielle[modifier | modifier le code]

Si \mathcal{S} = {S1, S2, ..., Sm} est une collection finie de m ensembles et U = {x1, x2, ..., xn} est un univers fini de n éléments, alors le problème de la couverture exacte peut être représenté comme une matrice m×n contenant seulement des 0 et des 1. La i-ème ligne de la matrice représente le i-ème ensemble Si et la j-ème colonne de la matrice représente le j-ème élément xj. L'entrée de la matrice dans la i-ème ligne et la j-ème colonne est 1 si l'ensemble Si contient l'élément xj; l'entrée est 0 sinon.

Étant donné une telle matrice, une couverture exacte est une sélection de lignes telles que chaque colonne possède un 1 dans exactement une des lignes sélectionnées.

En d'autres termes, une couverture exacte est une sélection de lignes dont la somme est une ligne qui ne contient que des 1.

Exemple 3[modifier | modifier le code]

Si dans l'exemple 2 ci-dessus, nous représentons les 6 ensembles dans \mathcal{S} = {A, B, C, D, E, F} sous forme de lignes et les 7 éléments dans U = {1, 2, 3, 4, 5, 6, 7} sous forme de colonnes, alors le problème de la couverture exacte est représenté par la matrice 6×7 :

1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1

Comme dans l'exemple 2, la sélection \mathcal{S}^* = {B, D, F} de lignes est une solution de ce problème de couverture exacte :

1 2 3 4 5 6 7
B 1 0 0 1 0 0 0
D 0 0 1 0 1 1 0
F 0 1 0 0 0 0 1

Généralisations[modifier | modifier le code]

Bien que le problème standard de la couverture exacte implique une collection \mathcal{S} d'ensembles contenant des éléments dans un univers U, la structure du problème ne dépend pas de la présence d'ensembles contenant des éléments. La même structure existe s'il y a deux ensembles avec une certaine relation binaire entre eux.

Étant donné un ensemble X, un ensemble Y, et une relation binaire R entre X et Y, une couverture exacte (généralisée) est un sous-ensemble X* de X tel que chaque élément de Y est R-1-relié à exactement un élément de X*. Ici R-1 est l'inverse de R.

En général, R-1 restreinte à Y×X* est une fonction, c.-à-d., chaque élément Y est R-1-relié à exactement un élément de X* : l'unique élément de X* qui « couvre » l'élément particulier de Y.

De plus, si R est totalement gauche, c.-à-d., si chaque élément de X est R-relié à au moins un élément de Y, alors R-1 restreinte à Y×X* est surjective. (La condition dans le problème généralisé que R est totalement gauche correspond à la condition dans le problème standard que chaque ensemble dans \mathcal{S} est non vide. Évidemment, cela ne fait pas de différence si un ensemble vide est une partie d'une couverture ou non.)

Dans la représentation matricielle du problème généralisé, la relation R est représentée par une matrice, les éléments de X sont représentés par les lignes de la matrice, et les éléments de Y sont représentés par les colonnes de la matrice. Alors, comme dans le problème standard, une couverture exacte (généralisée) est une sélection de lignes telles que chaque colonne possède 1 dans exactement une des lignes sélectionnées.

Le problème standard est un cas particulier du problème généralisé dans lequel l'ensemble X est une collection \mathcal{S} d'ensembles, l'ensemble Y est un univers U d'éléments, et la relation binaire R est la relation « contenue » entre les ensembles et les éléments. Alors R-1 restreinte à Y×X* est une fonction des éléments vers les ensembles précisant l'unique ensemble dans la couverture qui contient l'élément précisé. De plus, si R est totalement gauche, c.-à-d. si aucun ensemble n'est vide, alors R-1 restreinte à Y×X* est une fonction surjective, c.-à-d. chaque élément dans la couverture contient au moins un élément.

Exemple 4[modifier | modifier le code]

La matrice dans l'exemple 3 ci-dessus peut être réinterprété pour représenter la relation binaire « est contenu dans » entre l'ensemble X = {1, 2, 3, 4, 5, 6} de 6 éléments et la collection Y = {A, B, C, D, E, F, G} de 7 ensembles :

  • A = {1, 2}
  • B = {5, 6}
  • C = {4, 5}
  • D = {1, 2, 3}
  • E = {3, 4}
  • F = {4, 5}
  • G = {1, 3, 5, 6}

La même représentation matricielle comme dans l'exemple 3 s'applique ici, mais elle est étiquetée différemment :

A B C D E F G
1 1 0 0 1 0 0 1
2 1 0 0 1 0 0 0
3 0 0 0 1 1 0 1
4 0 0 1 0 1 1 0
5 0 1 1 0 0 1 1
6 0 1 0 0 0 0 1

Comme dans l'exemple 3, une solution consiste à sélectionner les 2e, 4e et 6e lignes de la matrice :

A B C D E F G
2 1 0 0 1 0 0 0
4 0 0 1 0 1 1 0
6 0 1 0 0 0 0 1

Mais à la différence de l'exemple 3, l'interprétation ici montre que la solution est l'ensemble des éléments X* = {2, 4, 6} tel que chaque ensemble dans Y contient exactement un élément de X* :

  • A = {1, 2}
  • B = {5, 6}
  • C = {4, 5}
  • D = {1, 2, 3}
  • E = {3, 4}
  • F = {4, 5}
  • G = {1, 3, 5, 6}

En d'autre termes, la solution est un ensemble intersectant exact. Vraiment, les problèmes de la couverture exacte et les problèmes d'ensemble intersectant exact sont duaux l'un de l'autre, c.-à-d. essentiellement les mêmes.

Rechercher des solutions[modifier | modifier le code]

L'algorithme X de Knuth est un algorithme récursif, non déterministe, de parcours en profondeur, en force brute qui trouve toutes les solutions du problème de la couverture exacte.

Les liens dansants (en) (en anglais Dancing Links), communément connus sous le nom DLX, est la technique suggérée par Knuth pour implémenter de manière efficace son Algorithme X sur un ordinateur. Les liens dansants utilisent la représentation matricielle du problème. Ils implémentent la matrice comme une série de listes doublement liées de 1 de la matrice : chaque élément 1 possède un lien vers le 1 au-dessus, en dessous, à gauche et à droite de lui-même.

Le problème de la couverture exacte est connu comme étant NP-complet.

Exemples plus approfondis[modifier | modifier le code]

Beaucoup de problèmes peuvent être réduits à des problèmes de la couverture exacte, qui peuvent alors être résolus avec des techniques comme les liens dansants.

Par exemple, le problème de pavage d'une surface donnée avec des pentominos, le problème des huit reines, et la résolution des Sudokus peuvent tous être vus comme des problèmes de la couverture exacte et être résolus avec les liens dansants.

Pavage de pentominos[modifier | modifier le code]

Le problème de pavage d'une surface donnée avec des pentominos[1] est un exemple de problème de la couverture exacte.

Le problème des huit reines[modifier | modifier le code]

Le problème des huit reines est un exemple de problème de la couverture exacte.

Sudoku[modifier | modifier le code]

Le problème dans les Sudokus est d'assigner une certaine quantité de nombres (ou chiffres, valeurs, symboles) aux cellules (ou carrés) dans une grille tout en satisfaisant certaines contraintes.

Dans les variantes standard d'un Sudoku 9×9, il existe quatre sortes de contraintes :

Ligne-Colonne : Chaque intersection d'une ligne et d'une colonne, i.e, chaque cellule, doit contenir exactement un nombre.
Ligne-Nombre : Chaque ligne doit contenir chacun des 9 nombres exactement une seule fois.
Colonne-Nombre : Chaque colonne doit contenir chacun des 9 nombres exactement une seule fois.
Boîte-Nombre : Chaque boîte doit contenir chacun des 9 nombres exactement une seule fois.

Bien que la première contrainte semble triviale, il est cependant nécessaire de s'assurer qu'il n'y aura qu'un seul nombre par cellule.

La résolution d'un Sudoku est un problème de la couverture exacte.

Plus précisément, résoudre un Sudoku est un problème d'ensemble intersectant, ce qui est équivalent à un problème de la couverture exacte (comme dans l'exemple 4 ci-dessus), lorsqu'il est vu comme un problème de sélection de possibilités tel que chaque ensemble de contraintes contient (i.e., est atteint par) exactement une possibilité sélectionnée. Dans la notation ci-dessus pour le problème de la couverture exacte (généralisé), X est l'ensemble des possibilités, Y est un ensemble d'ensembles de contraintes, et R est la relation binaire « est contenu dans ».

Chaque assignation possible d'un nombre particulier à une cellule particulière est une possibilité (ou un candidat). Lorsque le Sudoku est joué avec un crayon et un papier, les possibilités sont souvent appelées des marques de crayon.

Dans les variantes standard d'un Sudoku 9×9, dans lequel chacune des cellules 9×9 est assignée un des 9 nombres, il y a 9×9×9 = 729 possibilités. En utilisant une notation évidente pour les lignes, colonnes et nombres, les possibilités peuvent être étiquetées comme ceci : R1C1#1, R1C1#2, …, R9C9#9.

Le fait que chaque sorte de contrainte implique exactement une chose est ce qui fait que le Sudoku est un problème d'ensemble intersectant exact. Les contraintes peuvent être représentées par les ensembles de contraintes. Le problème est de sélectionner les possibilités telles que chaque ensemble de contraintes contient (c.-à-d. est atteint par) exactement une possibilité sélectionnée.

Dans les variantes standard d'un Sudoku 9×9, il existe quatre sortes d'ensembles de contraintes correspondant aux quatre sortes de contraintes :

Ligne-Colonne : Un ensemble de contraintes ligne-colonne contient toutes les possibilités pour l'intersection d'une ligne et d'une colonne particulière, i.e., pour une cellule. Par exemple, l'ensemble de contraintes pour la ligne 1 et la colonne 1, qui peut être étiquetée R1C1, contient les 9 possibilités pour la ligne 1 et la colonne 1 mais avec des nombres différents :
R1C1 = { R1C1#1, R1C1#2, R1C1#3, R1C1#4, R1C1#5, R1C1#6, R1C1#7, R1C1#8, R1C1#9 }.
Ligne-Nombre : Un ensemble de contraintes ligne-nombre contient toutes les possibilités pour une ligne particulière et un nombre. Par exemple, l'ensemble de contraintes pour la ligne 1 et le nombre 1, qui peut être étiquetée R1#1, contient les 9 possibilités pour la ligne 1 et le nombre 1 mais de différentes colonnes :
R1#1 = { R1C1#1, R1C2#1, R1C3#1, R1C4#1, R1C5#1, R1C6#1, R1C7#1, R1C8#1, R1C9#1 }.
Colonne-Nombre : Un ensemble de contraintes colonne-nombre contient toutes les possibilités pour une colonne particulière et un nombre. Par exemple, l'ensemble de contraintes pour la colonne 1 et le nombre 1, qui peut être étiquetée C1#1, contient les 9 possibilités pour la colonne 1 et le nombre 1 mais de différentes lignes :
C1#1 = { R1C1#1, R2C1#1, R3C1#1, R4C1#1, R5C1#1, R6C1#1, R7C1#1, R8C1#1, R9C1#1 }.
Boîte-Nombre : Un ensemble de contraintes boîte-nombre contient toutes les possibilités pour une boîte particulière et un nombre. Par exemple, l'ensemble de contraintes pour la boîte 1 (dans le coin supérieur gauche) et le nombre 1, qui peut être étiquetée B1#1, contient les 9 possibilités pour les cellules dans la boîte 1 et le nombre 1 :
B1#1 = { R1C1#1, R1C2#1, R1C3#1, R2C1#1, R2C2#1, R2C3#1, R3C1#1, R3C2#1, R3C3#1 }.

Puisqu'il existe 9 lignes, 9 colonnes, 9 boîtes et 9 nombres, il existe 9×9=81 ensembles de contraintes ligne-colonne, 9×9=81 ensembles de contraintes ligne-nombre, 9×9=81 ensembles de contraintes colonne-nombre et 9×9=81 ensembles de contraintes boîte-nombre : 81+81+81+81=324 ensembles de contraintes en tout.

En bref, les variantes standard d'un Sudoku 9×9 est un problème d'ensemble intersectant exact avec 729 possibilités et 324 ensembles de contraintes. Le problème peut donc être représenté par une matrice 729×324.

Bien qu'il soit difficile de présenter la matrice 729×324 entière, la nature générale de la matrice peut être vue à partir de plusieurs captures :

Contraintes Ligne-Colonne
R1
C1
R1
C2
R1C1#1 1 0
R1C1#2 1 0
R1C1#3 1 0
R1C1#4 1 0
R1C1#5 1 0
R1C1#6 1 0
R1C1#7 1 0
R1C1#8 1 0
R1C1#9 1 0
R1C2#1 0 1
R1C2#2 0 1
R1C2#3 0 1
R1C2#4 0 1
R1C2#5 0 1
R1C2#6 0 1
R1C2#7 0 1
R1C2#8 0 1
R1C2#9 0 1
Contraintes Ligne-Nombre
R1
#1
R1
#2
R1C1#1 1 0
R1C1#2 0 1
R1C2#1 1 0
R1C2#2 0 1
R1C3#1 1 0
R1C3#2 0 1
R1C4#1 1 0
R1C4#2 0 1
R1C5#1 1 0
R1C5#2 0 1
R1C6#1 1 0
R1C6#2 0 1
R1C7#1 1 0
R1C7#2 0 1
R1C8#1 1 0
R1C8#2 0 1
R1C9#1 1 0
R1C9#2 0 1
Contraintes Colonne-Nombre
C1
#1
C1
#2
R1C1#1 1 0
R1C1#2 0 1
R2C1#1 1 0
R2C1#2 0 1
R3C1#1 1 0
R3C1#2 0 1
R4C1#1 1 0
R4C1#2 0 1
R5C1#1 1 0
R5C1#2 0 1
R6C1#1 1 0
R6C1#2 0 1
R7C1#1 1 0
R7C1#2 0 1
R8C1#1 1 0
R8C1#2 0 1
R9C1#1 1 0
R9C1#2 0 1
Contraintes Boîte-Nombre
B1
#1
B1
#2
R1C1#1 1 0
R1C1#2 0 1
R1C2#1 1 0
R1C2#2 0 1
R1C3#1 1 0
R1C3#2 0 1
R2C1#1 1 0
R2C1#2 0 1
R2C2#1 1 0
R2C2#2 0 1
R2C3#1 1 0
R2C3#2 0 1
R3C1#1 1 0
R3C1#2 0 1
R3C2#1 1 0
R3C2#2 0 1
R3C3#1 1 0
R3C3#2 0 1

Notons que l'ensemble des possibilités RxCy#z peut être arrangé comme un cube 9×9×9 dans un espace à 3 dimensions de coordonnes x, y et z. Ainsi, chaque ligne Rx, colonne Cy, ou nombre #z est une « tranche » 9×9×1 de possibilités. Chaque boîte Bw est un « tube » 9x3×3 de possibilités. Chaque ensemble de contraintes ligne-colonne RxCy, ensemble de contraintes ligne-nombre Rx#z, ou ensemble de contraintes colonne-nombre Cy#z est une « bande » 9x1×1 de possibilités. Chaque ensemble de contraintes boîte-nombre Bw#z est un « carré » 3x3×1 de possibilités. Et chaque possibilité RxCy#z est un « mini-cube » 1x1×1 consistant en une unique possibilité.

De plus, chaque ensemble de contraintes ou possibilité est l'intersection des ensembles de composants. Par exemple, R1C2#3 = R1 · C2 · #3, où "·" désigne l'ensemble d'intersection.

Bien que d'autres variations de Sudoku ont des nombres différents de lignes, colonnes, nombres et/ou différentes sortes de contraintes, ils impliquent tous des possibilités et des ensembles de contraintes, et ainsi peuvent être vus comme des problèmes d'ensembles intersectants exacts.

Preuve de la NP-complétude[modifier | modifier le code]

Le problème de la couverture exacte a été prouvé NP-complet par une réduction à partir de celui de la coloration de graphe.

Note et références[modifier | modifier le code]

  1. Par exemple, voir le site en anglais Solving Pentomino Puzzles with Backtracking.

(en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Exact cover » (voir la liste des auteurs)

Voir aussi[modifier | modifier le code]

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]