Przepraszamy za odpowiedź na stary post.
Zastanawiałem się nad tym i myślę, że problem ze stałym alfabetem jest również NP-zupełny.
Mam zamiar zredukować pozytywny 1-w-3 SAT do tego problemu słownego
Wczoraj miałem problemy ze znalezieniem pomysłów na rozwiązanie problemu. Miałem problem z odróżnieniem każdej zmiennej, dopóki nie spojrzałem ponownie na pytanie i zdałem sobie sprawę, że pozwoliłeś mieć kwadraty z posadzonymi symbolami. To znacznie uprościło redukcję. Innym moim pomysłem było stworzenie słów o różnej długości dla każdej zmiennej.
REDUKCJA
Teraz opiszę gadżety, których będziemy używać:
Zmienny gadżet
Każdą zmienną oznaczamy innym indeksem liczbowym i dla każdej zmiennej będziemy mieć inną liczbę. Wybieramy największy indeks i reprezentujemy liczbę w formacie binarnym, nazwiemy ten łańcuch binarny .n
Następnie tworzymy dwa różne słowa pionowe dla każdej zmiennej. Wszystkie słowa będą miały długość(Tylko jeśli zezwalamy na powielanie słów na liście słów), gdziejest długością łańcucha binarnego .| n | n3 + | n || n |n
Na przykład, niech największym indeksem będzie liczba . Kiedy przekształcamy tę liczbę na binarną, otrzymujemy łańcuch w postaci binarnej, łańcuch ten ma długość trzy. Tak więc każde słowo zmienne będzie miało w tym przykładzie długość .100 641006
Teraz tworzymy dwa różne słowa dla każdej zmiennej. Jedno słowo będzie miało symbol na początku, następnie symbol poniżej, a następnie łańcuch binarny, który reprezentuje indeks zmiennej, a my zerujemy łańcuch tak, aby miał taką samą długość jak łańcuch a na końcu symbol na końcu. Oczywiście symbole można zmienić.2 n 33)2n3
Drugie słowo jest prawie takie samo, ale będzie miało symbol zamiast symbolu .343
Na przykład, niech największym indeksem będzie liczba . Będziemy mieć dwa następujące słowa dla zmiennej o indeksie :141
420014320013 i420014
Jak widzimy, dopełniamy binarną reprezentację liczby zerami, aby miała długość| n |1|n|
Musimy skopiować te słowa wiele razy, potrzebujemy jednej kopii każdego słowa na każde wystąpienie zmiennej w instancji SAT. Spowoduje to utworzenie duplikatów na liście słów. Możemy pozbyć się duplikatów, dodając kolejny łańcuch binarny do łańcucha binarnego, który jednoznacznie identyfikuje zmienną. Ten nowy łańcuch jednoznacznie identyfikuje każdą wystąpienie zmiennej.
Aby to zrobić, po prostu przypisujemy każdemu wystąpieniu zmiennej inny łańcuch binarny i olacy ten łańcuch na końcu binarnej reprezentacji zmiennej.
Aby utworzyć ten nowy łańcuch binarny, najpierw musimy utworzyć inny indeks dla każdej zmiennej, nazywamy największą liczbą w każdym indeksie gdzie jest identyfikatorem dla każdej zmiennej. Następnie przekształcamy liczbę w łańcuch binarny, a następnie liczymy długość łańcucha, nazywamy ten numer. Następnie dla każdego indeksu tworzymy inną liczbę binarną dla każdej wystąpienia zmiennej. Wpisujemy liczbę zerami, aż długość łańcucha binarnego stanie siętak aby wszystkie słowa należące do każdej wystąpienia zmiennej miały tę samą długość. i n i | n i | | n i |niini|ni||ni|
Pozwoli to pozbyć się duplikatów w słowach zmiennych.
Załóżmy na przykład, że zmienna pojawia się trzy razy w instancji SAT. Tworzymy następujące słowa:x2
42010014 32010103 42010104 32010113 4201011432010013 42010014 , i32010103 4201010432010113 42010114
Gadżet klauzuli
Dla każdego gadżetu klauzuli utworzymy trzy nowe wyrazy poziome, każde słowo klauzuli będzie miało długość kwadratów (tylko jeśli zezwolimy na powielanie słów na liście słów). Oto słowa, które stworzymy dla każdej klauzuli:6
535453 545353535354 , i535453545353
Mamy inne słowo klauzuli dla każdego możliwego sposobu wypełnienia zdania, symbol reprezentuje literalny zbiór wartości true, a symbol reprezentuje literalny zbiór wartości false. Liczba służy do wskazania, że jest to słowo klauzulowe.3 5435
Powtórzą się słowa na liście słów, możemy się ich pozbyć, stosując procedurę, której użyliśmy do jednoznacznej identyfikacji słów zmiennych. Oznacza to, że tworzymy inny łańcuch binarny dla każdej klauzuli i dołączamy każdy łańcuch do słów klauzuli odpowiadających każdej klauzuli. Aby to zrobić, tworzymy nowy indeks klauzul i wybieramy największą liczbę indeksu, nazwiemy ten numer . Reprezentujemy jako łańcuch binarny i nazywamy długość tego łańcucha binarnego jako. Teraz tworzymy inną liczbę binarną dla każdej klauzuli, zaczynając od liczby 1, i wpisujemy liczbę zerami, aby utworzyć łańcuch binarny o długościm | m | | m |mm|m||m|. Dołączamy każdy łańcuch binarny do słów klauzuli, które należą do klauzuli.
Teraz zobaczmy na tablicy zdjęcie gadżetu klauzulowego:
Ten przykład reprezentuje klauzulę a redukowana instancja 1 na 3 to( x 1 ∨ x 2 ∨ x 3 ) ∧ ( x 2 ∨ x 3 ∨ x 4 )(x2∨x3∨x4)(x1∨x2∨x3)∧(x2∨x3∨x4)
Jak widzimy, są zapisane kwadraty. Pionowe kolumny mają zapisane symbole wskazujące, które literały znajdują się w klauzuli. Koniec i początek kolumny to puste kwadraty. Pozwala to graczowi wybrać wartość zmiennej. Oznaczone symbole w poziomym rzędzie zmuszają gracza do wstawienia słowa klauzulowego w tym rzędzie. Ponieważ wszystkie słowa klauzul mają tylko jeden symbol co oznacza, że tylko jeden z literałów znajdujących się w gadżecie klauzul może być ustawiony na „prawda”.4
Jeśli nie pozwolimy na duplikaty na liście słów, będziemy musieli zmodyfikować obraz.
Wiersz klauzuli na obrazie będzie : a literalne kolumny będą od lewej do prawej:5b5b5b10
b 201110 b b 21001 bb201010b , ib201110bb21001b
Gdzie symbol oznacza pusty kwadratb
Zobacz przykład:
Gadżet o zmiennej spójności
Jest to gadżet, który zapewnia, że gracz może przypisać tylko tę samą wartość dla wszystkich literalnych kolumn zmiennej.
Będziemy mieć nowy gadżet dla każdej zmiennej
Dla każdego gadżetu utworzymy dwa nowe słowa.
Długość słowa będzie zależeć od liczby wystąpień zmiennej. Długość słowa będzie wynosić gdzie jest liczbą wystąpień zmiennej. Jeśli więc zmienna pojawi się dwa razy w instancji sat, słowa będą miały długość czterech. Jedno z dwóch słów powstaje przez powtórzenie łańcucha razy, gdzie k jest liczbą wystąpień zmiennej. Drugie słowo powstaje przez powtórzenie łańcucha razy, gdzie k jest liczbą wystąpień zmiennej w instancji SAT, która jest zmniejszana.2∗kkx263 k64 k
Na przykład, jeśli zmienna ma dwie częstotliwości, słowa należące do odpowiedniego gadżetu przypisania zmiennej to:x2
6363 i6464
Jeśli chcemy uniknąć powtarzania słów, zauważ, że każdy gadżet spójności należy do innej zmiennej. Możemy więc dołączyć łańcuch binarny identyfikujący każdą zmienną do dwóch słów, które stworzyliśmy dla tego gadżetu.
Zobaczmy teraz przykładowe zdjęcie tego gadżetu:
Ten gadżet dotyczy zmiennej a redukowana instancja 1 na 3 to .x2(x1∨x2∨x3)∧(x2∨x3∨x4)
Jak widzimy, istnieją dwa poziome rzędy, symbole zapisane w rzędach zapewniają, że możemy umieszczać tylko słowa zawierające te symbole, te słowa są słowami, które stworzyliśmy dla tego gadżetu. W jednym z wierszy widzimy, że wchodzą do niego dwie kolumny, ponieważ ze względu na symbole umieszczone w kolumnach upewniamy się, że możemy umieszczać tylko słowa zmienne. Ponieważ jedyne słowa, które możemy umieścić tylko w rzędzie o zmiennej konsystencji, zawierają tylko symbol lub tylko symbol , zmuszamy gracza do umieszczenia wszystkich gadżetów o tym symbolu wewnątrz gadżetu. Oznacza to, że jedyne zmienne słowa, które można umieścić w gadżetach klauzul, mają tylko symbol lub tylko symbol3434. Możemy umieścić pozostałe słowo tego gagdeta w drugim rzędzie
Jeśli nie zezwalamy na duplikaty na liście słów, słowa w przykładowym obrazie będą następujące:
Dla rzędów:
6b6b010 i6b6b010
Dla kolumn:
b201001b ib201010b
Gdzie symbol oznacza pusty kwadratb
Zobacz przykład:
Gadżet zrzutu zrzutu
Jest to gadżet stworzony do umieszczania nieużywanych słów w klauzulach. Aby to zrobić, musimy umieścić tylko dwa wiersze dla każdego słowa klauzuli w pustej części tablicy. Te rzędy nie są połączone z żadnym innym rzędem ani kolumną.
Dzięki temu kończymy redukcję, ponieważ twierdziliśmy, że potrzebujemy tylko 6 symboli do redukcji.
Przykład
Jeśli poprzednie wyjaśnienie było mylące, oto przykładowy przykład dodatniej 1 na 3 SAT, który został zredukowany do tego problemu słownego:
Jeśli zabronimy powtarzania słów:
Instancja, która została zmniejszona to:
(x1∨x2∨x3)∧(x2∨x3∨x4)