Dominosa NP-Hard?


26

Dominosa là một trò chơi giải đố tương đối mới. Nó được phát trên lưới . Trước khi trò chơi bắt đầu, xương domino được đặt trên lưới (tạo thành một lát hoàn hảo ). Trong bước tiếp theo, xương domino được ẩn đi, chỉ để lại những con số được tiết lộ. Mục đích của trò chơi là để phục hồi sự sắp xếp ban đầu của xương domino. Bạn có thể chơi trò chơi tại đây: http://www.puheads-dominosa.com/ :( 0 , 0 ) , ( 0 , 1 ) , ... , ( n , n )(n+1)×(n+2)(0,0),(0,1),,(n,n)

Quy tắc:

Các quy tắc rất đơn giản. Bạn phải tìm vị trí của tất cả các quân cờ trên lưới. Một domino là một cặp số. Bạn chỉ có thể có một trong mỗi cặp.

Tôi có một số thuật toán đa thức giải quyết một phần tương đối nhỏ của câu đố. Tôi cũng có thể chỉ ra rằng các lưới Dominosa điển hình có ít nhất .2n2+o(n)

Dominosa NP-Hard?


"Câu đố có thể dễ dàng giảm xuống thành vấn đề SAT hoặc ILP." Để chứng minh tính đầy đủ của NP, bạn có muốn cách khác không?
Dennis Meng

1
@DennisMeng Điểm giảm được đề cập trong câu hỏi là xác định rằng vấn đề nằm ở NP. Vì vậy, tất cả những gì còn lại là để chứng minh rằng đó là NP khó. Ngẫu nhiên, người ta không cần giảm bớt để thấy rằng vấn đề là ở NP. Sự sắp xếp của domino tự nó là một nhân chứng có kích thước đa thức cho khả năng thanh toán.

Tôi giả định rằng vấn đề mà tính đầy đủ của NP đang gặp phải là, được sắp xếp các con số, có phải nó xuất phát từ sự sắp xếp của domino. Nếu vấn đề là thực sự thể hiện sự sắp xếp của domino (khi nó tồn tại), thì vấn đề không phải là vấn đề quyết định và "NP hoàn thành" không có ý nghĩa.

@AndreasBlass Người ta cũng có thể xem xét vấn đề lớn hơn: Cho một tập hợp phần tử của domino từ đến và đồ thị với các đỉnh được dán nhãn đến , xác định xem có thể che nó bằng các domino đã cho hay không. Nếu vấn đề này nằm ở P, thì có một thuật toán thời gian P để khôi phục ốp lát ban đầu, bởi vì bạn có thể thử loại bỏ một cạnh và kiểm tra trong thời gian P xem có thể hoàn thành lưới hay không. 1 n G 2 k 1 nk1nG2k1n

1
Theo một bài báo của G. Nordh có tên NP-đầy đủ của các chuỗi đa Skolem tổng quát, vấn đề tương tự sau đây là NP-đầy đủ. Sơ thẩm: Một đồ thị , một phân vùng của các cạnh thành các tập hợp rời rạc: với sao cho không có hai cạnh có cùng nhãn chia sẻ một đỉnh. CÂU HỎI: Có tập hợp con với sao cho không có hai cạnh nào trong M chia sẻ một đỉnh chung và sao cho M chứa nhiều nhất một cạnh từ mỗi ? E 1 , E 2 , . . . , E m , | m | | V | / 2 | E i | 2 , i = 1 , ... , m M E | M | = | V | / 2 E i , i = 1G=(V,E)E1,E2,...,Em,|m||V|/2|Ei|2, i=1,,mME|M|=|V|/2Ei, i=1,,m
Thanh Yoav sinai

Câu trả lời:


9

Lưu ý: Đây là phần tiếp theo và sửa đổi câu trả lời khác của tôi .

Vấn đề với việc giảm

Nhớ lại vấn đề quyết định:

Có một lát hoàn hảo bao gồm một lưới với ô duy nhất không?n(n+1)×(n+2)n

Vì vậy, đối với lưới , chúng ta chỉ có thể sử dụng biến.n(n+1)×(n+2)n

Nhưng:

  • Việc giảm của chúng tôi đòi hỏi rất nhiều biến số duy nhất, nhiều hơn .O(n)
  • Hơn nữa, dây của chúng tôi đã kết thúc mở, dẫn đến:
    • Làm thế nào để chúng ta biết chúng ta có thể lát các khu vực mở?

Để giải quyết vấn đề đầu tiên, chúng tôi làm cho bảng trò chơi lớn hơn nhiều; về cơ bản, chúng tôi tạo bằng số lượng biến chúng tôi thực sự yêu cầu, sau đó tạo lưới có kích thước và đặt lưới của chúng tôi ở góc dưới bên trái. Điều này sẽ dẫn đến một vụ nổ bậc hai.( n + 1 ) × ( n + 2 )n(n+1)×(n+2)

Đối với vấn đề thứ hai, chúng ta phải suy nghĩ lại về các tiện ích của mình một chút.

Có vẻ hơi nản chí khi chứng minh rằng chúng ta có thể xếp thành công phần còn lại của bảng theo quy tắc. Vì vậy, chúng tôi bắt đầu với cùng một chiến lược mà người ta sẽ sử dụng để thực sự tạo ra các bảng trò chơi có kích thước :(n+1)×(n+2)

Đầu tiên chúng tôi tạo ra một tập hợp tất cả các gạch có thể. Tất cả các gạch này sẽ phải được đặt trên bảng. Sau đó, chúng tôi loại bỏ các gạch, và để lại phía sau hình vuông của họ.

Tuy nhiên, các tiện ích của chúng tôi không đảm bảo sẽ đặt một bộ gạch cụ thể; gạch được đặt tùy thuộc vào nhà nước. Vì vậy, chúng tôi phải sửa đổi cẩn thận các tiện ích để đảm bảo gạch cụ thể sẽ bị xóa, bất kể trạng thái nào được chọn.

Chúng ta hãy đi qua các tiện ích của chúng tôi sau đó.

Dây và cổng mệnh đề có vấn đề vì hai lý do.

  1. Chúng ta không biết rằng các ô vuông xung quanh một dây hoặc cổng mệnh đề có thể được lát chính xác; Rốt cuộc, một số dây có thể được đẩy sang trái, một số khác ở bên phải và ốp các ô vuông không gian trắng còn lại trở nên không tầm thường. Chúng ta sẽ gọi vấn đề này là vấn đề "dòng chảy".
  2. Không có cách nào để biết gạch để loại bỏ từ gạch-đề ra; ở một trạng thái, một tập hợp các ô vuông, trong dây hoặc cổng mệnh đề, sẽ được lát gạch, ở trạng thái khác, một tập hợp các ô vuông hoàn toàn khác sẽ được lát.

