SAT jest problemem polegającym na ustaleniu, czy wyrażenie logiczne może być prawdziwe. Na przykład (A) można spełnić, ustawiając A = PRAWDA, ale (A &&! A) nigdy nie może być prawdziwe. Ten problem jest znany jako NP-zupełny. Zobacz wartość logiczna .
Twoim zadaniem jest napisanie programu dla SAT, który będzie wykonywany w czasie wielomianowym, ale może nie rozwiązać wszystkich przypadków.
W niektórych przykładach powodem, dla którego tak naprawdę nie jest wielomianem, może być:
- Istnieje przypadek skrajny, który nie jest oczywisty, ale ma słaby czas działania
- Algorytm faktycznie nie rozwiązuje problemu w nieoczekiwanym przypadku
- Niektóre funkcje języka programowania, którego używasz, mają dłuższy czas działania, niż można by się spodziewać
- Twój kod faktycznie robi coś zupełnie innego niż to, na co wygląda
Możesz używać dowolnego języka programowania (lub kombinacji języków). Nie musisz przedstawiać formalnego dowodu złożoności algorytmu, ale powinieneś przynajmniej wyjaśnić.
Podstawowymi kryteriami oceny powinno być przekonujący kod.
To konkurs popularności, więc wygrywa najwyżej oceniana odpowiedź w ciągu tygodnia.
źródło
Odpowiedzi:
DO#
„Pojawia się” jest niepotrzebne. Potrafię napisać program, który naprawdę wykonuje się w czasie wielomianowym, aby rozwiązać problemy SAT. W rzeczywistości jest to dość proste.
Niesamowite. Proszę, wyślij mi milion dolarów. Poważnie, mam tutaj program, który rozwiąże SAT z wielomianowym środowiskiem uruchomieniowym.
Zacznę od stwierdzenia, że rozwiążę wariację na temat problemu SAT. Pokażę, jak napisać program, który pokazuje unikalne rozwiązanie dowolnego problemu 3-SAT . Wycena każdej zmiennej logicznej musi być unikalna, aby mój solver mógł działać.
Zaczynamy od zadeklarowania kilku prostych metod i typów pomocników:
Teraz wybierzmy problem 3-SAT do rozwiązania. Powiedzmy
Rozwijajmy to trochę bardziej.
Kodujemy to tak:
I oczywiście, kiedy uruchamiamy program, otrzymujemy rozwiązanie dla 3-SAT w czasie wielomianowym. W rzeczywistości środowisko uruchomieniowe ma rozmiar problemu liniowy !
źródło
Wielojęzyczny (1 bajt)
Poniższy program, ważny w wielu językach, głównie funkcjonalny i ezoteryczny, da poprawną odpowiedź na wiele problemów SAT i ma stałą złożoność (!!!):
O dziwo, następny program da poprawną odpowiedź na wszystkie pozostałe problemy i ma tę samą złożoność. Musisz więc wybrać odpowiedni program, a we wszystkich przypadkach będziesz mieć poprawną odpowiedź!
źródło
JavaScript
Dzięki iterowanemu niedeterminizmowi SAT można rozwiązać w czasie wielomianowym!
Przykładowe użycie:
Nawiasem mówiąc, jestem dumny, że miałem okazję korzystać z dwóch najbardziej niewykorzystanych funkcji JavaScript obok siebie:
eval
iwith
.źródło
1000
W pętli powinna jakoś skali porównywalnej z wielkością wejściową (niektóre wielomian nie-O (1) zgorzeliny).Matematyka + Obliczenia kwantowe
Być może nie wiesz, że Mathematica jest wyposażona w komputer kwantowy na pokładzie
Kwantowa komunikacja adiabatyczna koduje problem, który należy rozwiązać u hamiltonianów (operator energii) w taki sposób, że jego stan minimalnej energii („stan podstawowy”) stanowi rozwiązanie. Dlatego adiabatyczna ewolucja układu kwantowego do stanu podstawowego hamiltonianu i późniejszy pomiar daje rozwiązanie problemu.
Definiujemy subhamiltonian, który odpowiada
||
części wyrażenia, z odpowiednią kombinacją operatorów Pauliego dla zmiennych i ich negacjąGdzie takie wyrażenie
argument powinien wyglądać
Oto kod konstruujący taki argument z wyrażenia bool:
Teraz konstruujemy pełny hamiltonian, sumując subhamiltonianie (sumowanie odpowiada
&&
częściom wyrażenia)I poszukaj najniższego stanu energii
Jeśli otrzymamy wartość własną zero, to wektor własny jest rozwiązaniem
źródło
Trzy podejścia tutaj, wszystkie polegają na redukcji SAT do 2D geometrycznej lingua franca: łamigłówki logiczne nonogram. Komórki w układance logicznej odpowiadają zmiennym SAT, ograniczeniom klauzul.
Aby uzyskać pełne wyjaśnienie (i proszę przejrzeć mój kod pod kątem błędów!) Już opublikowałem pewien wgląd w wzorce w obszarze rozwiązania nonogram. Zobacz https://codereview.stackexchange.com/questions/43770/nonogram-puzzle-solution-space. Wyliczenie> 4 miliardów rozwiązań łamigłówek i zakodowanie ich w tabeli prawdy pokazuje wzorce fraktalne - podobieństwo do siebie, a zwłaszcza powinowactwo do siebie. Ta nadmiarowość afiniczna pokazuje strukturę problemu, którą można wykorzystać do zmniejszenia zasobów obliczeniowych niezbędnych do generowania rozwiązań. Pokazuje także potrzebę chaotycznej informacji zwrotnej w ramach dowolnego udanego algorytmu. W zachowaniu przejścia fazowego występuje moc wyjaśniająca, w której „łatwymi” instancjami są te, które leżą wzdłuż grubej struktury, podczas gdy „twarde” instancje wymagają dalszej iteracji do drobnych szczegółów, całkowicie ukrytych przed normalną heurystyką. Jeśli chcesz powiększyć narożnik tego nieskończonego obrazu (wszystkie zakodowane instancje <= 4x4) zobacz http://re-curse.github.io/visualizing-intractability/nonograms_zoom/nonograms.html
Metoda 1. Ekstrapoluj cień przestrzeni rozwiązania nonogram za pomocą chaotycznych map i uczenia maszynowego (pomyśl dopasowanie funkcji podobnych do tych, które generują zestaw Mandelbrota).
Oto wizualny dowód indukcji. Jeśli możesz zeskanować te cztery obrazy od lewej do prawej i uważasz, że masz dobry pomysł, aby wygenerować brakujące 5. ... 6. ... itd., To właśnie zaprogramowałem cię jako moją wyrocznię NP dla problemu decyzyjnego rozwiązania nonogram istnienie. Zrób krok, aby odebrać swoją nagrodę jako najpotężniejszy superkomputer na świecie. Od czasu do czasu karmię cię prądem, podczas gdy świat dziękuje ci za wkład w obliczenia.
Metoda 2. Użyj transformacji Fouriera w wersji wejściowej z obrazem logicznym. FFT zapewniają globalne informacje o częstotliwości i pozycji w instancji. Podczas gdy część wielkości powinna być podobna między parą wejściową, ich informacja o fazie jest zupełnie inna - zawiera ukierunkowane informacje o rzucie rozwiązania wzdłuż określonej osi. Jeśli jesteś wystarczająco sprytny, możesz zrekonstruować obraz fazowy rozwiązania za pomocą specjalnej superpozycji wejściowych obrazów fazowych. Następnie odwróć transformację fazy i wspólnej wielkości z powrotem do dziedziny czasu rozwiązania.
Co ta metoda może wyjaśnić? Istnieje wiele kombinacji obrazów boolowskich z elastycznym wypełnieniem między ciągłymi przebiegami. Pozwala to na mapowanie między rozwiązaniem wejściowym -> dbającym o wielość, przy jednoczesnym zachowaniu właściwości FFT dwukierunkowych, unikalnych mapowań między dziedziną czasu <-> (częstotliwość, faza). Oznacza to również, że nie ma czegoś takiego jak „brak rozwiązania”. Mówiłoby to, że w ciągłym przypadku istnieją rozwiązania w skali szarości, których nie bierze się pod uwagę, patrząc na dwupoziomowy obraz tradycyjnego rozwiązywania łamigłówek z użyciem nonogramów.
Dlaczego tego nie zrobiłeś? To okropny sposób na obliczenia, ponieważ FFT w dzisiejszym zmiennoprzecinkowym świecie byłyby bardzo niedokładne w przypadku dużych instancji. Precyzja jest ogromnym problemem, a rekonstrukcja obrazów z kwantowanych obrazów wielkości i faz zwykle tworzy bardzo przybliżone rozwiązania, choć może nie wizualnie dla progów ludzkiego oka. Bardzo trudno jest wymyślić ten biznes superpozycjonowania, ponieważ rodzaj faktycznie wykonującej go funkcji jest obecnie nieznany. Czy byłby to prosty schemat uśredniania? Prawdopodobnie nie i nie ma żadnej konkretnej metody wyszukiwania oprócz intuicji.
Metoda 3. Znajdź regułę automatów komórkowych (z możliwych ~ 4 miliardów tabel reguł dla reguł 2-stanowych von Neumanna), która rozwiązuje symetryczną wersję łamigłówki nonogramowej. Wykorzystujesz bezpośrednie osadzenie problemu w pokazanych tutaj komórkach.
Jest to prawdopodobnie najbardziej elegancka metoda pod względem prostoty i dobrych efektów na przyszłość komputerów. Istnienie tej reguły nie zostało udowodnione, ale mam przeczucie, że ona istnieje. Dlatego:
Nonogramy wymagają wielu chaotycznych informacji zwrotnych w algorytmie, aby zostały dokładnie rozwiązane. Jest to ustalone przez kod brutalnej siły powiązany z przeglądem kodu. CA jest językiem najbardziej zdolnym do programowania chaotycznego sprzężenia zwrotnego.
To wygląda dobrze, wizualnie. Reguła ewoluowałaby poprzez osadzanie, przekazywanie informacji poziomo i pionowo, ingerowanie, a następnie stabilizowanie do rozwiązania, które zachowało liczbę ustawionych komórek. Ta trasa propagacji podąża ścieżką (do tyłu), o której zwykle myślisz, rzutując cień obiektu fizycznego na pierwotną konfigurację. Nonogramy wywodzą się ze specjalnego przypadku tomografii dyskretnej, więc wyobraź sobie, że siedzisz jednocześnie w dwóch tomografach komputerowych z rogami kotka. W ten sposób promieniowanie rentgenowskie zareagowałoby na generowanie obrazów medycznych. Oczywiście istnieją problemy graniczne - krawędzie wszechświata CA nie mogą dalej propagować informacji poza granicami, chyba że dopuścisz wszechświat toroidalny. To także stawia zagadkę jako okresowy problem z wartością graniczną.
Wyjaśnia wiele rozwiązań jako stany przejściowe z ciągłym oscylującym efektem między zamianą wyjść jako danych wejściowych i odwrotnie. Wyjaśnia przypadki, które nie mają rozwiązania, jako oryginalne konfiguracje, które nie oszczędzają liczby ustawionych komórek. W zależności od faktycznego wyniku znalezienia takiej reguły może ona nawet przybliżać nierozwiązywalne przypadki za pomocą bliskiego rozwiązania, w którym zachowane są stany komórek .
źródło
C ++
Oto rozwiązanie, które gwarantuje działanie w czasie wielomianowym: działa
O(n^k)
tam, gdzien
jest liczba booleanów ik
jest stałą do wyboru.źródło
bitfield
, może wolałbym tostd::vector
.powierzchnia 3d ruby / gnuplot
(och, twarda konkurencja!) ... w każdym razie ... czy obraz jest wart tysiąca słów? są to 3 osobne wykresy powierzchni wykonane w gnuplot punktu przejścia SAT. osie (x, y) są klauzulami i zmiennymi, a wysokość z jest całkowitą liczbą wywołań rekurencyjnych w solwerze. kod napisany w rubinie. Próbkuje 10x10 punktów po 100 próbek. demonstruje / wykorzystuje podstawowe zasady statystyki i jest symulacją Monte Carlo .
jest to w zasadzie algorytm davis putnam działający na przypadkowych instancjach generowanych w formacie DIMACS. jest to rodzaj ćwiczenia, które najlepiej byłoby wykonać na zajęciach z CS na całym świecie, aby uczniowie mogli nauczyć się podstaw, ale prawie wcale nie są specjalnie nauczani ... może z jakiegoś powodu, dlaczego istnieje tak wiele fałszywych dowodów P? = NP ? nie ma nawet dobrego artykułu w Wikipedii opisującego zjawisko punktu przejścia (któryś z nich?), który jest bardzo ważnym tematem w fizyce statystycznej i jest kluczowy również w CS. [a] [b] w CS jest wiele artykułów na temat punktu przejścia jednak niewielu wydaje się pokazywać wykresy powierzchniowe! (zamiast tego zazwyczaj pokazuje plastry 2d.)
wykładniczy wzrost czasu działania jest wyraźnie widoczny na pierwszym wykresie. siodło przebiegającej przez środku 1 st działki to punkt przejścia. z 2 ND i 3 rd wykresy pokazują% spe przejścia.
[a] zachowanie przejścia fazowego w CS ppt Toby Walsh
[b] empiryczne prawdopodobieństwo satysfakcji k-SAT tcs.se
[c] wspaniałe momenty w matematyce empirycznej / eksperymentalnej / (T) CS / SAT , blog TMachine
źródło