Là trò chơi câu đố cổ điển NP-hoàn thành?


10

Có một trò chơi giải đố cổ điển rất giống với trò chơi ô chữ, ngoại trừ một danh sách các từ được đưa ra và sau đó một bảng vuông được tạo thành từ các ô vuông đơn vị được đưa ra, với một số ô vuông được bôi đen giống như một từ chéo, và một số hình vuông có một chữ cái đã được viết sẵn trong đó. Mục tiêu là viết từng từ trong danh sách một lần và chỉ một lần trong câu đố, trong đó mỗi từ được viết theo chiều ngang (trái sang phải) hoặc theo chiều dọc (từ trên xuống) thành các ô vuông không bị bôi đen và khi bạn viết một từ , hai hình vuông ở hai đầu của từ phải được bôi đen hoặc tắt bảng. Ngoài ra, đối với các chữ cái được viết sẵn vào một số hình vuông, các từ được viết chồng lên các hình vuông này phải tôn trọng chữ viết sẵn.N×N

Bây giờ, nếu chúng ta giả sử một bảng chữ cái kích thước cố định cho các từ, sẽ quyết định xem chúng ta có thể điền vào bảng bằng một giải pháp hợp lệ hay không bằng cách sử dụng chính xác từng từ trong danh sách một lần và chỉ một lần một vấn đề hoàn thành NP, nếu độ dài cạnh của bảng là không cố định?

Câu trả lời:


6

Xin lỗi vì đã trả lời một bài viết cũ.

Tôi đã suy nghĩ về nó và tôi nghĩ rằng vấn đề với một bảng chữ cái cố định là NP-đầy đủ là tốt.

Tôi sẽ giảm SAT 1 trong 3 tích cực cho vấn đề từ này

Hôm qua tôi đã gặp khó khăn với những ý tưởng để giải quyết vấn đề. Tôi gặp khó khăn khi làm cho mỗi biến số khác nhau cho đến khi tôi nhìn lại câu hỏi và tôi nhận ra rằng bạn cho phép có hình vuông với các biểu tượng được trồng. Điều này đơn giản hóa việc giảm rất nhiều. Ý tưởng khác của tôi là có các từ có độ dài khác nhau cho mỗi biến khác nhau.

GIẢM

Bây giờ tôi sẽ mô tả các tiện ích chúng ta sẽ sử dụng:

Tiện ích biến

Chúng tôi dán nhãn cho mỗi biến với một chỉ số số khác nhau và chúng tôi sẽ có một số khác nhau cho mỗi biến. Chúng tôi chọn chỉ số lớn nhất và chúng tôi đại diện cho số ở dạng nhị phân, chúng tôi sẽ gọi chuỗi nhị phân này là .n

Sau đó, chúng tôi tạo ra hai từ dọc khác nhau cho mỗi biến. Tất cả các từ sẽ có độ dài(Chỉ khi chúng tôi cho phép các từ trùng lặp trong danh sách các từ), trong đólà độ dài của chuỗi nhị phân .3+|n||n|n

Chẳng hạn, hãy để chỉ số lớn nhất là số . Khi chúng ta chuyển đổi số này thành nhị phân, chúng ta thu được chuỗi ở dạng nhị phân, chuỗi này có độ dài là ba. Vì vậy, mỗi từ biến sẽ có độ dài trong ví dụ này.41006

Bây giờ chúng tôi tạo hai từ khác nhau cho mỗi biến. Một từ sẽ có ký hiệu ở đầu, sau đó là ký hiệu bên dưới, sau đó là chuỗi nhị phân đại diện cho chỉ số của biến và chúng ta đệm với số 0 sao cho chuỗi có cùng độ dài chuỗi và cuối cùng là ký hiệu cuối cùng. Tất nhiên các biểu tượng có thể được thay đổi.32n3

Một từ khác gần giống nhau nhưng nó sẽ có ký hiệu thay vì ký hiệu .43

Chẳng hạn, hãy để chỉ số lớn nhất là số . Chúng ta sẽ có hai từ sau cho biến có chỉ số :41

320013420014

Như chúng ta thấy, chúng ta đã đệm phần nhị phân của số bằng các số 0 sao cho nó có độ dài1|n|