Để giải quyết những vấn đề này:

  • Đầu tiên, chúng tôi tạo ra một tập hợp tất cả các gạch có thể. Tất cả các gạch này sẽ phải được đặt trên bảng; khi chúng ta đặt chúng lên bảng, chúng ta sẽ loại bỏ gạch khỏi bộ. Mặc dù lúc đầu chúng tôi có thể không biết , vì chúng tôi chưa mô tả đầy đủ về công thức, chúng tôi có thể thêm tất cả các khả năng gạch mới khi chúng tôi tăng , khi cần. Tất cả các gạch mà chúng tôi loại bỏ khỏi bộ này phải được đảm bảo có thể đánh dấu được (ít nhất, được đảm bảo có thể đánh dấu được nếu công thức đạt yêu cầu). Chúng tôi gọi loại bỏ một lát từ bộ gạch, để "xả" gạch khỏi bộ gạch, như để thực hiện nghĩa vụ của chúng tôi là đặt nó lên bảng trò chơi.nnn
  • Chúng tôi phải cẩn thận thiết kế các tiện ích để đảm bảo gạch cụ thể sẽ được gỡ bỏ, bất kể trạng thái nào được chọn.
  • Chúng tôi phải đóng các tiện ích của chúng tôi để chúng không đẩy gạch xung quanh bảng tùy theo trạng thái của chúng; thay vì tất cả các trạng thái của họ chỉ phải chiếm một khu vực được xác định rõ.
    • Ngoài ra, tất cả các trạng thái của họ phải được đảm bảo để có thể chiếm một khu vực được xác định rõ; điều này đảm bảo ốp lát thỏa đáng, nhưng không đảm bảo rằng một lát gạch cụ thể sẽ xảy ra. Đây là cách tương tự như một trò chơi Dominosa được tạo ra:
      • Đầu tiên các gạch được tạo thành một bộ;
      • Sau đó, các ô được đặt xuống trong một cấu hình ngẫu nhiên,
      • Khi mỗi ô được đặt, nó sẽ được gỡ bỏ khỏi tập hợp ô.
      • Sau đó, gạch được loại bỏ khỏi bảng, để lại phía sau hình vuông của họ.
      • Điều này không đảm bảo rằng cấu hình dự định sẽ được chọn,
      • Thay vào đó, nó đảm bảo rằng cấu hình dự định có thể được chọn, và do đó tồn tại một giải pháp. Chúng ta có thể làm điều tương tự ở đây.
  • Sau khi đặt tất cả các tiện ích của công thức, thay vì đặt các ô vuông duy nhất theo mặc định, tức là trên tất cả "khoảng trắng", chúng tôi đảm bảo khoảng trắng là một khu vực hình chữ nhật có một chiều chẵn hoặc chia nhỏ khoảng trắng thành hình chữ nhật với một chiều chẵn và chúng ta chỉ cần xếp khoảng trắng với các ô còn lại trong tập hợp ô.
  • Sau khi đặt tất cả các ô từ tập hợp, chúng tôi biết mọi thứ đều có thể xem được.
    • Một số gạch sẽ rõ ràng có thể dễ dàng, chẳng hạn như những người trong các bức tường, những người khác sẽ được đánh dấu chỉ khi công thức là thỏa đáng, do tính chất của các mối quan hệ giữa các tiện ích.
  • Sau đó, chúng tôi loại bỏ các gạch, và để lại phía sau hình vuông của họ.

Chúng ta hãy đi qua các tiện ích của chúng tôi sau đó.

Buộc tiện ích

Chúng ta có thể tạo một số khối xây dựng tùy ý bằng cách đảm bảo rằng mỗi khối không thể được ghép với chính chúng.

Ví dụ: giả sử chúng ta muốn buộc một khối , để chúng ta có thể sử dụng làm khối xây dựng. (lưu ý, là một biến tùy ý, chúng tôi muốn buộc thành cặp với chính nó, không nhất thiết phải là một khối xây dựng như chúng tôi đã sử dụng giá trị trước đó)1 1 1(1,1)111

Để đảm bảo rằng dự trữ khối xây dựng , chúng tôi sẽ đặt nó vào bức tường phía dưới trong cấu hình sau: chúng tôi sẽ đặt số dành riêng, chúng ta hãy gọi nó là dựa vào tường giống như một cú đánh lên (có hình dạng như ); dựa vào tường, và một ở hàng thứ 2 ở giữa. Sau đó, chúng tôi sẽ đặt hai số khác, chúng ta hãy gọi chúng là và ; đây là duy nhất cho tiện ích này. Chúng tôi đặt chúng ở trên cùng bên trái và bên phải .( 1 , 1 ) 1 3 231 1(1,1)13231

Minh họa bên dưới, viền đen được chia sẻ là phần dưới cùng của bảng trò chơi, mô tả từ trái sang phải.

  • Cấu hình của tiện ích. Mỗi và ở đây là duy nhất cho tiện ích này.323
  • 3 trạng thái có thể của ốp lát trung tâm .1

nhập mô tả hình ảnh ở đây

Sau khi làm điều này, chúng ta có thể đảm bảo rằng tiện ích của chúng tôi có thể được lát gạch với một tập hợp cụ thể của gạch, trong khi đảm bảo rằng tiện ích của chúng tôi phải buộc các cặp .(1,1)

  • Chúng tôi biết rằng phải xảy ra, bởi vì cả 3 trạng thái ốp lát có thể có của , gạch dưới là , như được minh họa trong hình bên phải, ở trên.1 ( 1 , 1 )(1,1)1(1,1)
  • Các ô còn lại có thể được xếp thành và , bao phủ tiện ích. Vì vậy, chúng ta có thể loại bỏ các ô đó khỏi bộ gạch toàn cầu của mình. Minh họa dưới đây.( 1 , 3 )(1,2)(1,3)

Mô tả, từ trái sang phải:

  • Trái, trên cùng: Trạng thái trái, Trái, dưới cùng: Một lát xếp hợp lệ của các ô vuông còn lại.
  • Middle, top: Middle state, Middle, bottom: Một lát gạch hợp lệ của các ô vuông còn lại.
  • Phải, trên cùng: Trạng thái bên phải, Phải, dưới cùng: Một lát xếp hợp lệ của các ô vuông còn lại.

nhập mô tả hình ảnh ở đây

Lưu ý rằng việc xếp các ô vuông còn lại không bị ép buộc , vì chúng có thể xếp chồng với các hàng xóm lân cận thay vì , nhưng vì đó là một lát gạch hợp lệ của bảng trò chơi ở tất cả các trạng thái , chúng ta có thể loại bỏ chúng khỏi bộ gạch và giả sử chúng sẽ được lát gạch chính xác theo cách đó. Vì chúng tôi biết có một ốp lát hợp lệ có thể, chúng tôi có ít nhất một ốp lát có thể có của bảng trò chơi, nếu công thức là thỏa đáng. Mặc dù không có gì đảm bảo rằng những thứ này sẽ được xếp theo cách này, nhưng có một đảm bảo rằng gạch sẽ bị ép buộc.( 1 , 1 )1(1,1)

Lưu ý: nếu bạn không hài lòng với điều này hoặc bị nhầm lẫn bởi sự khác biệt giữa "có thể xếp gạch" so với "bị buộc phải xếp", bạn có thể chỉ cần đặt một bức tường xung quanh tiện ích , theo cách tương tự chúng tôi tạo một bức tường dưới đây cho tiện ích mệnh đề.3 × 23×23×2

Tiện ích này không bị đóng, bởi vì nó không cần phải có (nhưng bạn có thể nếu bạn muốn). Không cần thiết, bởi vì nó có cấu hình khả thi, chúng ta có thể loại bỏ khỏi tập hợp ô. Mặc dù có thể thực hiện một cấu hình khác, nhưng điều này không ảnh hưởng đến sự thỏa mãn của vấn đề.

Các lát sau được đảm bảo sẽ được lát gạch (do đó có thể được xóa khỏi bộ gạch): (1,1)

Các ô sau đây được đảm bảo có thể được lát gạch (do đó có thể được xóa khỏi bộ gạch): (1,2),(1,3)

Nếu bạn chọn đóng tiện ích này bằng tường, thì cũng sẽ Đảm bảo được bảo hiểm.(1,2),(1,3)

Cổng dây và khoản mới

Do các vấn đề về dòng chảy và làm trống bộ gạch, chúng ta cần thiết kế lại dây một chút.

Một cách để giải quyết vấn đề dòng chảy, là làm cho dây thành một mạch, thay vì chỉ các trạng thái trái phải đơn giản; nghĩa là, nó sẽ là hình tròn thay vì một đường và do đó, nếu phần trên cùng của vòng tròn được đẩy sang phải, phần dưới sẽ được đẩy sang trái. Điều này giải quyết vấn đề dòng chảy.

