Bài toán SAT Định lý Cook

Một phần của tài liệu (LUẬN văn THẠC sĩ) tìm hiểu độ phức tạp một số thuật toán (Trang 25)

CHƢƠNG 3 PHÂN LỚP CÁC BÀI TOÁN THEO ĐỘ PHỨC TẠP

1) Bài toán SAT Định lý Cook

Bài tốn SAT được mơ tả như sau:

- Đầu vào: Cho một tập các mệnh đề C trên tập các biến U. - Câu hỏi: Có tồn tại một phép gán thỏa được cho C khơng? Ví dụ: U = {u1, u2} và

C = {c1, c2} với c1 = {u1, u2}; c2 = {u1, u2}

Câu trả lời là “yes”. Một phép gán thỏa được đó là: t(u1) = t(u2) = T.

Trong trường hợp, ta thay C bởi C’ = {{u1, u2}, {u1, u2}, {u1}} thì kết quả sẽ là “no”, do đó C’ là không thỏa được.

Định lý Cook. SAT là NP-đầy đủ.

Chứng minh: i) SAT thuộc NP

Dễ dàng thấy được là SAT thuộc NP. Một thuật tốn khơng tất định để giải bài toán SAT chỉ cần phỏng đoán một phép gán t và kiểm tra xem phép gán t có thoả mãn tập mệnh đề C khơng. Điều này dễ dàng thực hiện trong thời gian đa thức.

ii) Tồn tại một biến đổi đa thức fL từ mỗi bài toán  trong NP về SAT

SAT được biểu diễn bởi một ngôn ngữ LSAT = L[SAT,e] với một lược đồ mã hố hợp lý e nào đó. Chúng ta phải chứng tỏ rằng với mọi ngôn ngữ L  NP, L  LSAT.

Ký hiệu M là một chương trình NDTM thời gian đa thức tuỳ ý, xác định bởi ,

*

, b, Q, q0, qY, qN và p, đốn nhận ngơn ngữ L = LM. Ngoài ra, cho p(n) là một đa thức trên tập các số nguyên, nó giới hạn hàm phức tạp thời gian TM(n). (Khơng mất tính tổng qt, ta có thể giả sử p(n)  n với mọi n  Z+). Phép biến đổi tổng quát fL sẽ nhận được dưới dạng M, , *, b, Q, q0, qY, qN,  và p.

fL có tính chất là đối với mọi x  *, x  L nếu và chỉ nếu fL(x) có một phép gán thoả được. Điểm mấu chốt khi xây dựng fL là cho thấy cách mà tập các mệnh đề được sử dụng để kiểm tra xem một đầu vào x có được chấp nhận bởi chương trình NDTM là M không, tức là x  L không.

Nếu đầu vào x  * được chấp nhận bởi M, thì chúng ta biết rằng có một tính tốn chấp nhận được cho M trên x sao cho cả số bước trong giai đoạn kiểm tra và số ký hiệu trong xâu phỏng đoán giới hạn bởi p(n) với n = |x|. Một tính tốn như vậy sẽ chỉ liên quan đến các ơ được đánh số từ -p(n) tới p(n)+1, vì đầu đọc-ghi bắt đầu từ ô 1 di chuyển tối đa là một ô tại mỗi bước chuyển. Trạng thái của việc tính tốn kiểm tra tại một thời điểm có thể được xác định hồn tồn, bằng cách đưa ra nội dung của các ô này, trạng thái hiện tại, và vị trí của đầu đọc-ghi. Hơn nữa, vì có khơng nhiều hơn p(n) bước trong việc tính tốn kiểm tra, có nhiều nhất là p(n) +1 thời điểm riêng biệt phải xem xét. Điều này cho phép chúng ta mơ tả một tính tốn như vậy một cách đầy đủ, chỉ sử dụng một số giới hạn các biến Boolean và một phép gán cho chúng.

Gán nhãn các phần tử của Q là q0, q1 = qY, q2 = qN, q3, ..., qr với r = |Q|-1 và gán nhãn các phần tử của  là s0 = b, s1, s2, ..., sv với v = ||-1. Sẽ có ba loại biến, từng loại có một ý nghĩa cụ thể xác định ở Hình 3. Cụm từ “tại thời điểm i” có nghĩa là “trong lúc thực hiên bước i của việc tính tốn kiểm tra”.