Chúng ta phải sao chép những từ này nhiều lần, chúng ta sẽ cần một bản sao của mỗi từ cho mỗi lần xuất hiện của một biến trong ví dụ SAT. Điều này sẽ tạo ra các bản sao trong danh sách các từ. Chúng ta có thể loại bỏ các bản sao bằng cách thêm một chuỗi nhị phân khác vào chuỗi nhị phân xác định duy nhất biến đó. Chuỗi mới này sẽ xác định duy nhất từng thông số của một biến.

Để làm điều đó, chúng ta chỉ cần gán mỗi ocurrence của biến nhị phân một chuỗi khác và chúng ta tạo ra chuỗi đó ở cuối biểu diễn nhị phân của biến.

Để tạo chuỗi nhị phân mới này trước tiên chúng ta phải tạo một chỉ mục khác nhau cho mỗi biến, chúng ta gọi số lớn nhất trong mỗi chỉ số trong đó là định danh cho mỗi biến. Sau đó, chúng tôi chuyển đổi số thành chuỗi nhị phân và sau đó chúng tôi đếm chiều dài của chuỗi, chúng tôi gọi số này. Sau đó, đối với mỗi chỉ mục, chúng tôi tạo một số nhị phân khác nhau cho mỗi lần xuất hiện của biến. Chúng tôi đệm số bằng 0 cho đến khi độ dài của chuỗi nhị phân trở thànhsao cho tất cả các từ thuộc về mỗi độ dài của biến có cùng độ dài.niini|ni||ni|

Điều này sẽ loại bỏ các bản sao bên trong các từ biến.

Chẳng hạn, giả sử biến xuất hiện ba lần trong ví dụ SAT. Chúng tôi tạo ra các từ sau:x2

32010013 42010014 , và32010103 4201010432010113 42010114

Điều khoản tiện ích

Đối với mỗi tiện ích mệnh đề, chúng tôi sẽ tạo ba từ ngang mới, mỗi từ mệnh đề sẽ có độ dài ô vuông (Chỉ khi chúng tôi cho phép các từ trùng lặp trong danh sách các từ). Đây là những từ mà chúng tôi sẽ tạo cho mỗi mệnh đề:6

535354 , và535453545353

Chúng ta có một từ mệnh đề khác nhau cho mỗi cách có thể thỏa mãn mệnh đề, ký hiệu đại diện cho một tập hợp chữ thành đúng và ký hiệu đại diện cho một tập hợp chữ thành sai. Số được sử dụng để chỉ ra rằng đó là một từ mệnh đề.435

Sẽ có các từ lặp đi lặp lại trong danh sách các từ, chúng ta có thể thoát khỏi sự lặp lại bằng cách sử dụng thủ tục mà chúng ta đã sử dụng để xác định duy nhất các từ biến. Đó là, chúng tôi tạo ra một chuỗi nhị phân khác nhau cho mỗi mệnh đề và chúng tôi nối thêm từng chuỗi vào các mệnh đề từ tương ứng với từng mệnh đề. Để làm điều đó, chúng tôi tạo một chỉ mục mới cho các mệnh đề và chúng tôi chọn số lớn nhất của chỉ mục, chúng tôi sẽ gọi số này là . Chúng tôi biểu diễn là một chuỗi nhị phân và chúng tôi gọi độ dài của chuỗi nhị phân này là. Bây giờ, chúng tôi tạo một số nhị phân khác nhau cho mỗi mệnh đề, bắt đầu bằng số 1 và chúng tôi đệm số đó bằng các số 0 để tạo chuỗi nhị phân có độ dàimm|m||m|. Chúng tôi nối từng chuỗi nhị phân vào các từ mệnh đề thuộc về mệnh đề.

Bây giờ, hãy để những người khác nhìn thấy một hình ảnh của một tiện ích mệnh đề trong bảng:

Mệnh đề ví dụ

Ví dụ này đại diện cho mệnh đề và ví dụ 1 trong 3 bị giảm là(x2x3x4)(x1x2x3)(x2x3x4)