Theo lộ trình này, chúng ta có thể thay đổi cổng dây và mệnh đề để giải quyết cả hai vấn đề.

Bảo lưu vàFTF

Hãy để chúng tôi giới thiệu hai giá trị phổ quát mới, và . Hai giá trị này là phổ quát; các giá trị thực trong lưới, chẳng hạn như giá trị vuông và (theo quy ước, chúng tôi dành làm khối xây dựng cho các bức tường) hoặc bất cứ thứ gì bạn chọn. Chúng đại diện cho đúng và sai, tương ứng.F 2 3 1TF231

Chúng tôi buộc dự trữ các ô , , , như sau; minh họa bên dưới, mô tả từ trái sang phải:(T,F)( F , F )(T,T)(F,F)

  • Chúng tôi sử dụng sơ đồ tương tự như buộc bất kỳ , sử dụng là . Mỗi và ở đây là duy nhất cho tiện ích này.T 1 23(1,1)T123
  • Chúng tôi sử dụng cùng một lược đồ như buộc bất kỳ , sử dụng là Mỗi và ở đây là duy nhất cho tiện ích này.F 1 23(1,1)F123
  • Chúng tôi sử dụng sơ đồ tương tự như buộc một khối , sử dụng làm ở giữa và sử dụng ở các vị trí khác của up-tack. Điều này buộc để xếp. và có thể xếp chồng với , vì vậy chúng tôi xóa chúng khỏi tập hợp ô. Mỗi và ở đây là duy nhất cho tiện ích này.F 1 T ( F , T ) 23T 23(1,1)F1T(F,T)23T23

nhập mô tả hình ảnh ở đây

Dây điện

Mỗi dây sẽ bắt đầu và kết thúc bằng một giá trị, chúng ta hãy gọi nó là , là duy nhất cho dây. Đối với mỗi mệnh đề mà dây tham gia, dây sẽ có hai giá trị dây là và , là duy nhất cho mỗi dây và tham gia vào cùng một mệnh đề. Minh họa dưới đây, với mô tả từ trái sang phải.Axx

  • Một dây tham gia vào một mệnh đề. Dây có chiều cao là và có chiều dài , trong đó là số mệnh đề mà dây tham gia. Dây được đệm bởi hai hình vuông ở bên trái và hai bên phải Tất nhiên, nó được bao quanh bởi một bức tường ở tất cả các phía, được biểu thị bằng đường viền màu xanh. Lưu ý rằng là duy nhất cho dây này và sẽ chỉ được sử dụng trong dây và mệnh đề mà nó tham gia.22p+3pA1

nhập mô tả hình ảnh ở đây

Minh họa dưới đây là hai trạng thái, mô tả từ trái sang phải.

  • Một dây tham gia vào một mệnh đề, ở trạng thái thực. Dây được coi là đúng, khi các hình vuông được ghép với một hình vuông hình vuông được ghép với hình vuôngNó được coi là sai ở trạng thái khác, nơi ốp lát bị đảo ngược. Lưu ý cách ốp lát được buộc sau khi lát được chọn: đã được buộc trước đó, do đó phần còn lại của gạch phải nằm ngang.xTxFA(T,F)
  • Các dây giống nhau trong trạng thái sai.

nhập mô tả hình ảnh ở đây

Khi tham gia vào nhiều mệnh đề, có nhiều giá trị và , một cặp cho mỗi mệnh đề mà dây tham gia. Chúng xen kẽ ở trên và dưới, cũng như và bình phương tách rời từng cặp .xxTFx,x

nhập mô tả hình ảnh ở đây

Hai trạng thái tương ứng.

nhập mô tả hình ảnh ở đây

Tiện ích này được đóng lại , do đó không có "vấn đề dòng chảy".

Lưu ý làm thế nào ở một trong hai trạng thái, chúng tôi thu thập các ô sau, bất kể trạng thái: , , .(A,A)(A,T)(A,F)

Có một số gạch tuy nhiên, chúng tôi không chắc chắn; ở một trạng thái, chúng ta có thể xóa từ tập hợp ô, trong khi ở trạng thái khác, chúng tôi có thể xóa từ bộ gạch, vì vậy chúng ta có thể xếp gạch nào Thực sự loại bỏ? Câu trả lời là: cổng mệnh đề có cùng một vấn đề, nhưng với bộ gạch đối diện. Nó sẽ luôn thu thập các gạch còn lại, đối diện và không bị chặn, như chúng ta sẽ thấy trong phần tiếp theo. Vì mỗi trong số này được ghép nối với một cổng mệnh đề, chúng tôi sẽ có thể loại bỏ cả hai.( 1 , F ) , ( 1 ' , T ) , ( 2 , F ) , ( 2 ' , T )(1,T),(1,F),(2,T),(2,F)...(1,F),(1,T),(2,F),(2,T)...

Khoản

Tiếp theo chúng ta sẽ tạo lần lặp đầu tiên của cổng mệnh đề mới. Nó bao gồm một tiện ích , được bao quanh bởi các bức tường. Bên trong tiện ích, chúng tôi đặt một ở trung tâm trên cùng và hai hình vuông ở các góc dưới; một ở phía dưới bên trái và một ở phía dưới bên phải. Các hình vuông còn lại sẽ là các giá trị đại diện cho các biến dây của ba dây khác nhau. Chúng ta hãy gọi những và . Các sẽ bị buộc phải cặp với một trong những dây-biến, và các dây biến còn lại sẽ ghép nối với giá trị. Minh họa dưới đây, mô tả từ trái sang phải.F T một , b , c F T2×3FTa,b,cFT

  • Bên trái: Cấu hình cho lần lặp đầu tiên của cổng mệnh đề mới.
  • Phải Ba trạng thái có thể của ốp látF

nhập mô tả hình ảnh ở đây

Ba trạng thái này dẫn đến ba nghiêng có thể. Minh họa dưới đây, mô tả từ trái sang phải.

  • Trái, trên cùng : lát gạch trái, Trái, dưới: Ốp các ô vuông còn lại.F
  • Giữa, trên cùng : lát gạch phải, Giữa, dưới: Ốp các ô vuông còn lại.F
  • Phải, trên cùng : xếp xuống, Phải, dưới: Xếp các hình vuông còn lại.F

nhập mô tả hình ảnh ở đây

Vì sẽ được ghép nối với một trong các biến dây trong mệnh đề , biến dây đó không còn có thể được ghép với trong dây ; do đó buộc dây phải đúng. Ngược lại, các biến dây còn lại xếp với sẽ bị buộc phải xếp gạch với trong các dây của chúng. Đây chính xác là các ràng buộc tương tự như mệnh đề .FF TF1-in-3-SAT

Lưu ý, và là các biến dây, nhưng mỗi biến có thể tham chiếu đến hoặc biến dây; sử dụng về cơ bản là phủ định biến dây.a,b,cxxx

