Zadanie polega na napisaniu kodu, który może znaleźć małe logiczne formuły dla sum bitów.
Ogólne wyzwanie polega na tym, aby Twój kod znalazł najmniejszą możliwą logiczną formułę zdań, aby sprawdzić, czy suma y zmiennych binarnych 0/1 równa się pewnej wartości x. Nazwijmy zmienne x1, x2, x3, x4 itd. Twoje wyrażenie powinno być równoważne sumie. To znaczy, logiczna formuła powinna być prawdziwa wtedy i tylko wtedy, gdy suma jest równa x.
Oto naiwny sposób, aby to zrobić na początek. Powiedz y = 15 i x = 5. Wybierz wszystkie 3003 różne sposoby wyboru 5 zmiennych i dla każdej stwórz nową klauzulę z AND tych zmiennych AND AND z negacją pozostałych zmiennych. Otrzymujesz 3003 klauzul o długości dokładnie 15, których całkowity koszt to 45054.
Twoja odpowiedź powinna być logicznym wyrażeniem tego rodzaju, które można po prostu wkleić w python, powiedzmy, żebym mógł to przetestować. Jeśli dwie osoby otrzymają ten sam rozmiar wyrażenia, wygrywa kod, który uruchamia najszybciej.
Możesz wprowadzić nowe zmienne do swojego rozwiązania. Więc w tym przypadku twoja logiczna formuła składa się ze zmiennych binarnych y, x i kilku nowych zmiennych. Cała formuła byłaby zadowalająca wtedy i tylko wtedy, gdyby suma zmiennych y była równa x.
Na początku niektóre osoby mogą chcieć zacząć od y = 5 zmiennych dodających do x = 2. Naiwna metoda da wtedy koszt 50.
Kod powinien przyjmować dwie wartości y i x jako dane wejściowe i generować formułę, a jej rozmiar jako dane wyjściowe. Koszt rozwiązania to po prostu nieprzetworzona liczba zmiennych w jego wyniku. Tak (a or b) and (!a or c)
liczy się tylko jako 4. Dozwolone są operatorzy and
, or
a not
.
Aktualizacja Okazuje się, że istnieje sprytna metoda rozwiązania tego problemu, gdy x = 1, przynajmniej w teorii.
źródło
z[0] = y[0] and y[1]
, jak chcesz to wskazać?z[0]
reprezentowałay[0] or y[1]
, musiałbym tylko wprowadzić klauzulę, która wygląda(y[0] or y[1]) or not z[0]
(lub dowolną równoważną instrukcję używającą 3 dozwolonych operatorów).Odpowiedzi:
Python, 644
Prosty generator rekurencyjnych równań.
S
generuje równanie, które jest spełnione na liścievars
sum dototal
.Należy wprowadzić pewne oczywiste ulepszenia. Na przykład istnieje wiele typowych podwyrażeń, które pojawiają się na wyjściu 15/5.
Generuje:
źródło
not x[0] and not x[1] and not x[2]
pojawia się 5 razy w wyrażeniu 15/5.Zrobiłbym to komentarz, ale nie mam reputacji. Chciałem skomentować, że wyniki Kwon & Klieber (znane jako kodowanie „Commander”) dla k = 1 zostały uogólnione dla k> = 2 przez Frisch i in. „Kodowania SAT dla ograniczenia At-Most-k”. Pytasz o szczególny przypadek ograniczenia AM-k, z dodatkową klauzulą gwarantującą At-Least-k, co jest banalne, po prostu rozłączenie wszystkich zmiennych z ograniczeniem AM-k. Frisch jest wiodącym badaczem w modelowaniu wiązań, więc czułbym się swobodnie, sugerując, że [(2k + 2 C k + 1) + (2k + 2 C k-1)] * n / 2 jest najlepiej znaną granicą liczby wymagane klauzule oraz k * n / 2 dla liczby nowych zmiennych, które należy wprowadzić. Szczegóły znajdują się w cytowanym artykule, wraz z instrukcjami, jak zbudować to kodowanie. To' napisanie programu do generowania tej formuły jest dość proste i myślę, że takie rozwiązanie byłoby konkurencyjne w stosunku do wszelkich innych rozwiązań, które prawdopodobnie znajdziesz na razie. HTH.
źródło