Như chúng ta thấy, có những hình vuông được viết. Các cột dọc có ký hiệu viết để chỉ ra những chữ nào bên trong mệnh đề. Phần cuối và phần đầu của cột là các ô vuông trống. Điều này cho phép người chơi chọn giá trị của biến. Các ký hiệu được đánh dấu trong hàng ngang buộc người chơi phải đặt một mệnh đề từ trong hàng đó. Bởi vì tất cả các từ mệnh đề chỉ có một ký hiệu duy nhất có nghĩa là chỉ một trong số các chữ nằm trong tiện ích mệnh đề có thể được đặt thành "true".4

Nếu chúng tôi không cho phép trùng lặp trong danh sách các từ, chúng tôi sẽ phải sửa đổi hình ảnh.

Hàng mệnh đề trong hình ảnh sẽ trở thành: và các cột theo nghĩa đen sẽ là, từ trái sang phải:5b5b5b10

b201010b , vàb201110bb21001b

Trong đó ký hiệu có nghĩa là ô vuông trốngb

Xem một ví dụ:

mệnh đề, không lặp lại

Tiện ích thống nhất biến

Đây là một tiện ích đảm bảo rằng người chơi chỉ có thể gán cùng một giá trị cho tất cả các cột bằng chữ của một biến.

Chúng tôi sẽ có một tiện ích mới cho mỗi biến

Chúng tôi sẽ tạo hai từ mới cho mỗi tiện ích.

Độ dài của từ sẽ phụ thuộc vào số lần hiển thị của một biến. Độ dài của một từ sẽ là trong đó là số lần hiển thị của một biến. Vì vậy, nếu biến xuất hiện hai lần trong trường hợp sat, các từ sẽ có độ dài bốn. Một trong hai từ được hình thành bằng cách lặp lại chuỗi lần, trong đó k là số lần xuất hiện của biến. Một từ khác được hình thành bằng cách lặp lại chuỗi lần, trong đó k là số lần xuất hiện của biến trong trường hợp SAT bị giảm.2kkx263 k64 k

Chẳng hạn, nếu một biến có hai quãng, các từ thuộc về tiện ích gán biến tương ứng sẽ là:x2

63636464

Nếu chúng ta muốn tránh các từ lặp đi lặp lại, hãy lưu ý rằng mỗi tiện ích nhất quán thuộc về một biến khác nhau. Vì vậy, chúng ta có thể nối thêm chuỗi nhị phân xác định từng biến vào hai từ mà chúng ta đã tạo cho tiện ích này.

Bây giờ, hãy để những người khác xem hình ảnh ví dụ về tiện ích này:

Tiện ích thống nhất biến

Tiện ích này dành cho biến và ví dụ 1 trong 3 được giảm là .x2(x1x2x3)(x2x3x4)

Như chúng ta thấy, có hai hàng ngang, các ký hiệu được viết bên trong các hàng đảm bảo rằng chúng ta chỉ có thể đặt các từ có chứa các ký hiệu đó, các từ đó là các từ mà chúng ta đã tạo cho tiện ích này. Trong một trong các hàng, chúng tôi thấy rằng có hai cột đi vào, vì các ký hiệu được đặt trong các cột, chúng tôi đảm bảo rằng chúng tôi chỉ có thể đặt các từ biến. Bởi vì các từ duy nhất chúng ta chỉ có thể đặt trên hàng thống nhất biến chỉ có ký hiệu hoặc chỉ ký hiệu trong đó, chúng tôi buộc người chơi phải đặt tất cả các từ biến với ký hiệu đó bên trong tiện ích. Điều này có nghĩa là các từ biến duy nhất có sẵn được đặt bên trong các tiện ích mệnh đề chỉ có ký hiệu hoặc chỉ ký hiệu3434. Chúng ta có thể đặt từ còn lại của gagdet này vào hàng khác

Nếu chúng tôi không cho phép trùng lặp trong danh sách các từ, các từ bên trong hình ảnh ví dụ sẽ là:

Đối với các hàng:

6b6b0106b6b010

Đối với các cột:

b201001bb201010b

Trong đó ký hiệu có nghĩa là ô vuông trốngb

Xem một ví dụ:

Tiện ích nhất quán, không lặp lại

Điều khoản tiện ích đổ