Một bổ sung: để thực hiện nghĩa vụ phải biết loại gạch nào có thể được loại bỏ khỏi bộ gạch, chúng ta phải "nhân đôi và chống lại" mệnh đề. Ý của tôi là, tạo ra một tiện ích , với biến bổ sung đại diện cho các phủ định của và . Chúng ta hãy gọi những và . Đây phải là các giá trị dây biến bị phủ định của và . Đây tiện ích là khác nhau, trong đó nó sẽ có một ở trung tâm, và hai3×23a,b,ca,b,ca,b,c3×2TF giá trị ở các góc; chính xác ngược lại với các điều khoản tiện ích được mô tả cho đến nay. Bằng cách "nhân đôi" mệnh đề như thế này, chúng tôi thêm lại các ràng buộc tương tự như tiện ích được mô tả ở trên. Tuy nhiên, chúng tôi cũng xả tất cả các kết hợp của từ tập hợp ô, cho từng biến (và do đó cho và cũng vậy, vì rốt cuộc chúng là các biến dây). Minh họa dưới đây, mô tả từ trái sang phải.(T,x),(T,x),(F,x),(F,x)a,b,c

  • Một mệnh đề "kép và contrapositive". Phần dưới cùng là mệnh đề được mô tả ở trên; phần trên cùng là mệnh đề contrapositive mới được mô tả. Mệnh đề mới có chính xác các ràng buộc logic tương tự; nó là phần phụ của mệnh đề dưới. Cùng với nhau, các tiện ích kết hợp này và dây xả tất cả các kết hợp của từ tập hợp ô, cho mỗi biến dây tham gia vào mệnh đề.(T,x),(F,x),(T,x),(F,x)
  • Đường màu xanh ở giữa hình bên trái nhất là ở đó để dễ nhìn; trong thực tế, nó có thể được gỡ bỏ mà không cho phép bất kỳ trạng thái nào nữa.

nhập mô tả hình ảnh ở đây

Vì vậy, chúng ta hãy lấy một ví dụ, để cho thấy rằng tất cả các gạch được xả như đã hứa. Minh họa dưới đây, mô tả từ trái sang phải.

  • Hình của một dây tham gia vào một mệnh đề duy nhất; một trạng thái được chọn cho mệnh đề. Ở đây, chúng tôi đang sử dụng , trong khi và đại diện cho các giá trị dây khác trong mệnh đề này.1=bab
  • Đối với tình trạng được đưa ra trong mệnh đề, các giá trị buộc phải được ghép nối với các láng giềng .1T
  • Điều này làm cho dây bị buộc phải có giá trị thực (bạn có thể nói là biến dương của dây bị buộc phải ghép với và biến âm được buộc phải ghép với , như đã giải thích ở trên ).TF
  • Điều này buộc trong mệnh đề contrapositive (phần trên của mệnh đề) được ghép với trong mệnh đề. Bây giờ nếu bạn nhìn vào dây, mọi ô trong dây đều được đảm bảo được xả: hoặc được xả trong chính dây hoặc trong mệnh đề tiện ích tương ứng. Ở trạng thái này, chúng ta có các ô, , , , , , và .1T(A,A)(A,T)(A,F)(1,T)(1,F)(1,F)(1,T)

nhập mô tả hình ảnh ở đây

