blog2geek.com
Amy&RedoxAvatar de Amy&Redox

5 billets | Profil

Recherche Google

ce blog tous
Derniers billets Connexion
Archives

complexite

20/05/2007

Présentation du problème SAT et des techniques de résolutions

 

Le formalisme

Un problème SAT est représenté au moyen de $n$ variables propositionnelles $x_1, qui peuvent prendre la valeur $0$ (faux) ou $1$ (vrai).

On appelle "littéral" une variable $x_i$ ou son complément $\neg.
Une "clause" est une disjonction de littéraux (par exemple ($x_1$ ou $x_3$) ou encore ($x_4$ ou $\neg)).
Une "formule" logique sous forme normale conjonctive (CNF) est une conjonction de clauses.

Un littéral qui a la valeur $1$ est dit satisfait. Une clause est satisfaite si l'un de ces littéraux l'est. Une formule est satisfaite si toutes ses clauses le sont.

Le problème SAT est un problème NP-complet (d'après le théorème de Cook) qui consiste à dire s'il existe ou non une combinaison de valeurs pour les littéraux d'une formule donnée, telle que ces valeurs satisfont cette formule.

 

Exemple 1

Soient $\{v_1, des variables propositionnelles. Soit l'expression $(v_1.

Pour cet exemple simple, il est possible de déterminer les valeurs de toutes les variables par simples déduction. En effet, on s'aperçoit que $v_3$ vaut $0$, on peut donc déduire $v_1$ de $(\neg et trouver que $v_1$ vaut $0$. Ainsi, on peut en déduire $v_2$ à partir de $(v_1 et trouver que $v_2$ vaut $1$.

Cette résolution très simple n'est bien sûr pas applicable à tous les coups. Dans l'exemple, chaque valeur des variables pouvait se déduire. Dans le cas général, il faudrait développer l'arbre de recherche.

 

Exemple 2

Ce problème consiste à déterminer s'il est possible de placer $n$ pigeons dans $m$ pigeonniers, un pigeonnier ne pouvant être occupé au plus que par un seul pigeon.

Pour modéliser ce problème, on utilise $n variables propositionnelles $p_{i,j}$ avec $i$ variant de $1$ à $n$, et $j$ variant de $1$ à $m$. Si $p_{i,j}$ est vraie alors le pigeon $i$ trouve dans le pigeonnier $j$.

Ce problème, archétype des problèmes combinatoires, est intéressant et sa solution est évidente mais le résoudre peut demander un important temps de calcul :

 

  • si $n, le problème est consistant et la recherche d'une solution se fait de manière linéaire sachant que le nombre de solutions ($C_m^n$) est exponentiel,
  • si $n, le problème est inconsistant mais les algorithmes standard (du type Davis et Putnam) prouvent l'inconsistance en un temps exponentiel.

Le problème, écrit en fonction des clauses de cardinalité, s'exprime par :

 

  • chaque pigeon occupe un seul pigeonnier :

     

    \begin{displaymath}card(1,1,
      \begin{displaymath}\ldots

     \begin{displaymath}card(1,1,

     

  • chaque pigeonnier contient au plus un pigeon :

     

    \begin{displaymath}card(0,1,

      \begin{displaymath}\ldots  

    \begin{displaymath}card(0,1,

     

 

Problème SAT Nombre de variables pigeons $11, Non $110$ pigeons $30, Non $870$ pigeons $31, Oui $930$

 

Quelques méthodes de résolution

 

Les méthodes de saturation

Ces méthode effectuent des tests de consistance locale pour détecter l'incohérence de la base de clauses. Elles essaient de prouver l'inconsistance de l'ensemble de clauses en réfutant (démontrant la fausseté) une d’elles.

On pourra notamment citer l'algorithme SL-Resolution.

 

Les algorithmes énumératif

Ces algorithmes consistent en une exploration systématique de l'ensemble des interprétations afin de déterminer si l’une d'entre elles est un modèle. Cette procédure peut aisément être assimilée à une forme de résolution que l'on nomme résolution dirigée.

On pourra notamment citer la célèbre procédure de Davis et Putnam.

 

La recherche locale

Ces méthodes commencent à donner des valeurs à chaque variables puis vont en modifier certaines itérativement de façon à réduire le nombre de clauses non satisfaites.

On pourra notamment citer le célèbre recuit-simulé.

 

L'approche programmation par contrainte (PPC)

Cette méthode consiste à programmer avec des relations appelées ``contraintes''. Un problème comporte un certain nombre de variables, chacune ayant un domaine, et un certain nombre de contraintes. Trouver une solution à un problème de PPC consiste à décrire l'ensemble des affectations autorisées de chaque variable, de telle sorte que la totalité des contraintes soient satisfaites.

On pourra notamment citer le célèbre algorithme ``Branch And Bound''.