Biến Phạm vi Ý nghĩa

Q[i,k] 0 i p(n)

0  k  r Tại thời điểm i, M ở trạng thái qk H[i,j] 0  i  p(n)

-p(n)  j  p(n) + 1

Tại thời điểm i, đầu đọc-ghi đang đọc ô j

S[i,j,k]

0  i  p(n) -p(n)  j  p(n) + 1

0  k  v

Tại thời điểm i, nội dung của ơ j là ký hiệu sk

Hình 3. Các biến trong fL(x) và ý nghĩa của chúng.

Một tính tốn của M sẽ tạo ra một phép gán cho các biến này một cách ràng, với quy ước là nếu chương trình dừng trước thời gian p(n) thì cấu hình vẫn giữ nguyên ở tất cả thời điểm tiếp theo, giữ nguyên trạng thái dừng, ví trí đầu đọc-ghi và nội dung băng. Nội dung của băng tại thời điểm 0 chứa đầu vào x được viết trong các ô từ 1 đến n, và xâu phỏng đốn w được viết trong các ơ từ -1 đến -|w|, các ơ cịn lại là trống.

Theo một phép gán tùy ý, một ơ cho trước có thể chứa nhiều kí hiệu tại một thời điểm, máy có thể cùng lúc ở vài trạng thái khác nhau, và đầu đọc-ghi có thể ở trong tập con bất kỳ của các vị trí –p(n) tới p(n)+1. Biến đổi fL làm việc bằng cách xây dựng một tập các mệnh đề liên quan đến các biến này sao cho một phép gán là thoả được nếu và chỉ nếu nó là phép gán được tạo ra bởi một tính tốn chấp nhận được cho x mà giai đoan kiểm tra có p(n) bước hoặc ít hơn, và xâu phỏng đốn có độ dài tối đa p(n). Vì vậy ta sẽ có:

 có một tính toán chấp nhận được của M trên x với p(n) bước hoặc ít hơn

trong giai đoạn kiểm tra và với xâu được đốn có độ dài chính xác bằng p(n).

 có một phép gán thỏa được cho tập mệnh đề trong fL(x).

Điều này có nghĩa là fL thỏa mãn một trong hai điều kiện yêu cầu của một biến đổi đa thức. Điều kiện cịn lại là fL có thể được thực hiện trong thời gian đa thức, sẽ được kiểm chứng một cách dễ dàng một khi chúng ta đã hồn thành mơ tả về fL.

Các mệnh đề trong fL(x) có thể phân chia thành sáu nhóm, mỗi nhóm áp đặt một loại hạn chế riêng biệt trên phép gán thoả được bất kỳ như trong Hình 4.

Nhóm mệnh đề Hạn chế được áp đặt

G1 Tại thời điểm i, M ở chính xác một trạng thái. G2 Tại thời điểm i, đầu đọc-ghi đọc chính xác một ô.

G3 Tại thời điểm i, mỗi ô chứa chính xác một ký hiệu của .

G4 Tại thời điểm 0, tính tốn ở cấu hình ban đầu với sự kiểm tra của đầu vào x.

G5 Trước thời gian p(n), M đã vào trạng thái là qY và do đó đã chấp nhận x.

G6

Mỗi thời điểm i, 0  i < p(n), cấu hình của M tại thời điểm i+1 theo sau bởi một áp dụng duy nhất của hàm chuyển  từ cấu hình tại thời điểm i.

Nhận xét rằng, nếu tất cả sáu nhóm mệnh đề đều thực hiện nhiệm vụ dự định của chúng thì một phép thực trị thoả được sẽ phải tương ứng với tính tốn chấp nhận mong muốn cho x. Vì vậy, chúng ta chỉ cần chứng tỏ rằng cách mà các nhóm mệnh đề thực hiện nhiệm vụ của chúng là có thể xây dựng được.

Nhóm G1 bao gồm những mệnh đề sau:

