SAT est le problème de déterminer si une expression booléenne peut être rendue vraie. Par exemple, (A) peut être rendu vrai en définissant A = TRUE, mais (A &&! A) ne peut jamais être vrai. Ce problème est connu pour être NP-complet. Voir Satisfaiabilité booléenne .
Votre tâche consiste à écrire un programme pour SAT qui s’exécute en temps polynomial, mais ne résout pas tous les cas.
Pour certains exemples, la raison pour laquelle ce n'est pas vraiment polynomial pourrait être parce que:
- Il y a un cas de bord qui n'est pas évident mais dont le temps d'exécution est faible
- L'algorithme ne résout pas le problème dans certains cas inattendus
- Certaines fonctionnalités du langage de programmation que vous utilisez ont une durée d’exécution plus longue que celle à laquelle vous pouvez raisonnablement vous attendre.
- Votre code fait en réalité quelque chose de totalement différent de ce à quoi il ressemble
Vous pouvez utiliser n’importe quel langage de programmation (ou combinaison de langues) de votre choix. Vous n'avez pas besoin de fournir une preuve formelle de la complexité de votre algorithme, mais vous devez au moins fournir une explication.
Le critère principal pour juger devrait être de savoir comment convaincre le code.
Il s’agit d’un concours de popularité, la réponse la mieux notée de la semaine l’emporte.
la source
Réponses:
C #
"Apparaît" est inutile. Je peux écrire un programme qui s'exécute vraiment en temps polynomial pour résoudre les problèmes SAT. C'est assez simple en fait.
Impressionnant. S'il vous plaît envoyez-moi le million de dollars. Sérieusement, j'ai un programme ici qui résoudra SAT avec une exécution polynomiale.
Permettez-moi de commencer par dire que je vais résoudre une variante du problème SAT. Je vais vous montrer comment écrire un programme qui présente la solution unique à tout problème 3-SAT . La valorisation de chaque variable booléenne doit être unique pour que mon solveur fonctionne.
Nous commençons par déclarer quelques méthodes et types d’aide simples:
Maintenant, choisissons un problème 3-SAT à résoudre. Disons
Mettons cela un peu plus entre parenthèses.
Nous encodons cela comme ceci:
Et bien sûr, lorsque nous exécutons le programme, nous obtenons une solution à 3-SAT en temps polynomial. En fait, le temps d'exécution est linéaire dans la taille du problème !
la source
Multi-langue (1 octet)
Le programme suivant, valable dans de nombreuses langues, principalement fonctionnelle et ésotérique, donnera la réponse correcte à un grand nombre de problèmes SAT et présente une complexité constante (!!!):
Étonnamment, le prochain programme donnera la bonne réponse à tous les problèmes restants et aura la même complexité. Il vous suffit donc de choisir le bon programme et vous aurez la bonne réponse dans tous les cas!
la source
JavaScript
En utilisant le non-déterminisme itéré, SAT peut être résolu en temps polynomial!
Exemple d'utilisation:
En passant, je suis fier d’avoir eu l’occasion d’utiliser deux des fonctionnalités les plus sous-utilisées de JavaScript, les unes à côté des autres:
eval
etwith
.la source
1000
boucle for devrait en quelque sorte être mise à l'échelle avec la taille d'entrée (une mise à l'échelle polynomiale non-O (1)).Mathematica + Informatique quantique
Vous ne savez peut-être pas que Mathematica est livré avec un ordinateur quantique
Quantum Adiabatic Commputing encode un problème à résoudre dans un hamiltonien (opérateur énergétique) de telle sorte que son état d'énergie minimale ("état fondamental") représente la solution. Par conséquent, l'évolution adiabatique d'un système quantique à l'état fondamental de l'hamiltonien et les mesures subséquentes constituent la solution au problème.
Nous définissons un subhamiltonien qui correspond à des
||
parties de l'expression, avec une combinaison appropriée d'opérateurs de Pauli pour les variables et sa négationOù pour l'expression comme ça
l'argument devrait ressembler à
Voici le code pour construire un tel argument à partir d'une expression bool:
Maintenant, nous construisons un hamiltonien complet, résumant les subhamiltoniens (la somme correspond à des
&&
parties de l'expression)Et recherchez l'état d'énergie le plus bas
Si nous obtenons une valeur propre égale à zéro, le vecteur propre est la solution
la source
Trois approches ici impliquent toutes une réduction de la SAT dans sa lingua franca géométrique 2D: énigmes de la logique des non-graphiques. Les cellules du puzzle logique correspondent aux variables SAT, contraintes aux clauses.
Pour une explication complète (et pour vérifier les bogues dans mon code!), J'ai déjà publié des informations sur les modèles dans l'espace des solutions de nonogram. Voir https://codereview.stackexchange.com/questions/43770/nonogram-puzzle-solution-space. L'énumération de plus de 4 milliards de solutions de casse-tête et leur codage pour tenir dans une table de vérité montrent des schémas fractals - auto-similarité et surtout auto-affinité. Cette redondance affine démontre la structure du problème, exploitable pour réduire les ressources informatiques nécessaires à la génération de solutions. Cela montre également la nécessité d'un retour d'information chaotique au sein de tout algorithme réussi. Il existe un pouvoir explicatif dans le comportement de transition de phase, où les instances "faciles" sont celles qui se trouvent le long de la structure grossière, tandis que les instances "dures" nécessitent une itération plus poussée dans les moindres détails, assez cachées des heuristiques normales. Si vous souhaitez zoomer dans le coin de cette image infinie (toutes les <= 4x4 casse-têtes codés), voir http://re-curse.github.io/visualizing-intractability/nonograms_zoom/nonograms.html
Méthode 1. Extrapolez l’ombre de l’espace de la solution de nonogramme à l’aide de cartes chaotiques et d’apprentissage automatique (pensez à des fonctions d’ajustement semblables à celles qui génèrent l’ensemble de Mandelbrot).
Voici une preuve visuelle de l'induction. Si vous pouvez numériser ces quatre images de gauche à droite en pensant que vous avez une bonne idée de générer les images manquantes de la 5ème ... 6ème ... etc., je viens de vous programmer que mon oracle NP pour le problème de la décision de la solution Nonogram existence. Veuillez vous présenter pour réclamer votre prix en tant que supercalculateur le plus puissant au monde. Je vous nourrirai d’électricité de temps en temps pendant que le monde vous remercie pour vos contributions en calcul.
Méthode 2. Utilisez des transformations de Fourier sur la version image booléenne des entrées. Les FFT fournissent des informations globales sur la fréquence et la position dans une instance. Bien que la partie de magnitude devrait être similaire entre les paires d’entrée, leur information de phase est complètement différente - contenant des informations directionnelles sur une projection de solution le long d’un axe spécifique. Si vous êtes assez intelligent, vous pouvez reconstruire l'image de phase de la solution. superposant les images de phase en entrée. Ensuite, inversez la phase et la magnitude commune dans le domaine temporel de la solution.
Qu'est-ce que cette méthode pourrait expliquer? Il existe de nombreuses permutations des images booléennes avec un remplissage flexible entre les exécutions contiguës. Cela permet un mappage entre entrée -> solution en prenant en compte la multiplicité tout en conservant la propriété des mappages bidirectionnels et uniques de la FFT entre le domaine temporel <-> (fréquence, phase). Cela signifie également qu’il n’existe pas de solution «sans solution». Ce que cela indiquerait, c'est que dans un cas continu, il existe des solutions en niveaux de gris que vous n'envisagez pas lorsque vous examinez l'image à deux niveaux de la résolution de casse-tête traditionnelle avec un nonogramme.
Pourquoi tu ne le ferais pas? C'est une façon horrible de calculer, car les FFT dans le monde actuel à virgule flottante seraient très imprécises avec de grandes instances. La précision est un énorme problème et reconstruire des images à partir d’images de magnitude et de phase quantifiées crée généralement des solutions très approximatives, bien que peut-être pas visuellement. pour les seuils de l’œil humain. Il est également très difficile de trouver cette activité de superposition, car le type de fonction qui le fait est actuellement inconnu. S'agirait-il d'un système de moyenne simple? Probablement pas, et il n'y a pas de méthode de recherche spécifique pour le trouver, sauf l'intuition.
Méthode 3 Recherchez une règle d'automate cellulaire (sur environ 4 milliards de tables de règles pour les règles de von Neumann à 2 états) qui résout une version symétrique du casse-tête du nonogramme. Vous utilisez une intégration directe du problème dans des cellules, illustrée ici.
C'est probablement la méthode la plus élégante, en termes de simplicité et d'effets positifs pour l'avenir de l'informatique. L'existence de cette règle n'est pas prouvée, mais j'ai l'intuition qu'elle existe. Voici pourquoi:
Les nonogrammes nécessitent beaucoup de réactions chaotiques dans l'algorithme pour être résolus avec précision. Ceci est établi par le code de force brute lié à la révision du code. CA est à peu près le langage le plus apte à programmer des retours chaotiques.
Cela semble juste, visuellement. La règle évoluerait à travers une incorporation, propagerait les informations horizontalement et verticalement, interférerait puis se stabiliserait à une solution conservant le nombre de cellules définies. Cet itinéraire de propagation suit le chemin (en arrière) auquel vous pensez normalement lorsque vous projetez l'ombre d'un objet physique dans la configuration d'origine. Les nonogrammes dérivent d'un cas particulier de tomographie discrète. Imaginez donc que vous êtes assis simultanément dans deux tomodensitomètres à coin de chat. C'est ainsi que les rayons X se propageraient pour générer les images médicales. Bien entendu, il existe des problèmes de limites: les bords de l'univers CA ne peuvent pas continuer à propager des informations au-delà des limites, sauf si vous autorisez un univers toroïdal. Cela pose également le casse-tête comme un problème périodique de valeur limite.
Il explique plusieurs solutions sous forme d'états transitoires dans un effet d'oscillation continue entre les sorties d'échange en entrées et inversement. Il explique les instances sans solution en tant que configurations d'origine qui ne conservent pas le nombre de cellules définies. En fonction du résultat réel de la découverte d'une telle règle, elle peut même se rapprocher des instances insolubles avec une solution proche dans laquelle les états des cellules sont conservés.
la source
C ++
Voici une solution dont l'exécution est garantie en temps polynomial: elle s'exécute
O(n^k)
oùn
est le nombre de booléens etk
est une constante de votre choix.la source
bitfield
, j’aurais peut-être préféré cela plus longtempsstd::vector
.surface 3d ruby / gnuplot
(ooh concurrence acharnée!) ... de toute façon ... une image vaut-elle mille mots? Ce sont 3 parcelles de surface distinctes réalisées dans gnuplot du point de transition SAT. les axes (x, y) sont la clause et le nombre de variables et la hauteur z est le nombre total d'appels récursifs dans le résolveur. code écrit en rubis. il échantillonne 10x10 points à 100 échantillons chacun. il démontre / utilise les principes de base de la statistique et est une simulation de Monte Carlo .
il s’agit essentiellement d’un algorithme davis putnam s’appuyant sur des instances aléatoires générées au format DIMACS. C’est le type d’exercice qui devrait idéalement être pratiqué dans les classes CS du monde entier afin que les étudiants puissent apprendre les bases, mais n’est presque pas enseigné de manière spécifique… peut-être une raison pour laquelle il existe autant de preuves fictives P? = NP ? il n'y a même pas un bon article de wikipedia décrivant le phénomène de point de transition (qui prône?) qui est un sujet très important en physique statistique et qui est également essentiel en CS. [a] [b] il existe de nombreux articles en CS sur le point de transition cependant très peu semblent montrer des parcelles de surface! (à la place, montrant généralement des tranches 2D.)
l'augmentation exponentielle de la durée d'exécution est clairement évidente dans le 1 er graphique. la selle au milieu du 1 er tracé est le point de transition. les deuxième et troisième tracés montrent le pourcentage de transition satisfaisable.
[a] comportement de transition de phase dans les ppt CS Toby Walsh
[b] probabilité empirique de satisfabilité de k-SAT tcs.se
[c] grands moments dans les mathématiques empiriques / expérimentales / (T) CS / SAT , TMachine blog
la source