Probleme – -SAT est linéaire
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 31 — Décidabilité et classes de complexité
Énoncé
Le tableau du chapitre annonce que « -sat est linéaire ». On le démontre et on le mesure. Une formule -sat est une conjonction de clauses à deux littéraux.
- Traduire une clause en implications, et définir le graphe d'implication.
- Donner le critère de satisfiabilité, et le démontrer dans un sens.
- En déduire un algorithme, et sa complexité.
- Mesurer, et comparer avec -sat.
Corrigé
1. Le graphe d'implication. Une clause équivaut à deux implications :
On construit alors un graphe orienté dont les sommets sont les littéraux , et où chaque clause donne les deux arcs ci-dessus. Le graphe a sommets et arcs : sa construction est en .
2. Le critère.
est satisfiable si et seulement si aucune variable n'a et dans la même composante fortement connexe.
Démonstration du sens facile (celui qui sert). Supposons et dans la même composante fortement connexe. Il existe alors un chemin de vers et un de vers . Or un arc du graphe est une implication vraie sous toute valuation satisfaisante : si est un arc et que est vrai, alors l'est. Par transitivité le long du chemin, vrai entraînerait vrai, ce qui est contradictoire ; et faux entraînerait, par l'autre chemin, vrai. Aucune valuation ne convient.
L'autre sens donne en plus une valuation. On calcule les composantes fortement connexes et on les numérote dans l'ordre topologique du graphe réduit. On pose alors
On vérifie que cette affectation satisfait toute clause : sinon, il existerait un arc allant d'une composante « vraie » vers une composante « fausse », ce que l'ordre topologique interdit.
3. L'algorithme. Construire le graphe, calculer les composantes fortement connexes, tester le critère, et lire la valuation. Le calcul des composantes se fait par l'algorithme de Kosaraju : deux parcours en profondeur, l'un sur le graphe, l'autre sur son transposé, dans l'ordre inverse des dates de fin. C'est l'algorithme du chapitre chap:graphes-avances.
Une précaution de programmation : sur des instances à un million de variables, un parcours en profondeur récursif déborde la pile d'appels. On l'écrit itératif, avec une pile explicite — c'est la transformation du chapitre chap:recursivite, avec la pile du chapitre chap:sequentielles.
4. Les mesures. L'implantation a d'abord été confrontée à une recherche exhaustive sur formules aléatoires de à variables : même réponse dans tous les cas, et chacune des valuations rendues a été vérifiée clause par clause. Puis, sur de grandes instances :
| Variables | Clauses | Réponse | Temps |
|---|---|---|---|
| satisfiable | s | ||
| satisfiable | s | ||
| satisfiable | s | ||
| insatisfiable | s | ||
| insatisfiable | s | ||
| insatisfiable | s |
La comparaison qui donne la mesure de l'enjeu. -sat avec un million six cent mille variables : seconde. -sat avec vingt-deux variables, par recherche exhaustive : secondes. Une variable de plus par clause, et l'on passe de variables à .
Ce que ce problème apporte au chapitre. La dernière ligne du tableau — « si le cas particulier s'y prête » — n'est pas une consolation vague. sat est np-complet ; sat restreint à deux littéraux par clause est linéaire. La np-complétude qualifie le problème général, et il arrive qu'une restriction naturelle change complètement la donne. Chercher cette restriction est souvent plus rentable que chercher un meilleur algorithme exponentiel.
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.