Đây là một tiện ích được tạo để đặt các từ mệnh đề không sử dụng. Để làm điều đó, chúng ta chỉ phải đặt hai hàng cho mỗi từ mệnh đề trong một phần trống của bảng. Các hàng này không được kết nối với bất kỳ hàng hoặc cột khác.

Với điều này, chúng tôi hoàn thành việc giảm, vì chúng tôi tuyên bố chúng tôi chỉ cần 6 biểu tượng cho việc giảm.

Thí dụ

Nếu lời giải thích trước đó gây nhầm lẫn, thì đây là hình ảnh ví dụ về trường hợp tích cực 1 trong 3 SAT đã được giảm cho vấn đề từ này:

Bảng ví dụ

Nếu chúng tôi không cho phép các từ lặp đi lặp lại:

Bảng ví dụ, không lặp lại

Ví dụ đã được giảm là:

(x1x2x3)(x2x3x4)


Cảm ơn vì đã đăng tải điều này! Một tính năng đáng tiếc của Stack Exchange là bất kỳ ai cũng không thể đọc được câu trả lời dài nên bạn rất khó có thể nhận được nhiều phiếu bầu từ hàng tấn công việc bạn đã thực hiện ở đây. Tôi sẽ cố đọc nó nhưng, nếu tôi trung thực, có một cơ hội tốt tôi sẽ không tiếp cận nó.
David Richerby

2
@DavidR Richby jaja có. Tôi đã suy nghĩ trong câu hỏi này một thời gian. Tôi nghĩ rằng khi tôi đăng câu trả lời này, mọi người sẽ đi và nâng cấp nó. Đã xảy ra. Thật ra thi không co gi đâu. Nếu bạn có thắc mắc về việc giảm bạn có thể hỏi tôi
rotia

4

Tôi nghĩ rằng việc giảm sau đây từ đường dẫn Dirian Hamilton hoạt động:

Cho đồ thị và hai đỉnh , chúng ta xuất câu đố sau:G=(V,E)s,tV

Bảng chữ cái là , với là một số biểu tượng không trong .V{}V

Những lời là cho mỗi , và cho mỗi cạnh .vvvVvu(u,v)E

Bảng bao gồm hai phần. Cái đầu tiên trông giống như"cầu thang" ngang có chiều dài 3, xếp chồng lên nhau, như được mô tả ở đây:|V|

cầu thang

Phần thứ hai bao gồm tách rời các không gian có độ dài 2.|E|(|V|1)

Ngoài ra, chúng tôi đặt ở bước đầu tiên (dưới cùng) của cầu thang từ (và xóa nó khỏi danh sách từ), và trong bước cuối cùng, chúng tôi đặt .sstt

Bây giờ, để lấp đầy cầu thang, chỉ có thể đặt các từ đỉnh trong các bước và để kết nối hai đỉnh, một từ cạnh phải được đặt giữa chúng, tương ứng với một cạnh hiện có trong biểu đồ. Các cạnh không sử dụng có thể được đặt trong phần thứ hai của bảng. Hướng thứ hai là tầm thường.

Tôi nghĩ rằng điều này hoạt động (bằng chứng chính xác tôi phác thảo là vẫy tay tốt nhất, nhưng vẫn còn).


1
Đẹp. Lưu ý rằng nó là đủ để viết trước một và trong các khoảng trống ngoài cùng của cầu thang (không cần phải loại bỏ chúng khỏi danh sách từ). Và để hoàn thiện, có thể đáng nói đến việc lưới có thể dễ dàng được tạo ra bằng cách chọn lớn một cách đầy đủ và lấp đầy với các ô vuông bị bôi đen. stN×NN
FrankW

Điều này là tốt và có vẻ hoạt động, nhưng kích thước bảng chữ cái không cố định như bài viết ban đầu của tôi yêu cầu. Có một sửa đổi có thể sử dụng một bảng chữ cái có kích thước cố định và vẫn thực hiện việc giảm này?
dùng2566092

@ user2566092 - điểm tốt. Tôi sẽ cố gắng suy nghĩ. Có lẽ một tiện ích chỉ có thể được điền bởi một đại diện của một cạnh có thể được sử dụng thay vì các từ , và sau đó mọi thứ có thể được mã hóa thành nhị phân. uv
Shaull
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.