Thử trạng thái khác, chúng ta có được hình minh họa bên dưới, mô tả từ trái sang phải.

  • Mệnh đề ở trạng thái khác, ốp lát theo một trong hai cách.(1,T
  • Do đó, bị buộc trên dây,(1,F
  • Dẫn phần còn lại của dây vào lát tương ứng và định giá dây là sai.
  • Cuối cùng, trong phần dự phòng / phần trên của mệnh đề-tiện ích, phải xếp, vì được lấy trong dây điện. Ở trạng thái này, chúng ta có các ô, , , , , , và . Đây là những viên gạch giống nhau được thải ra như ở trạng thái khác .(1,F)(1,T)(A,A)(A,T)(A,F)(1,T)(1,F)(1,F)(1,T)

nhập mô tả hình ảnh ở đây

Do đó, trong cả hai trạng thái, chúng tôi xả gạch giống nhau. Do đó, dây và mệnh đề cùng nhau xả thành công gạch cụ thể nếu có một nhiệm vụ thỏa mãn.

Tiện ích này đã bị đóng , vì vậy sẽ không có vấn đề về dòng chảy. Tiện ích mệnh đề cùng với tiện ích dây được đảm bảo luôn luôn xả các giá trị cặp gạch giống nhau và do đó chúng ta có thể xả chúng ngay cả khi chúng ta không biết nó sẽ xếp theo cách nào.

Bây giờ tất cả các tiện ích của chúng tôi đáp ứng các tiêu chí.

Xây dựng

Trong công thức cuối cùng của chúng tôi, chúng tôi tạo ra ba hàng tiện ích, mỗi hàng cách nhau bởi một bức tường ngang.

  • Ở phía dưới, chúng tôi đặt các tiện ích cưỡng bức, có hai gạch cao. Chúng ta cần một tiện ích buộc cho các khối xây dựng, và cho các kết hợp của và . Chúng tôi đặt các tiện ích buộc trực tiếp cạnh nhau.TF
  • Ở hàng giữa, chúng tôi đặt các tiện ích dây, theo chiều ngang, là hai gạch cao. Các tiện ích dây phải được tách biệt với nhau bằng một bức tường thẳng đứng.
  • Ở hàng trên cùng, chúng tôi đặt các tiện ích mệnh đề, có bốn gạch cao. Các tiện ích mệnh đề nên được ngăn cách với nhau bằng một bức tường thẳng đứng.

Minh họa theo sau, mô tả trên mỗi con số. Nhấp vào hình ảnh để giải quyết đầy đủ. Mã nguồn để tái tạo / tạo hình ảnh được liệt kê ở cuối trang.

Sử dụng công thức làm ví dụ giải pháp làm nhân chứng.Φ(x)=(x1,¬x2,x3)(x2,¬x3,x4)(x1,x2,¬x4)(¬x1,x2,x3,¬x4)

Đầu tiên chúng ta bắt đầu với các bức tường ngang ngăn cách các hàng tiện ích. Chúng tôi hiển thị các hình vuông, và các cặp buộc phải xếp gạch trong các bức tường.

nhập mô tả hình ảnh ở đây

Tiếp theo, chúng tôi hiển thị các tiện ích. Các phác thảo màu xanh đại diện cho biên giới của các tiện ích; màu xanh nét đứt cho các tiện ích cưỡng bức, vì chúng sẽ không được bao quanh bởi các bức tường. Lưu ý dòng ở giữa tiện ích mệnh đề không được bao quanh bởi một bức tường; nó ở đó để dễ nhìn; mang dòng đi không cho phép bất kỳ trạng thái nào xảy ra trong mệnh đề, như đã giải thích ở trên, nhưng chúng tôi hiển thị đường màu xanh cho trình diễn này. Lưu ý: rằng chúng tôi sử dụng tên hình vuông để cung cấp cho các số dễ đọc ngữ nghĩa, khi áp dụng. Mỗi tên đại diện cho một giá trị số.

nhập mô tả hình ảnh ở đây

Ở đây chúng tôi điền vào các bức tường thẳng đứng.

nhập mô tả hình ảnh ở đây

Ở đây chúng tôi điền vào giải pháp nhân chứng; tức là đây là giải pháp ốp lát nếu sử dụng giải pháp SAT để tạo ra nó.

nhập mô tả hình ảnh ở đây

Tiếp theo, chúng ta lát khu vực phụ; phần còn lại của bảng, lớn như cần thiết, cho đến lớn như được yêu cầu cho đến nay. Do đó, chúng tôi xả các cặp còn lại trong tập hợp gạch. Các đường đứt nét ở đây đại diện cho một lát gạch hợp lệ nhưng không bắt buộc; có thể có một cách khác để ốp lát những thứ này. Ở đây chúng tôi hiển thị góc dưới bên trái.n

nhập mô tả hình ảnh ở đây

Ở đây chúng ta điền vào các ô vuông còn lại với một lát hợp lệ tầm thường.

nhập mô tả hình ảnh ở đây

Ở đây chúng tôi hiển thị góc dưới bên phải của lưới.

nhập mô tả hình ảnh ở đây

Ở đây chúng tôi hiển thị góc trên bên phải của lưới. Lưu ý làm thế nào gạch dọc không còn phù hợp; vì vậy chúng tôi xếp hàng trên cùng theo chiều ngang, nếu cần thiết.

nhập mô tả hình ảnh ở đây

Và cuối cùng là góc trên bên trái.

nhập mô tả hình ảnh ở đây

Việc tạo toàn bộ bảng trò chơi cùng một lúc thông qua TeX không thành công với các lỗi hết bộ nhớ từ pdflatex, vì vậy nếu bạn muốn xem nó, bạn sẽ phải tạo các clip và vá chúng lại với nhau. Hãy chắc chắn để kiểm tra trình xem máy tính xách tay .


Nguồn TikZ

Trình tạo trò chơi:

  • graphtex.py

    Chuyển đổi TeX thành svg, sử dụng pdflatex, pdfcairo (poppler) và rsvg-convert (libsvg)

  • dominosa.py

    Chứa logic chuyển đổi, xác minh giải pháp trò chơi và logic vẽ

  • dominosa_demo.py

    Một bản demo thực thi tạo ra các hình ảnh được sử dụng trong câu trả lời ở trên. Kết xuất hình ảnh vào thư mục làm việc hiện tại.

  • dominosa_demo.ipynb

    Một bản demo ipython tạo ra các hình ảnh được sử dụng trong câu trả lời ở trên.


1
Đây là spactacular, cảm ơn bạn rất nhiều ..
Yoav bar sinai

2
Xin vui lòng cho tôi biết rằng bạn có một phiên bản arXiv của điều đó. Có thể hợp lý hơn cho nền tảng này bao gồm một bản phác thảo thô và liên kết đến bài báo đầy đủ.
Raphael

22

DOMINOSA là NP-hard


Chơi trò chơi là một vấn đề tối ưu hóa; tìm một lát gạch domino hợp lệ sao cho nó bao phủ tất cả các hình vuông. Phiên bản quyết định của vấn đề này là:

Có một lát hoàn hảo bao gồm một lưới với ô duy nhất không?(n+1)×(n+2)n

Rõ ràng, vấn đề tối ưu hóa, vấn đề thực sự tìm ra giải pháp cho trò chơi ít nhất là khó, hoặc khó hơn, so với vấn đề quyết định.

Chúng tôi sẽ chuyển đổi công thức thành một lưới tương ứng, sẽ chỉ có thể bao quát được nếu có sự gán phù hợp cho công thức. Hơn nữa, lớp phủ thực sự có thể được sử dụng để phục hồi nhiệm vụ thỏa mãn.1-3-in-SAT

Do đó, nếu việc xây dựng được trình bày là chính xác và người ta có thể giải quyết một trò chơi trong thời gian đa thức trên DTM , thì nó sẽ ngụ ý . Điều này ngụ ý là NP-hard.P=NPDOMINOSA

Giảm từ thành1-3-in-SATDOMINOSA

Giới thiệu

Hầu hết các vấn đề / biến thể của có sự tương ứng khá tốt với . Có thể quan trọng để nghĩ về các vấn đề song song; vì chúng có liên quan với nhau, nên hầu hết mọi thứ trong một vấn đề đều có thể liên quan đến vấn đề khác.3-SATCIRCUITSAT

CIRCUITSAT có một biến thể phẳng, nó giảm đi, được gọi là . Chuyển đổi này rất thanh lịch và về cơ bản cho phép bạn thực hiện bất kỳ nhúng phẳng nào, tìm các dây chéo còn lại và sử dụng "tiện ích" để cho dây đi qua một "cổng" phẳng (bộ sưu tập các tiện ích, với dây đầu vào và đầu ra) .PLANAR-CIRCUITSAT

Thuận tiện, hầu hết các biến thể cũng có các biến thể đối với các biến thể phẳng, song song với và rất liên quan; dễ dàng giảm từ cái này sang cái khác, và dễ dàng để lý do về. Vì vậy, bất cứ khi nào tôi gặp vấn đề về mặt phẳng có thể là NP-hard, tôi nghĩ về các biến thể phẳng của và song song của chúng trong .3-SATPLANAR-CIRCUITSAT3-SATPLANAR-CIRCUITSAT

Các biến thể phẳng rất quan trọng để biết, bởi vì chúng giúp giảm bớt các vấn đề hình học / hình học, như ESPidean TSP (tình cờ là một mức giảm khá hiếm để tìm và tìm hiểu). Do đó, có và một parellel, , để hỗ trợ cho việc giảm như vậy.PLANAR-3-SATPLANAR-CIRCUITSAT

Các biến thể khác rất quan trọng để biết vì một số biến thể yếu hơn; nghĩa là "dễ dàng" hơn, nhưng vẫn hoàn thành NP. Chúng có vẻ dễ giải quyết hơn từ cái nhìn đầu tiên - và chúng đơn giản hơn nhiều - nhưng vẫn hoàn thành NP. NP-đầy đủ, nhưng đơn giản hơn; và do đó dễ dàng hơn để thực hiện giảm, trong nhiều trường hợp.3-SAT

Ví dụ: có . Đối với một số vấn đề, bạn có thể dễ dàng tạo một tiện ích chính xác , trong khi thực hiện "ít nhất 1 trong 3", như tiêu chuẩn sử dụng, sẽ không rõ ràng và làm cho các công trình lớn.1-in-3-SAT1-in-33-SAT

Một ví dụ khác là . Monotone làm cho mọi thứ đơn giản hơn rất nhiều khi bạn có một công trình không thể dễ dàng phủ nhận các giá trị.MONOTONE-1-in-3-SAT

Điều tuyệt vời hơn nữa là có một biến thể phẳng: ! Vì vậy, điều này làm cho mọi thứ dễ dàng hơn nhiều; bạn không phải vượt qua "dây" (hãy nhớ rằng, có những điểm tương đồng trong với những điều này) và hãy tin tôi, trong khi vượt qua các tiện ích rất thú vị, chúng có xu hướng rất không rõ ràng và khó khăn.MONOTONE-1-in-3-SATPLANAR-MONOTONE-1-in-3-SATCIRCUITSAT

PROBLEMMONOTONEPLANAR1-in-3NP-hard3-SATNoNoNoYesMONOTONE-3-SATYesNoNoNo1PLANAR-3-SATNoYesNoYes21-in-3-SATNoNoYesYes3PLANAR1-in-3-SATNoYesYesYes4MONOTONE-1-in-3-SATYesNoYesYes5PLANAR-MONOTONE-3-SATYesYesNoYes!6PLANAR-MONOTONE-1-in-3-SATYesYesYesYes7
  1. Loại bỏ nghĩa đen
  2. Định lý phân đôi Schaefer
  3. Vấn đề của đại diện tương thích
  4. Trọng lượng tam giác tối thiểu là NP-Hard
  5. Định lý phân đôi Schaefer
  6. Tìm kiếm phân vùng tự động hoàn hảo là NP-hard
  7. Phân vùng không gian nhị phân tối ưu trong mặt phẳng

Một cách để bắt đầu giảm, là thử tìm "tiện ích" giống với dây và một tiện ích giống với mệnh đề của một trong . Như một phần thưởng, nhiều biến thể là phẳng, có lẽ chúng ta có thể thoát khỏi mà không cần đi qua dây.3-SAT

"Tiện ích" là gì? Một tiện ích là một số xây dựng trong vấn đề, đó là hữu ích như một khối xây dựng để xây dựng cổng / dây / mệnh đề. Một số tiện ích sẽ có một bộ trạng thái hạn chế; ví dụ, một tiện ích có hai trạng thái có thể được sử dụng như một biến; một trạng thái là "đúng" và trạng thái khác là "sai". Một tiện ích có hai trạng thái, có thể "dài", có thể uốn cong và phân tách, rất hữu ích như một sợi dây - nếu nó có thể tương tác với một biến và bị hạn chế mở rộng trạng thái của biến sang vị trí khác. Một tiện ích với chính xác ba trạng thái có thể được sử dụng như một mệnh đề; nếu nó có thể được sử dụng để hạn chế "một trong ba" dây thông qua mỗi một trong ba trạng thái của nó. Tương tự, người ta có thể muốn tất cả các loại cổng logic, như không phải là tiện ích, hoặc tiện ích, tiện ích xor, v.v.

Khối xây dựng

  • Đầu tiên, hãy đặt trước một số, ví dụ: , trên bảng. Chúng tôi sẽ biến thành một khối xây dựng cho mọi thứ khác.11
  • Chúng tôi sẽ sử dụng một góc để đảm bảo rằng không bao giờ có thể kết nối với một , ngoại trừ ở góc này, nơi nó phải.11
  • Dưới đây (trong ba hình) là góc và cách chúng ta đặt s ở đó.1
  • Chúng tôi sẽ sử dụng để chỉ ra các giá trị duy nhất trong tất cả các lưới, trong tất cả các sơ đồ.
  • Trên thực tế, chúng tôi sẽ bao phủ lưới của chúng tôi bằng các giá trị trước khi phủ chúng với các giá trị quan trọng; do đó, theo mặc định bao gồm mọi thứ với các giá trị .

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, bằng cách đặt s, cặp phải được sử dụng hết trong cấu hình này; nó phải sử dụng một trong các gạch gạch. Bây giờ không bao giờ có thể xảy ra ở nơi nào khác trong diễn đàn, đó là những gì chúng ta cần.3   1(1,1) (1,1)

Có nhiều cách khác nhau để đặt một số, hoặc dựa vào tường với trong số họ, hoặc ở giữa hư không, với trong số đó trong một thập tự giá. Mọi cách đều ổn, miễn là bị ép buộc.45(1,1)

Một bức tường

Bây giờ, sẽ rất hữu ích khi có thể tạo ra các "bức tường" và "các góc" ở khắp mọi nơi, không chỉ ở các cạnh của lưới. Hãy xem điều gì xảy ra nếu chúng ta xếp các cặp trong một dòng; người ta không có lựa chọn nào khác ngoài việc ghép đôi với hàng xóm của họ, tạo ra một "bức tường" có chiều rộng .4

Hình ảnh bên dưới, từ trái sang phải:

  1. Một dòng các cặp s.1
  2. Ốp lát duy nhất có thể có của hình vuông .1
  3. Ốp lát duy nhất có thể có của (gần như) tất cả các s trong dòng.1
  4. Các dòng tường, vẽ để nhấn mạnh.

nhập mô tả hình ảnh ở đây

Một nỗ lực ban đầu tại một dây

Bây giờ, bằng cách đặt hai "bức tường" đối diện nhau và để một khoảng trống giữa các bức tường, có lẽ chúng ta có thể tạo ra một tiện ích giống như "dây".1

Chỉ hiển thị các viền tường, đây là những gì chúng ta nhận được trong các hình bên dưới (trái sang phải):

  • Đặt hai bức tường đối diện nhau.
  • Đưa số duy nhất vào bên trong.
  • Hai bên phải: Hai trạng thái có thể của dây.

nhập mô tả hình ảnh ở đây

Làm thế nào nó hoạt động:

Không thể có bất kỳ lỗ nào trong ống / dây, do đó, nếu gạch được dịch chuyển lên, thì tất cả chúng phải được dịch chuyển lên, tất cả dọc theo ống; nếu chúng bị dịch chuyển xuống, nó sẽ "hút" tất cả chúng xuống. Do đó, chúng ta có thể gửi "tín hiệu" từ một bên của dây sang bên kia; nói cách khác, tuyên truyền một giá trị.

Vì vậy, bây giờ chúng ta có thể tuyên truyền một giá trị trên một khoảng cách dài!

Những hạn chế còn lại là:

  • Chúng ta không thể uốn cong một sợi dây,
  • Chúng ta không thể tách một sợi dây,
  • Chúng ta không thể vượt qua dây,
  • Chúng tôi có thể có các vấn đề bố cục gây phiền nhiễu vì chúng tôi phải cẩn thận về tính chẵn lẻ của chiều dài dây.

Uốn dây , Phần 1: Tường bên dưới

Vấn đề tiếp theo là, chúng ta cần có khả năng uốn cong một sợi dây, không chỉ đi thẳng ...

Vì thế. Chúng tôi sẽ chia phần uốn thành hai phần; phần trên và phần dưới. Đầu tiên là phần dưới. Bỏ qua phần trên của uốn cong, chúng ta sẽ làm điều đó sau.

Các hình dưới đây cho thấy một chút vấn đề với uốn cong; đầu dây bị "lỏng", có vẻ khó tạo ra một bức tường quay 90 độ sắc nét.

Trái sang phải:

  • Đầu dây bị "lỏng".
  • Điều gì xảy ra nếu chúng ta cố gắng uốn cong nó; chúng tôi muốn dây ở giữa các đường màu xanh. Một lần nữa, Bỏ qua phần trên của uốn cong, chúng ta sẽ làm điều đó sau.
  • Như bạn có thể thấy, các s trên cùng bị lỏng, chúng có thể xếp dọc theo tường hoặc qua dây ! Điều này là không tốt.1

nhập mô tả hình ảnh ở đây

Một giải pháp như sau:

  • Chọn một cặp gần khúc quanh. Lấy giá trị của vuông, hãy đặt tên cho nó là ; này có nghĩa là số lượng là duy nhất trong toàn bộ lưới, giống như , và được tái sử dụng một lần, ở đây trong uốn cong này chỉ . Vì này được ghép nối với , nên nó không thể được ghép nối với nữa. Do đó, chúng tôi đặt nó ngay trên đỉnh trên cùng bên phải . Bây giờ, chúng ta có thể thấy rõ, tùy chọn duy nhất còn lại để ghép cho là ở bên phải của nó và do đó nó sẽ làm cứng tường.(x,1)xqx1111

Minh họa bên dưới, mô tả từ trái sang phải:

  • Tình hình với vấn đề.
  • Chọn một hình vuông, đặt là giá trị hình vuông của bất kỳ hình vuông nào trong uốn cong (tất nhiên không phải là s).q1
  • Hai togglings của nghiêng trên cùng bên phải ; lần này, chỉ một trong số họ là hợp lệ.1

nhập mô tả hình ảnh ở đây

Tuy nhiên, làm thế nào chúng ta có thể chắc chắn rằng sẽ không làm hỏng dây? Dưới đây bạn có thể thấy các trạng thái của dây và sẽ không cản trở nó.qq

Từ trái sang phải:

  • Việc xây dựng hiện tại.
  • Hai hình ngoài cùng bên phải: Các trạng thái của dây; theo kinh nghiệm, họ không bị cản trở bởi việc giới thiệu .q

nhập mô tả hình ảnh ở đây

Bây giờ chúng tôi vẫn còn một lỏng lẻo trên đầu; trên cùng bên trái trên cùng- .11

Chúng tôi sẽ làm điều tương tự; chọn một cặp đã được ghép nối trong các ô uốn cong và đặt trên đỉnh ngoài cùng bên trái- .(r,1)r1

Minh họa bên dưới, từ trái sang phải:

  • Xây dựng hiện tại của chúng tôi.
  • Vấn đề: ngoài cùng trên cùng - có thể ghép với một số trong dây hoặc với tường; chúng tôi muốnchỉ ghép với tường.1
  • Chọn một và sử dụng cùng một số ở trên cùng trên cùng bên trái trên cùng- .r1

nhập mô tả hình ảnh ở đây

Và cuối cùng chúng tôi có được uốn cong thấp hơn của chúng tôi. Minh họa bên dưới, mô tả, từ trái sang phải:

  • Trái: Xây dựng cuối cùng của chúng tôi cho một uốn cong.
  • Phải: Làm thế nào để tiếp tục dây bên trái.

nhập mô tả hình ảnh ở đây

Uốn dây , Phần 2: Bức tường phía trên

Các bức tường để làm cho góc trên cùng của uốn cong đơn giản hơn nhiều. Bạn đơn giản căn chỉnh một bức tường thẳng đứng với một bức tường ngang. Minh họa bên dưới, mô tả từ trái sang phải:

  • Các uốn cong dây chúng tôi muốn thực hiện.
  • Đặt phần dọc của hình vuông tường xuống.
  • Ốp lát các hình vuông của bức tường thẳng đứng.
  • Vị trí và ốp của tường ngang; nó có thể gặp bức tường thẳng đứng và tạo thành một góc.

nhập mô tả hình ảnh ở đây

Bây giờ bạn nên tin rằng chúng ta có thể đặt và uốn dây. Chúng tôi vẫn không thể phân chia hoặc chéo dây, sau đó, nhiều hơn về điều đó.

Những hạn chế còn lại là:

  • Chúng ta không thể uốn cong một sợi dây,
  • Chúng ta không thể tách một sợi dây,
  • Chúng ta không thể vượt qua dây,
  • Chúng tôi có thể có các vấn đề bố cục gây phiền nhiễu vì chúng tôi phải cẩn thận về tính chẵn lẻ của chiều dài dây.

Một dây có giá trị

Bây giờ chúng ta có dây, sẽ rất tốt nếu có dây có giá trị, nơi chúng ta có thể thấy giá trị của dây, giống như đèn LED trên bảng mạch. Vì vậy, những gì chúng ta làm, lấy một sợi dây, nói về chiều dài và giới thiệu một hình vuông có tên , chúng ta sẽ gọi nó là và một hình vuông có tên khác, chúng ta sẽ gọi nó là . Cả hai đều là duy nhất cho mỗi phần dây có giá trị, tức là. chỉ hai lần và chúng sẽ chỉ được sử dụng lại trong một dây có giá trị duy nhất . Chúng được đặt theo cặp, hai hình vuông ngay cạnh nhau và hai hình vuông cạnh nhau, với một7TFTFhình vuông ngăn cách chúng. Minh họa bên dưới, mô tả từ trái sang phải:

  • Trái: Một dây.
  • Phải: Cấu hình vuông.

nhập mô tả hình ảnh ở đây

Vậy làm thế nào để chúng ta biết nếu một dây là đúng hay sai? Vâng, một dây có hai trạng thái. Trong mỗi trạng thái này, một trong hoặc sẽ được ghép nối trong cùng một ô; giá trị được ghép nối là giá trị của dây. Minh họa bên dưới, giải thích từ trái sang phải:TF

  • Trái, phải: Hai trạng thái của dây có giá trị ;
  • Bên trái: Dây có giá trị được kiểm tra, vì các ô vuông chia sẻ một ô duy nhấtT
  • Phải: Dây có giá trị sai khi các ô vuông chia sẻ một ô.F

nhập mô tả hình ảnh ở đây

Bây giờ chúng ta có thể có biến được đặt tên mà chúng ta có thể sử dụng, để đặt các biến xuống trên lưới. Chúng ta có thể kết nối hai dây có giá trị và buộc chúng có cùng giá trị hoặc nếu chúng ta kết nối chúng với độ dài lẻ, buộc chúng có các giá trị khác nhau; và sử dụng dây dẫn, chúng ta có thể thực hiện việc này trên đường lưới dài. Sử dụng dây, chúng ta có thể truyền các giá trị của các biến được đặt tên khắp nơi.3-SAT

Những hạn chế còn lại là:

  • Chúng ta không thể tách một sợi dây,
  • Chúng ta không thể vượt qua dây,
  • Chúng tôi có thể có các vấn đề bố cục gây phiền nhiễu vì chúng tôi phải cẩn thận về tính chẵn lẻ của chiều dài dây.

Cổng không

Một cổng không là không cần thiết vì nó là ẩn: chỉ cần sử dụng chiều dài dây ngoài luồng chúng ta có thể phủ định giá trị của dây.

Cổng A

Bây giờ tôi có thể chứng minh một tiện ích mệnh đề đơn giản; nó sẽ kết nối với dây và buộc một trong số chúng ở trạng thái "kéo" và buộc hai dây còn lại ở trạng thái "đẩy". Chúng ta có thể sử dụng điều này, đây là một mối quan hệ chính xác một trong ba; chúng ta đặt trạng thái dây lẻ thành "đúng" và hai trạng thái dây còn lại có nghĩa là "sai" và chúng ta được đặt.3

Minh họa bên dưới, mô tả từ trái sang phải:

  • Bố trí dây của tiện ích mệnh đề. Nó tạo ra một dấu "cộng"; sự nối của 3 dây ở một điểm.
  • Lấp đầy dây với các ô vuông độc đáo .
  • Ba trạng thái của quảng trường trung tâm. Mỗi trạng thái này "kéo" chính xác một dây vào trung tâm, điểm thiết yếu của cổng; để hành động như một mệnh đề .1-in-3-SAT

nhập mô tả hình ảnh ở đây

Bây giờ hãy xem các trạng thái khác nhau. Minh họa bên dưới, mô tả từ trái sang phải:

  • Dây bên trái được kéo vào trung tâm; hai người kia bị đẩy ra.
  • Dây dưới cùng được kéo vào trung tâm; hai người kia bị đẩy ra.
  • Dây dưới cùng bên phải được kéo vào trung tâm; hai người kia bị đẩy ra.

nhập mô tả hình ảnh ở đây

Bây giờ, nếu bạn gắn các dây có độ dài ngang nhau (chiều dài chẵn hoặc lẻ) vào cuối cổng này, chỉ một trong số chúng có thể đúng, hai cái còn lại sai (tùy thuộc vào việc bạn gắn chúng một cách kỳ lạ, bạn có thể khái quát điều này bit). Do đó, chúng ta có thể kết nối giá trị thành mệnh đề CNF.31-in-3

Những hạn chế còn lại là:

  • Chúng ta không thể tách một sợi dây,
  • Chúng ta không thể vượt qua dây,
  • Chúng tôi có thể có các vấn đề bố cục gây phiền nhiễu vì chúng tôi phải cẩn thận về tính chẵn lẻ của chiều dài dây.

Tách dây

Để tách một dây, trước tiên chúng ta xếp hai dây bên cạnh nhau. Tiếp theo, với tư cách là một công cụ hỗ trợ trực quan, chúng tôi dán nhãn cho mỗi dây với hai hình vuông , một bên cạnh nhau. Điều này sẽ cho phép chúng ta thấy khi dây là "đúng": khi hai hình vuông của một dây trong một ô duy nhất, thì nó sẽ đúng, nếu không thì sai. Mỗi dây sẽ có một cặp , vì vậy chúng tôi sẽ đặt tên cho một cặp và . Sau đó, chúng tôi giới thiệu ba giá trị unique mới ,TTTT1T2a,b,c. Chúng ta sẽ đặt ba cái này cạnh nhau, một lần trên mỗi dây. Tuy nhiên, trên một dây, giữ một hình vuông duy nhất giữa hình vuông và cặp . Trên dây khác, đặt hai hình vuông giữa các hình vuông .a,b,cTa,b,c

Minh họa bên dưới, mô tả từ trái sang phải:

  • Bố trí dây. Lưu ý các bức tường hơi dày, vì vậy các dây được kéo gần nhau hơn cho mục đích minh họa; trong thực tế, họ cách xa nhau một chút.
  • Các giá trị bình phương; các giá trị ở trên và các đầu nối phân tách bên dưới.Ta,b,c

nhập mô tả hình ảnh ở đây

Điều này làm là buộc các dây không được khác nhau; nếu được xếp trên một dây, thì dây thứ hai không thể tách rời nhau, bởi vì điều đó có nghĩa được lát trên dây thứ hai và do đó, sẽ được lát hai lần. Minh họa bên dưới, mô tả từ trái sang phải:a,ba,ba,b

  • Ví dụ trạng thái của dây bên trái, có giá trị là đúng.
  • Trạng thái xấu của dây thứ hai; nó cố gắng để có giá trị khác nhau, nhưng sau đó nó nhận được một cặp trùng lặp.
  • Trạng thái tốt của dây thứ hai, bây giờ chúng có cùng giá trị và không có cặp trùng lặp.

nhập mô tả hình ảnh ở đây

Nếu bạn chơi xung quanh với hai trạng thái có thể khác, bạn sẽ thấy điều này cũng mở rộng cho cả hai trạng thái đó, và nó hoạt động cả hai cách. Do đó hai dây này bây giờ giống nhau; chúng tôi đã chia thành công một dây. Chúng ta có thể chia dây bao nhiêu lần tùy thích, mỗi lần sử dụng một bộ .a,b,c

Những hạn chế còn lại là:

  • Chúng ta không thể tách một sợi dây,
  • Chúng ta không thể vượt qua dây,
  • Chúng tôi có thể có các vấn đề bố cục gây phiền nhiễu vì chúng tôi phải cẩn thận về tính chẵn lẻ của chiều dài dây.

Một sợi dây không dây!

Vâng, với niềm vui của tôi, tách một sợi dây hóa ra là không dây! Đó là, trong các hình minh họa ở trên, tôi đặt các dây cạnh nhau, nhưng không có lý do gì để! Chúng ta có thể đặt dây ở bất cứ đâu trên lưới và chúng vẫn bị "vướng víu". Điều này giúp chúng tôi tiết kiệm rất nhiều rắc rối:

  • Chúng tôi thậm chí không phải lo lắng về việc vượt qua dây. Điều này cho phép chúng tôi giảm từ các biến thể không phẳng của3-SAT
  • Chúng tôi phải làm bất kỳ bố trí gây phiền nhiễu, có được các dây đến vị trí của họ, thật dễ dàng! Giống như một chiếc điện thoại không dây! Sự tự do!
  • Chúng tôi không phải lo lắng về bố cục chẵn lẻ / chiều dài dây.
  • Chúng tôi có thể thực hiện giảm kích thước khá nhỏ; mỗi biến sẽ nhận được một tập hợp các dải dây dài, với rất nhiều kết nối không dây dọc theo dây. Các kết nối này sẽ đến các cổng mệnh đề, sẽ nằm ở vị trí riêng của nó trên lưới. Mệnh đề bây giờ sẽ chỉ bao gồm tiện ích mệnh đề và ba dây không dây dính ra khỏi nó.

Những hạn chế còn lại là:

  • Chúng ta không thể vượt qua dây,
  • Chúng tôi có thể có các vấn đề bố cục gây phiền nhiễu vì chúng tôi phải cẩn thận về tính chẵn lẻ của chiều dài dây.

Giảm, cố gắng đầu tiên

Đặt là công thức boolean .Φ(x)=iCi1-in-3-SAT

  • Đối với mỗi , bố trí một dây dài duy nhất, theo hàng, gần dưới cùng của lưới.xjx
  • Đối với mỗi , tạo một cổng mệnh đề ở đầu lưới; bạn có thể đặt chúng ra ngoài theo cách bạn thích; tốt nhất là lấp đầy nó trong một khu vực hình vuông, nhưng bạn cũng có thể xếp nó thành một hàng dài duy nhất.CiΦ(x)
  • Đối với mỗi biến tham gia vào mệnh đề , đặt dây không dây vào một trong chân dây của cổng mệnh đề; đặt của mỗi kết nối vào dây / hàng biến tương ứng. Các thuật ngữ phủ định chỉ nên đặt kết nối không dây đến mệnh đề một khoảng cách xa hơn, thay đổi tính chẵn lẻ của chiều dài dây và phủ định giá trị.xjCi3a,b,c

Nó trông như thế nào:

  • Hình: Một mệnh đề, kết nối trực tiếp với dây không dây. "Điểm nóng" là cách chúng ta tượng trưng cho từ đây trở đi. Mỗi điểm nóng này sẽ được kết nối với các biến trong lưới.a,b,c

nhập mô tả hình ảnh ở đây

Và đây là những gì lưới có thể trông như sau:

  • Hình: Bảng trò chơi kết quả. Các biến được xếp thành hàng ở phía dưới. Các mệnh đề được trải ra trên đầu trang. Bố cục này cho blowup bậc hai; một bố cục thông minh hơn có thể tránh được vụ nổ bậc hai.

nhập mô tả hình ảnh ở đây

Chi tiết phút cuối

Nhớ lại vấn đề quyết định:

Có một lát hoàn hảo bao gồm một lưới với ô duy nhất không?(n+1)×(n+2)n

Vì vậy, đối với lưới , chúng ta chỉ có thể sử dụng biến. Nhưng việc giảm của chúng tôi đòi hỏi rất nhiều biến số duy nhất, nhiều hơn nhiều so với . Có một số cách để giải quyết vấn đề này.(n+1)×(n+2)nO(n)

  • Một cách, là để vuông kích thước của lưới trong cả hai trục. Vì vậy, bây giờ lưới chỉ đơn thuần là , có nghĩa là tất cả các số duy nhất của chúng tôi có thể được giới hạn bởi . Sau đó, chúng ta phải lấp đầy phần còn lại của lưới, sử dụng lại các số duy nhất của chúng tôi, nhưng rất cẩn thận không đặt bất kỳ số nào liền kề nhau trong lưới của chúng tôi , liền kề nhau trong không gian phụ của phần còn lại của lưới điện. Có một số cách sáng tạo để làm điều này, tôi sẽ để nó như một bài tập. Phương pháp này gây ra một vụ nổ bậc hai bổ sung, rõ ràng.O(|x|×|Φ(x)|)O(n)n
  • Một cách khác, ngắn gọn hơn, phức tạp hơn, là đa dạng hóa khối . Thay vì chỉ một khối xây dựng, chúng ta có thể sử dụng các khối xây dựng và sau đó chúng ta có thể sử dụng lại các số mà chúng ghép với nhau. Phương pháp này cho phép chúng tôi tránh nổ tung tứ phương.O ( n )1O(n)

Nguồn đồ thị


Giảm đẹp! Chỉ là một sự tò mò: làm thế nào bạn có thể chứng minh rằng các cặp còn thiếu (sau khi đặt các dây-tường-tiện ích trên bảng) có thể được đóng gói (trong thời gian đa thức) vào một lưới hình chữ nhật (n + 1) x (n + 2)? Tôi đã nghĩ đến việc giảm tương tự, nhưng không tìm ra cách chứng minh rằng các cặp "không sử dụng" có thể được sắp xếp theo hình chữ nhật (có thể lớn hơn) (quy tắc của trạng thái trò chơi mà mọi ô với được sử dụng trong bảng dominosa hợp lệ)a i , b i = 1 .. n[ai,bi]ai,bi=1..n
Vor

Tôi sẽ chuyển tất cả những nhận xét này vào câu trả lời của mình và làm cho nó toàn diện hơn trong phiên bản lớn tiếp theo của tôi.
Realz Slaw

ok, tôi sẽ đợi nó
Vor 17/11/13

@RealzSlaw, Cảm ơn bạn rất nhiều! Tôi vẫn chưa có thời gian để đọc nó nhưng nó trông rất đẹp.
Thanh Yoav sinai

@RealzSlaw, có cách nào liên lạc trực tiếp với bạn không?
Thanh Yoav sinai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.