{Q[i,0], Q[i,1], ..., Q[i,r]}, 0  i  p(n) {Q i,j , Q i,j' }, 0  i  p(n), 0  j < j’ r

(p(n) + 1) mệnh đề đầu tiên có thể đồng thời được thỏa mãn nếu và chỉ nếu, tại mỗi thời điểm i, M ở trong ít nhất một trạng thái. (p(n) + 1)(r + 1)(r/2) mệnh đề cịn lại có thể đồng thời thỏa mãn nếu và chỉ nếu khơng có thời điểm i nào mà M ở nhiều hơn

một trạng thái. Do đó G1 thực hiện nhiệm vụ của nó.

Nhóm G2 và G3 được xây dựng tương tự, và nhóm G4 và G5 đều khá đơn giản mỗi nhóm chỉ bao gồm các mệnh đề một literal. Hình 6 mơ tả đầy đủ năm nhóm đầu tiên. Chú ý rằng số mệnh đề trong các nhóm, và số literals lớn nhất xuất hiện trong mỗi mệnh đề đều bị chặn bởi hàm đa thức của n (vì r và v là các hằng số xác định bởi M, do đó bởi L).

Nhóm mệnh đề cuối cùng G6, đảm bảo rằng mỗi cấu hình tiếp theo trong tính tốn theo sau cấu hình trước đó bởi một bước của chương trình M, là phức tạp hơn một chút. Nó bao gồm hai nhóm con các mệnh đề.

Nhóm con đầu tiên đảm bảo rằng nếu đầu đọc-ghi không quét ô j tại thời điểm i, thì kí hiệu trong ơ j không thay đổi giữa thời điểm i và i+1. Những mệnh đề trong nhóm con này như sau:

{Si,j,l, H[i,j], S[i+1,j,l]}, 0  i < p(n), -p(n)  j  p(n)+1, 0  l  v

Với mỗi thời điểm i, ơ j và kí hiệu sl, nếu đầu đọc-ghi không quét ô j tại thời điểm i và ô j chứa sl tại thời điểm i nhưng khơng chứa tại thời điểm i+1 thì mệnh đề ở

trên dựa trên i, j và l sẽ không thỏa được (ngược lại thì nó sẽ thỏa được). Do đó, 2(p(n)+1)2(v+1) mệnh đề trong nhóm con này sẽ thực hiện nhiệm vụ của chúng.

Nhóm mệnh đề Các mệnh đề trong nhóm G1 {Q[i,0], Q[i,1], ..., Q[i,r]}, 0 ≤ i ≤ p (n)

{Q[i, j], Q i,j' }, 0 ≤ i ≤ p(n), 0 ≤ j < j’ ≤ r

G2 {H[i,-p(n)], H[i,-p(n)+1], ..., H[i,p(n)+1]}, 0 ≤ i ≤ p(n) {H[i,j], H i,j' }, 0 ≤ i ≤ p(n), -p(n) ≤ j < j’ ≤ p(n)+1

G3 {S[i,j,0], S[i,j,1],...., S[i,j,v]}, 0 ≤ i ≤ p(n), -p(n) ≤ j≤ p(n)+1 {S[i,j,k], Si,j,k'}, 0 ≤ i ≤ p(n), -p(n) ≤ j ≤ p(n)+1, 0 ≤ k≤ k’≤ v G4 {Q[0,0]}, {H[0,1]}, {S[0,0,0]}, {S[0,1,k1]}, {S[0,2,k2]}, …, {S[0,n,kn]}, {S[0,n+1,0]}, {S[0,n+2,0]}, …, {S[0,p(n)+1,0]} trong đó x = sksk ...skn 2 1 G5 {Q[p(n),1]}

Hình 5. Năm nhóm mệnh đề đầu tiên trong fL(x).

Nhóm con cịn lại của G6 đảm bảo những chuyển đổi từ một cấu hình sang cấu

hình tiếp theo phù hợp với hàm chuyển  cho M.

Với mỗi bộ (i, j, k, l), 0 ≤ i < p(n), -p(n) ≤ j ≤ p(n)+1, 0 ≤ k ≤ r, và 0 ≤ l ≤ v, nhóm con này gồm có các mệnh đề sau:

{H[i,j], Q i,k ], S[i,j,l], H[i+1, j+ ]} {H[i,j], Q[i,k]], S[i,j,l], Q[i+1, k’]} {H[i,j], Q[i,k]], S[i,j,l], S[i+1, j,l’]}

trong đó nếu qk  Q-{qy, qN} thì giá trị của , k’

, l’ thoả mãn (qk, sl) = (qk’, sl’, ), và nếu qk {qY, qN} thì  = 0, k’

= k và l’ = l.

Khơng khó để thấy rằng 6(p(n))(p(n) + 1)(r + 1)(v + 1) mệnh đề này áp đặt những hạn chế mong muốn trên các phép gán thoả được.

Vì vậy, ta đã cho thấy cách xây dựng các nhóm mệnh đề từ G1 tới G6 thực hiện các nhiệm vụ được nói ở trên. Nếu x  L thì có một tính tốn chấp nhận của M trên x có chiều dài p(n) hoặc ít hơn, và tính toán này bắt buộc một phép gán phải thoả mãn tất cả các mệnh đề trong C = G1  G2  G3  G4  G5  G6.

Ngược lại, việc xây dựng C là một phép gán thoả được cho C phải tương ứng với một tính tốn chấp nhận của M trên x. Nó kéo theo là fL(x) có một phép gán thỏa được nếu và chỉ nếu x  L.

Tất cả những gì cịn cần chứng tỏ là đối với bất kỳ ngơn ngữ L cố định, fL(x) có thể được xây dựng từ x trong thời gian bị chặn bởi một hàm đa thức của n = |x|. Cho trước L, chúng ta chọn một chương trình NDTM nào đó là M đốn nhận L trong thời gian bị chặn bởi một đa thức p. Giới hạn đa thức của việc tính tốn tập các biến U và tập mệnh đề C được suy trực tiếp một khi chúng ta chứng tỏ rằng Length[fL(x)] là bị chặn trên bởi một hàm đa thức của n, trong đó Length[I] là độ dài của một chuỗi mã hóa thể hiện I theo một lược đồ mã hoá hợp lý. Hàm Length “hợp lý” như vậy cho SAT được cho trước, chẳng hạn bằng |U|.|C|. Khơng mệnh đề nào có thể chứa nhiều hơn 2.|U| literal (đó là tổng số literal), và số ký hiệu cần thiết để mô tả mỗi literal được giới hạn đa thức. Vì r và v được cố định trước và chỉ có thể thêm vào các hằng số vào |U| và |C|, chúng ta có |U| = O(p(n)2) và |C| = O(p(n)2). Do đó, Length[fL(x)] = |U|.|C| = O(p(n)4), và được giới hạn bởi một hàm đa thức của n như mong muốn.

Vì vậy, biến đổi fL có thể tính được bởi một thuật toán thời gian đa thức và ta kết luận rằng với mỗi L  NP, fL là một biến đổi đa thức từ L về SAT. Vậy SAT là NP- đầy đủ.

2) Bài toán 3-SATIFIABILITY (3SAT)

Bài toán 3SAT là một biến thể hạn chế của bài tốn SAT trong đó mỗi mệnh đề chỉ chứa đúng ba literal. Cấu trúc đơn giản của 3SAT làm cho nó trở thành một trong các bài toán được sử dụng rộng rãi để chứng minh các kết quả NP-đầy đủ khác.

- Đầu vào: Cho tập các mệnh đề C = {c1, c2, ..., cm} dựa trên một tập hữu hạn các biến U sao cho |ci| = 3 với 1  i  m.

- Câu hỏi: Có tồn tại một phép gán cho U mà thỏa mãn tất cả các mệnh đề trong C?

Định lý. 3SAT là NP-đầy đủ.

i) 3SAT  NP

Dễ dàng thấy rằng 3SAT thuộc lớp NP vì thuật tốn khơng tất định chỉ cần phỏng đoán một phép gán cho các biến và kiểm tra trong thời gian đa thức phép gán đó thỏa được tất cả các mệnh đề có 3 literal đã cho không.

ii) Ta sẽ xây dựng một phép biến đổi SAT thành 3SAT

Giả sử ta có một đầu vào của SAT là I = (U,C) với U = {u1, ..., un} là tập các biến và C = {c1, ..., cm} là tập các mệnh đề trên U.

Chúng ta sẽ xây dựng một phép biến đổi biến đầu vào của bài toán SAT là I thành đầu vào của bài toán 3SAT là I’ = (U’,C’). Tập C’ chỉ chứa các mệnh đề có đúng 3 literal trên tập các biến U’, sao cho C’ là thỏa được nếu và chỉ nếu C là thỏa được.

Việc xây dựng C'

đơn giản là chỉ cần thay thế mỗi mệnh đề riêng biệt cj thuộc C bởi một tập các mệnh đề Cj’ “tương đương” thuộc C’, dựa trên các biến trong U và một vài biến bổ sung thêm Uj’ chỉ được sử dụng trong các mệnh đề Cj’.

Ta có thể biểu diễn điều này như sau:

       Um j j U U U 1 ' ' và

Um j j C C 1 ' '   Vì thế, ta chỉ cần chỉ ra cách xây dựng Cj’ và Uj’ từ cj.

Giả sử cj = {z1, z2, ..., zk} với các zi là tất cả literal có thể được dẫn xuất từ các biến trong tập U. Cách mà Cj' và Uj' được xây dựng phụ thuộc vào giá trị của k.

Trường hợp 1: k = 1: Uj' = { yj1, yj2} Cj' = {{z1, yj1, yj2}, {z1, yj1, y2j}, {z1, y1j, yj2}, {z1, y1j, y2j}} Trường hợp 2: k = 2: Uj' = {yj1} Cj' = {{z1, z2, yj1}, {z1, z2, y1j}} Trường hợp 3: k = 3: Uj' = ; Cj' = {{cj}} Trường hợp 4: k > 3: Uj' = {yji : 1 i k-3} Cj' = {{z1, z2, yj1)}}  {{ i j

y , zi+2, yji+1: 1 i k-4}}

{{ k3

j

y , zk-1, zk}}

Tiếp theo, để chứng minh rằng phép biến đổi ở trên là đúng đắn, chúng ta sẽ phải chứng tỏ được rằng tập C’ thỏa được nếu và chỉ nếu tập C thỏa được.

- C thỏa được thì C’ cũng thỏa được: Giả sử rằng cho C thỏa được bởi phép gán t: U  {T,F}. Ta chứng tỏ rằng t có thể được mở rộng thành phép gán t’: U’  {T,F} thỏa được cho C’. Bởi vì các biến trong U’-U được phân chia vào các tập Uj’ và các biến trong mỗi Uj’ chỉ xuất hiện trong các mệnh đề thuộc Cj’, nên ta chỉ cần chỉ ra phép gán t có thể được mở rộng thành các tập Uj’ ở các mệnh đề Cj’ như thế nào, và trong mỗi trường hợp ta chỉ cần xác nhận lại rằng tất cả các mệnh đề trong tập Cj’ tương ứng đó là thỏa được. Chúng ta có thể làm như sau:

Với k ≤ 2: thì các mệnh đề trong Cj’ ln thỏa được bởi t. Vì vậy chúng ta có thể mở rộng t tùy ý cho Uj’ (cho t’(y) = T với mọi y  Uj

’ ).

Với k = 3: thì Uj’ là rỗng và mệnh đề trong Cj’ là thỏa được bởi t.

Với k > 3: Vì t là một phép gán thỏa được cho C, nên phải có ít nhất một số ngun l sao cho literal zl là True bởi t.

 Nếu z1 hoặc z2 là True (tức là l = 1 hoặc l = 2) thì ta gán giá trị của các biến bổ sung là “False” (t’(yji) = F với 1 ≤ i ≤ k-3).

 Nếu zk-1 hoặc zk là True (tức là l = k-1 hoặc k) thì ta gán giá trị của các biến bổ sung là “True” (t’(yji) = T với 1 ≤ i ≤ k-3).

 Các trường hợp còn lại, ta gán giá trị t’(yji) = T với 1 ≤ i ≤ l-2 và gán t'(yji ) = F với l-1 ≤ i ≤ k-3.

Một phần của tài liệu (LUẬN văn THẠC sĩ) tìm hiểu độ phức tạp một số thuật toán (Trang 25)

Tải bản đầy đủ (PDF)

(44 trang)