Download as pdf or txt
Download as pdf or txt
You are on page 1of 25

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN


KHOA KHOA HỌC MÁY TÍNH

PHÂN TÍCH THIẾT KẾ GIẢI THUẬT (CS112)

Intractable problem: P,NP-completeness and NP-Complete Problems

GVHD: Huỳnh Thị Thanh Thương


Sinh viên thực hiện: Trần Trọng Nhân - 21522924

TP. Hồ Chí Minh, Tháng 5/2024


Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Mục lục

Lời cảm ơn 2

1 Giải thuật thời gian đa thức tất định và không tất định 2
1.1 Giải thuật tất định (Deterministic) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Giải thuật không tất định (non-Deterministic ) . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Phân loại bài toán theo độ khó 5


2.1 class P . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 class NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Class NP-hard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.1 Polynominal time reducibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Class NP-complete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.1 Giới thiệu về máy Turing và ngôn ngữ hình thức . . . . . . . . . . . . . . . . . . . 13
2.4.2 Định lý Levin-Cook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.3 Chứng minh SAT là NP-complete . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.4 Một vài vấn đề NP-completeness . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.5 Một số kỹ thuật để đối phó với những bài toán NP-complete . . . . . . . . . . . . 22
2.5 Lớp những bài toán bất khả giải quyết . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Lời kết 24

Tài liệu tham khảo 24

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 1/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Lời cảm ơn
Đầu tiên, em xin được gửi lời cảm ơn đến giảng viên là cô Huỳnh Thị Thanh Thương đã giúp em
thực hiện bài tập này. Nhờ sự giúp đỡ tận tình của cô, em đã vượt qua những khúc mắc, khó khăn trong
suốt quá trình thực hiện bài tập, từ đó hoàn thành đúng tiến độ của môn học và cho ra sản phẩm chất
lượng.

1 Giải thuật thời gian đa thức tất định và không tất định

1.1 Giải thuật tất định (Deterministic)

Định nghĩa 1. Permitting at most one next move at any step in a computation.

Đặc trưng :

• Tại mỗi bước của thuật toán, hành động tiếp theo được xác định rõ ràng và không có sự lựa chọn
ngẫu nhiên.

• Cùng một input đầu vào thì thuật toán luôn cho ra một kết quả giống nhau

Ví dụ :
Thuật toán sắp xếp chèn (insertion sort)

Hình 1: thuật toán insertion sort

giải thích thuật toán insertion sort :

• Khởi tạo: Thuật toán bắt đầu với một mảng số thực đã cho a1 , a2 , . . . , an với n ≥ 2.

• Vòng lặp ngoài (for j từ 2 đến n):


Vòng lặp này chạy từ phần tử thứ hai của mảng đến phần tử cuối cùng. Mục đích của vòng lặp
này là xem xét từng phần tử aj và chèn nó vào đúng vị trí trong phần mảng đã được sắp xếp
a1 , . . . , aj−1 .

• Vòng lặp while bên trong (while aj > ai ):


Vòng lặp này tìm vị trí đúng cho aj bằng cách so sánh nó với các phần tử ai của phần mảng đã
được sắp xếp. Biến i được khởi tạo là 1 ở đầu mỗi lần lặp của vòng lặp ngoài.
Miễn là aj lớn hơn ai , chỉ số i sẽ tăng lên 1.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 2/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

• Lưu giá trị của aj :


Sau khi tìm được vị trí đúng, giá trị của aj được lưu vào biến m.

• Vòng lặp for bên trong (for k từ 0 đến j − i − 1):


Vòng lặp này dịch các phần tử của phần mảng đã được sắp xếp sang phải một vị trí để tạo không
gian cho việc chèn m.
Nó thực hiện bằng cách sao chép giá trị của aj−k−1 vào aj−k .

• Chèn m vào vị trí đúng:


Sau khi dịch các phần tử, giá trị được lưu m được chèn vào vị trí đúng ai .

• Kết quả cuối cùng:


Đến cuối vòng lặp ngoài, mảng a1 , a2 , . . . , an được sắp xếp theo thứ tự tăng dần.

Tại sao insertion sort là thuật toán tất định ?

• Không có sự ngẫu nhiên: Thuật toán không sử dụng yếu tố ngẫu nhiên. Mọi hoạt động của nó đều
dựa trên các quy tắc và điều kiện cố định.

• Tính duy nhất của hành động tiếp theo: Tại mỗi bước của thuật toán, chỉ có một hành động duy
nhất được thực hiện tiếp theo dựa trên trạng thái hiện tại và đầu vào hiện tại.

• Với cùng một input đầu vào thì dù chạy thuật toán nhiều lần kết quả output đầu ra vẫn không
thay đổi, luôn luôn là một mảng theo thứ tự tăng dần.

1.2 Giải thuật không tất định (non-Deterministic )

Định nghĩa 2. Permitting more than one choice of next move at some step in a computation

Đặc trưng :

1. Cho phép nhiều hơn một lựa chọn bước tiếp theo: Ở một số bước trong quá trình, có nhiều lựa
chọn khác nhau cho hành động tiếp theo.

2. khi một giải thuật gặp một sự lựa chọn giữa nhiều khả năng, thuật toán có khả năng “tiên đóan”
để biết chọn một khả năng thích đáng.

3. Cùng một input đầu vào, thuật toán có thể cho ra các kết quả khác nhau.

Ví dụ :
Cho A là một mảng số nguyên. Một giải thuật không tất định NSORT(A, n) sắp thứ tự các số theo thứ
tự tăng và xuất chúng ra theo thứ tự này. Đây là một thuật toán mang tính "đoán mò" (nondeterministic
sort), tức là nó sử dụng một bước đoán ngẫu nhiên để đặt các phần tử vào đúng vị trí.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 3/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Hình 2

Giải thích thuật toán Nsort

• Khởi tạo:
Mảng B được tạo và khởi tạo tất cả các phần tử của B bằng 0. Điều này đảm bảo rằng mảng B
ban đầu rỗng và không chứa bất kỳ phần tử nào của A.

• Giai đoạn đoán (guessing stage):


Vòng lặp này chạy từ 1 đến n để chèn từng phần tử của A vào mảng B.

– Trong mỗi lần lặp:


– Một chỉ số j được chọn ngẫu nhiên từ 1 đến n bằng hàm choice(1:n). Hàm này chọn một vị
trí ngẫu nhiên trong khoảng từ 1 đến n.
– Nếu B[j] khác 0, tức là vị trí j đã được sử dụng, thì thuật toán thất bại.
– Nếu B[j] bằng 0, tức là vị trí j còn trống, thì phần tử A[i] được chèn vào B[j].

• Giai đoạn kiểm tra (verification stage):


Sau khi hoàn thành giai đoạn đoán, thuật toán chuyển sang giai đoạn kiểm tra để xác minh rằng
mảng B đã được sắp xếp đúng thứ tự.

– Vòng lặp này chạy từ 1 đến n − 1. Trong mỗi lần lặp:


– Nếu B[i] > B[i + 1], tức là mảng B không được sắp xếp đúng thứ tự, thì thuật toán thất bại.
– Nếu không có lỗi nào được phát hiện, mảng B được in ra và thuật toán thành công.

Vì sao Nsort lại là thuật toán không tất định ?

1. Từ việc sử dụng hàm choice(1:n), có thể thấy rằng tại mỗi bước chọn j, có nhiều lựa chọn khác
nhau.

2. Điều này làm cho thuật toán trở thành không tất định, vì kết quả cuối cùng phụ thuộc vào các lựa
chọn khác nhau được thực hiện trong quá trình thực thi. Điều này không giống như các thuật toán
tất định, nơi mỗi bước chỉ có một hành động duy nhất có thể thực hiện, dẫn đến kết quả duy nhất
nếu cùng điều kiện ban đầu.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 4/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

2 Phân loại bài toán theo độ khó


Các lớp độ phức tạp là tập hợp các bài toán tính toán có đặc điểm tương tự nhau. Chúng được định
nghĩa dựa trên độ khó của việc giải quyết các bài toán này, liên quan đến việc sử dụng các tài nguyên
tính toán như thời gian và bộ nhớ.

• Thời gian: Đo lường số bước cần thiết để giải quyết một bài toán.

• Bộ nhớ: Đo lường lượng bộ nhớ cần thiết để thuật toán hoạt động.

Trong phần tiếp theo, chúng ta sẽ tìm hiểu các lớp độ phức tạp liên quan đến thời gian, cụ thể là các lớp
P, NP, NP-Hard, và NP-Complete.

Hình 3

2.1 class P

Định nghĩa 3. P problems are problems solvable in polynominal time

Đặc trưng :

1. Một bài toán thuộc tập P nếu tồn tại một thuật toán có thể giải quyết bài toán đó trong thời gian
đa thức.

2. Lời giải của các bài toán lớp P rất dễ tìm.

Ví dụ : Bubble Sort là một thuật toán sắp xếp đơn giản nhưng hiệu quả cho các trường hợp nhỏ. Dưới
đây là mô tả ngắn gọn của thuật toán Bubble Sort:

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 5/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Hình 4: thuật toán bubble sort

Giải thích thuật toán bubblesort

1. Khởi tạo biến: Đầu tiên, thuật toán khởi tạo biến i bằng n − 1, nơi n là số lượng phần tử cần sắp
xếp.
i := n − 1;

2. Vòng lặp ngoài: Vòng lặp ngoài chạy từ i = n − 1 đến i ≥ 1.

while (i ≥ 1) do

3. Khởi tạo biến j: Bên trong vòng lặp ngoài, biến j được khởi tạo bằng 0.

j := 0;

4. Vòng lặp trong: Vòng lặp trong chạy từ j = 0 đến j < i.

while (j < i) do

5. So sánh và hoán đổi: Trong vòng lặp trong, thuật toán so sánh hai phần tử liên tiếp V [j] và
V [j + 1]. Nếu V [j] < V [j + 1], tức là phần tử đứng trước nhỏ hơn phần tử đứng sau, chúng sẽ được
hoán đổi vị trí cho nhau.
if (V [j] < V [j + 1]) then

temp := V [j];

V [j] := V [j + 1];

V [j + 1] := temp;

end if

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 6/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

6. Tăng chỉ số j: Sau mỗi lần so sánh và có thể hoán đổi, j được tăng thêm 1 để tiếp tục với cặp
phần tử tiếp theo.
j := j + 1;

7. Giảm chỉ số i: Sau khi hoàn thành một vòng lặp trong (một lượt kiểm tra toàn bộ mảng), chỉ số
i được giảm đi 1 để thu hẹp phạm vi so sánh của vòng lặp tiếp theo.

i := i − 1;

8. Kết thúc vòng lặp: Vòng lặp ngoài tiếp tục cho đến khi i giảm xuống nhỏ hơn 1.

end while

9. Trả về mảng đã sắp xếp: Sau khi hoàn thành tất cả các vòng lặp, thuật toán trả về mảng V đã
được sắp xếp.
return V ;

Vì sao thuật toán bubble sort lại thuộc lớp P ?


Giải thuật Bubblesort có hai vòng lặp lồng nhau:

• Vòng lặp ngoài với biến i chạy từ n − 1 đến 1, tức là có khoảng n lần lặp.

• Vòng lặp trong với biến j chạy từ 0 đến i − 1. Đối với mỗi giá trị của i, j chạy qua i lần lặp.

Tổng số lần lặp của j sẽ là tổng của dãy số từ 1 đến n − 1, tức là n(n−1)
2 . Đây là một biểu thức bậc hai
theo n, tức là O(n2 ).
Bởi vì độ phức tạp thời gian của Bubblesort là O(n2 ), một đa thức theo n, giải thuật này thuộc vào lớp
P. Lớp P bao gồm tất cả các bài toán mà có thể giải quyết trong thời gian đa thức đối với kích thước
của input. Vì thế, một giải thuật có độ phức tạp thời gian là O(n2 ) chắc chắn thuộc lớp P, bởi đa thức
bậc hai vẫn là đa thức.

2.2 class NP

Định nghĩa 4. NP problems are decision problems solvable in non-derministic polynominal time

Đặc trưng :

• NP là lớp các bài toán được giải bằng thuật toán không tất định trong thời gian đa thức.

• Lời giải của các bài toán NP rất khó tìm, nhưng nếu tìm được lời giải thì rất dễ chứng minh lời
giải đó là đúng hay sai trong thời gian đa thức

Có một định nghĩa NP khác như sau :

Định nghĩa 5. NP : decision problems with poly-size cerfiticates and poli-size verifiers for YES
input

Giải thích định nghĩa :

1. Bài toán quyết định ( decision problem ) là gì ?


Cấu trúc của một bài toán quyết định

• Đầu vào:
Một tập hợp các phần tử hoặc giá trị cần được xem xét.
• Câu hỏi:
Một câu hỏi "YES" hoặc "NO" dựa trên đầu vào.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 7/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

• Ví dụ cụ thể về bài toán quyết định


Bài toán số nguyên tố (Prime Checking Problem):
– Đầu vào: Một số nguyên dương n.
– Câu hỏi: n có phải là số nguyên tố hay không?
YES nếu n là số nguyên tố.
NO nếu n không phải là số nguyên tố.

2. certificate là gì ?
là thông tin bổ sung hoặc lời giải tiềm năng cho bài toán.

3. Bộ xác minh (Verifier ) là gì ?


Bộ xác minh (Verifier) là thuật toán kiểm tra tính đúng đắn của chứng chỉ trong thời gian đa thức.

4. ví dụ cụ thể :
Bài toán Hamiltonian Path
Đầu vào:
Một đồ thị G.
Câu hỏi:
Có tồn tại một đường đi Hamiltonian trong G hay không?

• Certificate:
– Một danh sách các đỉnh của G tạo thành một đường đi Hamiltonian. Ví dụ, trong đồ thị
có 4 đỉnh A, B, C, D, một chứng chỉ có thể là danh sách [A, B, C, D].
• Bộ xác minh (Verifier):
– Bộ xác minh sẽ nhận vào đồ thị G và danh sách các đỉnh.
– Kiểm tra xem danh sách có chứa tất cả các đỉnh của G một lần duy nhất và mỗi cặp liên
tiếp trong danh sách đều là cạnh của đồ thị.
– Quá trình này có thể thực hiện trong thời gian đa thức vì việc kiểm tra danh sách và các
cạnh là các phép toán đơn giản.
• Ví dụ:
– Đồ thị G với các cạnh: (A − B), (B − C), (C − D)
– certificate: Danh sách [A, B, C, D]
– Bộ xác minh sẽ kiểm tra:
∗ Danh sách chứa tất cả các đỉnh A, B, C, D một lần duy nhất.
∗ Các cặp (A − B), (B − C), (C − D) đều là các cạnh của G.
Tất cả các điều kiện đều thỏa mãn, do đó đường đi Hamiltonian tồn tại và bộ xác minh
trả về YES.

Một số ví dụ về lớp NP :
Clique problem :
Định nghĩa về Clique: Một clique trong đồ thị vô hướng là một đồ thị con mà mọi cặp nút trong đó
đều được nối với nhau bằng một cạnh. Ví dụ được minh họa trong Hình 4 cho thấy một clique 5, tức là
một clique chứa 5 nút, tất cả đều được nối với nhau.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 8/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Hình 5: Đồ thị với 5-clique

Vấn đề Clique: Đây là vấn đề xác định liệu một đồ thị có chứa một clique của kích thước nhất định
hay không. Vấn đề này được định nghĩa chính thức trong sách như sau:

CLIQUE = {(G, k) | G là một đồ thị vô hướng chứa một k-clique}

trong đó G là đồ thị và k là kích thước của clique.

Ý tưởng Chứng minh: Ý tưởng chứng minh được đưa ra là với certificate là clique c, tìm một
verifier có thể chứng minh một tập con c gồm k là một clique trong thời gian đa thức . Verifier dùng để
kiểm tra xem một tập hợp con các nút có tạo thành một clique hay không gồm các bước sau :

1. Nhập đồ thị G và một tập hợp con c gồm k nút.

2. Kiểm tra xem mỗi cặp nút trong c có cạnh nối chúng trong G hay không.

3. Chấp nhận đầu vào nếu tất cả các cặp đều được kết nối, nếu không thì từ chối.

Với Vấn đề Clique, để xác minh một tập hợp c có phải là một clique hay không, verifier cần kiểm tra
từng cặp đỉnh trong c. Vì số lượng các cặp đỉnh mà verifier cần kiểm tra là tổ hợp chập 2 của k (nếu k
là số đỉnh trong tập hợp c), tổng số cặp là k2 , đây là một hàm đa thức của k. Do đó, verifier này chạy


trong thời gian đa thức đối với kích thước của c, phù hợp với yêu cầu của một vấn đề thuộc lớp NP.

2.3 Class NP-hard

Định nghĩa 6. X is NP-hard if every problem Y ∈ NP reduces to X

Đặc trưng :

• Một bài toán NP-hard ít nhất cũng khó bằng bài toán khó nhất trong NP và nó là một loại bài
toán mà mọi bài toán trong NP đều giảm xuống NP-hard.

• Khác với NP là nếu tìm được lời giải thì sẽ kiểm tra lời giải đó đúng hay không trong thời gian đa
thức. Phải mất một thời gian dài để kiểm tra chúng. Điều này có nghĩa là nếu một giải pháp cho
một bài toán NP-hard được đưa ra thì phải mất nhiều thời gian để kiểm tra xem nó có đúng hay
không.

2.3.1 Polynominal time reducibility

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 9/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Định nghĩa 7. Reduction is from A problem reduces to B problem by polinominal time algorithm
and convert A input to equivalent B input

• Reduction từ bài toán A sang bài toán B bằng thuật toán thời gian đa thức là một khái niệm quan
trọng trong lý thuyết tính toán và độ phức tạp. Nó cho phép chúng ta chứng minh rằng một bài
toán này có thể được "chuyển đổi" thành một bài toán khác trong thời gian đa thức, và do đó, nếu
chúng ta có thể giải được bài toán B, chúng ta cũng có thể giải được bài toán A.

Ví dụ về NP-hard :
Bài toán Người du lịch (Travelling Salesman Problem - TSP)
Mục tiêu Cho một tập hợp các thành phố và khoảng cách giữa mỗi cặp thành phố, tìm tuyến đường
ngắn nhất đi qua mỗi thành phố một lần và trở về điểm xuất phát.
Định nghĩa bài toán Cho đồ thị G(V, E) và một ngưỡng chi phí K, xác định xem có tồn tại một
hành trình TSP với tổng chi phí không quá K hay không.
Chứng minh NP-Hard Để chứng minh TSP là NP-Hard, ta thực hiện việc giảm một bài toán đã
biết là NP-Hard. Ta sẽ sử dụng bài toán NP-hard đã biết là Hamilton Cycle ( chu trình Hamilton ) để
thu giảm về bài toán TSP.
Bài toán Chu trình Hamilton Mục tiêu: Cho một đồ thị G(V, E), xác định xem có tồn tại một
chu trình đi qua mỗi đỉnh một lần và trở về đỉnh ban đầu hay không.
Quá trình thu giảm
Đầu vào: Một đồ thị G = (V, E) của bài toán Chu trình Hamilton.
Xây dựng đồ thị mới G′ = (V ′ , E ′ ):

• Đỉnh: V ′ = V (tập các đỉnh giống như trong G).

• Cạnh: Tạo một đồ thị đầy đủ bằng cách thêm các cạnh không có trong E.

• Chi phí của các cạnh:

– Với các cạnh e ∈ E (các cạnh gốc trong G), đặt chi phí c(e) = 1.
– Với các cạnh e′ ∈
/ E (các cạnh mới thêm vào để làm đầy đủ đồ thị G′ ), đặt chi phí c(e′ ) = 2.

• chi phí tối đa Đặt K = N với N là số đỉnh của G.

Hình 6

Sự tương đương của 2 bài toán


Nếu G có một chu trình Hamilton:

• Một chu trình Hamilton trong G sử dụng N cạnh, tất cả đều thuộc E và có chi phí là 1 mỗi cạnh.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 10/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

• Do đó, tổng chi phí của chu trình là N .

• Chu trình này trong G tương ứng trực tiếp với một hành trình TSP trong G′ với chi phí N , đáp
ứng điều kiện K = N .
Nếu G′ có một hành trình TSP với chi phí K = N :
• TSP đi qua mỗi đỉnh một lần và trở về điểm xuất phát, sử dụng N cạnh.

• Vì tổng chi phí là N và mỗi cạnh trong đồ thị gốc G có chi phí là 1, TSP phải sử dụng tất cả các
cạnh từ E.

• Do đó, các cạnh này tạo thành một chu trình Hamilton trong G.
Kết luận Việc thu giảm này cho thấy rằng nếu ta có thể giải quyết TSP với chi phí không quá K,
ta có thể xác định được liệu có một chu trình Hamilton trong G hay không, và ngược lại. Việc xây dựng
G′ từ G và thêm các chi phí tương ứng có thể thực hiện trong thời gian đa thức. Vì vậy, TSP ít nhất là
khó như bài toán Chu trình Hamilton, chứng minh rằng TSP là NP-Hard.

2.4 Class NP-complete

Định nghĩa 8. X is NP complete if X is NP and X is NP-hard

Đặc trưng :
• Một bài toán là NP-complete nếu nó vừa thuộc lớp NP và vừa thuộc lớp NP-hard.

• Các bài toán NP-complete là các bài toán khó trong NP.

• Các bài toán NP-đầy đủ rất đặc biệt vì bất kỳ bài toán nào trong lớp NP đều có thể được chuyển
đổi hoặc thu giảm thành các bài toán NP-đầy đủ trong thời gian đa thức.

• Nếu người ta có thể giải một bài toán NP-đầy đủ trong thời gian đa thức thì người ta cũng có thể
giải bất kỳ bài toán NP nào trong thời gian đa thức.
Ví dụ NP-complete :
Hamilton cycle problem ( Chu trình hamilton ) :
1. Thế nào là chu trình Hamilton ?
Một chu trình trong đồ thị vô hướng G=(V, E) đi qua mọi đỉnh đúng một lần và quay về đỉnh đầu,
với V là tập đỉnh và E là tập các cạnh của đồ thị

2. Phát biểu bài toán : Cho một đồ thị G = (V, E), bài toán là xác định xem đồ thị G có chứa
chu trình Hamilton gồm tất cả các đỉnh thuộc V hay không.

3. Chứng minh Chu trình hamilton là một bài toán NP-complete :


Vì chu trình hamilton là bài toán NP-Complete, theo định nghĩa, là một bài toán cả trong NP và
NP-hard, nên để chứng minh ta thực hiện hai điều kiện sau đây :

• Bản thân vấn đề nằm ở lớp NP.


• Tất cả các vấn đề khác trong lớp NP có thể được giảm thiểu theo thời gian đa thức. (B là thời
gian đa thức có thể rút gọn về C được ký hiệu là B ⩽P C).

(a) Chu trình Hamilton nằm trong lớp NP: Nếu bất kỳ bài toán nào nằm trong lớp NP, thì
khi có được một certificate ( một lời giải tiềm năng ), chúng ta sẽ có thể xác minh certificate
đó là đúng hay sai trong thời gian đa thức. Certificate ở đây là một dãy các đỉnh tạo thành
Chu trình Hamilton trong đồ thị. Chúng ta có thể xác minh lời giải này bằng cách kiểm tra
rằng tất cả các đỉnh thuộc về đồ thị và mỗi cặp đỉnh thuộc lời giải là kề nhau. Điều này có
thể thực hiện trong thời gian đa thức, tức là O(V + E) bằng cách sử dụng chiến lược sau cho
đồ thị G(V, E):

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 11/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

flag = true
For every pair {u, v} in the subset V’:
Check that these two have an edge between them
If there is no edge, set flag to false and break
If flag is true:
Solution is correct
Else:
Solution is incorrect

Chiến lược này nghĩa là:


• Đặt cờ hiệu (flag) ban đầu là đúng (true).
• Đối với mỗi cặp {u, v} trong tập con V ′ :
– Kiểm tra xem hai đỉnh này có cạnh nối nhau không.
– Nếu không có cạnh nối, đặt cờ hiệu là sai (false) và dừng kiểm tra.
• Nếu cờ hiệu là đúng (true):
– Lời giải là chính xác.
• Ngược lại:
– Lời giải là không chính xác.
(b) Chu trình Hamilton là NP-Hard:
Để chứng minh Chu trình Hamilton là NP-Hard, chúng ta sẽ phải giảm một bài toán NP-Hard
đã biết thành bài toán này. Chúng ta sẽ thực hiện một phép giảm từ bài toán Đường đi
Hamilton sang bài toán Chu trình Hamilton.
Bài toán đường đi hamilton là gì ?
Đường đi hamilton là đường đi từ đỉnh bắt đầu đến đỉnh kết thúc của đồ thị và đi qua mỗi
đỉnh trong đồ thị một lần.
Bước 1: Định nghĩa các bài toán
Bài toán Đường đi Hamilton (Hamiltonian Path)
Đầu vào: Một đồ thị G = (V, E) và hai đỉnh s, t trong G.
Đầu ra: Có tồn tại một đường đi từ s đến t trong G đi qua mỗi đỉnh đúng một lần không?
Bài toán Chu trình Hamilton (Hamiltonian Cycle)
Đầu vào: Một đồ thị G = (V, E).
Đầu ra: Có tồn tại một chu trình trong G đi qua mỗi đỉnh đúng một lần không?
Bước 2: Thiết kế thuật toán chuyển đổi
Chúng ta cần chuyển đổi một trường hợp của bài toán Đường đi Hamilton thành một trường
hợp của bài toán Chu trình Hamilton. Đây là một cách để thực hiện:
Đầu vào: Một đồ thị G = (V, E) và hai đỉnh s, t là đỉnh bắt đầu và đỉnh kết thúc của bài
toán Đường đi Hamilton.
Chuyển đổi: Tạo một đồ thị mới G′ từ đồ thị G bằng cách thêm một đỉnh mới v và các cạnh
mới. với tập đỉnh mới là V ′ = V + 1 và tập cạnh với số cạnh tăng lên bằng V ( số đỉnh ) mới
E′ = E + V

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 12/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Hình 7

Bước 3: Chứng minh sự tương đương


Nếu đồ thị G có một đường đi Hamilton từ s đến t:
Thì trong G′ , bắt đầu từ v, đi đến s, đi qua tất cả các đỉnh của G đến t, và cuối cùng quay
lại v. Điều này tạo thành một chu trình Hamilton trong G′ .
Ngược lại, nếu đồ thị G′ có một chu trình Hamilton:
Chu trình này phải bao gồm đỉnh v. Do đó, khi bỏ đi đỉnh v và các cạnh liên quan nối với
đỉnh v, ta được một đường đi Hamilton từ s đến t trong đồ thị G.
Kết luận
chúng ta có thể nói rằng đồ thị G′ chứa một Chu trình Hamilton thì đồ thị G chứa một Đường
đi Hamilton. Do đó, nếu có một thuật toán giải bài toán Chu trình Hamilton trong thời gian
đa thức, thì ta có thể sử dụng thuật toán đó để giải bài toán Đường đi Hamilton trong thời
gian đa thức bằng cách sử dụng thuật toán chuyển đổi trên. Điều này chứng tỏ rằng bài toán
Chu trình Hamilton là ít nhất cũng khó như bài toán Đường đi Hamilton, nghĩa là Chu trình
Hamilton là NP-hard.

2.4.1 Giới thiệu về máy Turing và ngôn ngữ hình thức

Máy Turing bao gồm ba thành phần chính:


Băng: Đây là bộ nhớ của máy Turing, gồm một chuỗi các ô kéo dài vô hạn. Mỗi ô trên băng có thể
chứa một ký tự từ một bảng chữ cái hữu hạn. Băng là nơi lưu trữ thông tin và cũng là nơi diễn ra các
thao tác tính toán.
Đầu đọc/ghi: Đầu này có thể di chuyển qua lại trên băng, đọc ký tự ở ô hiện tại hoặc ghi đè ký tự
mới vào đó.
Bảng chuyển trạng thái: Đây là "bộ não" của máy Turing, chứa các quy tắc dạng (trạng thái hiện
tại, ký tự hiện tại) → (ký tự mới, hướng di chuyển, trạng thái mới). Quy tắc này quy định hành động
tiếp theo dựa trên trạng thái hiện tại của máy và ký tự mà đầu đọc/ghi đọc được.
Cách Thức Hoạt Động Máy bắt đầu với băng có dữ liệu đầu vào, đầu đọc/ghi đặt ở vị trí bắt đầu,
và máy ở một trạng thái ban đầu. Máy thực hiện các bước theo bảng chuyển trạng thái:

• Đọc ký tự tại ô hiện tại.

• Tìm quy tắc trong bảng chuyển trạng thái dựa trên trạng thái hiện tại và ký tự vừa đọc.

• Thực hiện quy tắc: ghi ký tự mới, di chuyển đầu đọc/ghi sang trái hoặc phải, và chuyển sang trạng
thái mới.

• Lặp lại cho đến khi máy đạt trạng thái dừng.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 13/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Ngôn ngữ L trong ngữ cảnh của lý thuyết ngôn ngữ hình thức và máy Turing, là một tập hợp các
chuỗi ký tự được lựa chọn từ một bảng chữ cái đã cho. Bảng chữ cái này, thường được ký hiệu là Σ, là
một tập hợp hữu hạn các ký tự. Ngôn ngữ là một tập con của các chuỗi có thể hình thành từ bảng chữ
cái này, ký hiệu là Σ∗ , nơi Σ∗ đại diện cho tập hợp tất cả các chuỗi có thể có, bao gồm cả chuỗi rỗng.
Ví dụ:
Bảng chữ cái: Σ = {a, b}
Một ngôn ngữ trên Σ có thể là L = {aa, ab, bba, bbb}, nghĩa là ngôn ngữ L bao gồm các chuỗi "aa",
"ab", "bba", và "bbb".
Ngôn ngữ có thể được định nghĩa bởi các quy tắc cụ thể (như ngôn ngữ chính quy hoặc ngôn ngữ
ngữ pháp tự nhiên) hoặc được nhận diện bởi các loại máy tính nhất định như máy Turing, automata hữu
hạn, hay các loại automata khác.
Chuỗi w Chuỗi w là một chuỗi ký tự cụ thể từ bảng chữ cái của ngôn ngữ. Trong nhiều tình huống,
w được sử dụng để mô tả một đầu vào hoặc một thực thể cụ thể trong ngôn ngữ đó.
Ví dụ:
Cho bảng chữ cái Σ = {0, 1}, chuỗi w có thể là "0110", "1001", hoặc bất kỳ kết hợp nào của các ký
tự 0 và 1.
Trong lý thuyết máy Turing, chuỗi w thường được dùng để chỉ đầu vào cho máy Turing. Kết quả của
việc máy Turing xử lý chuỗi w sẽ xác định liệu chuỗi đó có thuộc ngôn ngữ L hay không, nghĩa là liệu
máy Turing có chấp nhận (accept) chuỗi đó như một phần của ngôn ngữ mà nó được thiết kế để nhận
diện hay không.
Ví dụ cụ thể :
Cho trước một đồ thị G = (V, E), nơi V là tập hợp các đỉnh và E là tập hợp các cạnh, bài toán đặt ra
là xác định xem có tồn tại một chu trình Hamilton không, tức là một chu trình đi qua mỗi đỉnh của đồ
thị đúng một lần trước khi quay trở lại điểm xuất phát.
Định Nghĩa Ngôn Ngữ LHamilton
Bảng Chữ Cái (Σ)

• Sử dụng các ký tự để đại diện cho các đỉnh và các cạnh trong đồ thị.

• Có thể bao gồm các ký tự như dấu ngoặc (, ), dấu phẩy , để biểu diễn các cạnh như các cặp, và
các dấu phân cách như dấu chấm phẩy ; để phân tách các cạnh.

Ngôn Ngữ LHamilton :


LHamilton là tập hợp của tất cả các chuỗi mô tả các đồ thị G = (V, E), nơi mà tồn tại một chu trình
Hamilton.
Một chuỗi w ∈ LHamilton nếu và chỉ nếu chuỗi đó mã hóa một đồ thị mà trong đó có thể tìm thấy
một chu trình đi qua mỗi đỉnh đúng một lần và trở lại điểm bắt đầu.
Biểu Diễn Hình Thức của Bài Toán Tìm Đường Đi Hamilton
Để phát biểu bài toán tìm đường đi Hamilton dưới dạng một ngôn ngữ chính quy, ta có thể sử dụng
các ký hiệu sau:
Cho một đồ thị biểu diễn bởi chuỗi w, kiểm tra xem w ∈ LHamilton hay không.
Máy Turing và Bài Toán Đường Đi Hamilton
Đối với một máy Turing:

• Đầu vào: Chuỗi w biểu diễn đồ thị.

• Xử lý: Máy Turing sẽ kiểm tra từng cách kết nối các đỉnh để xem liệu có thể tạo thành một chu
trình Hamilton hay không. Điều này có thể được thực hiện thông qua các thuật toán kiểm tra hoặc
thông qua một cách tiếp cận không đơn định nếu máy Turing là không đơn định.

• Đầu ra: Máy Turing sẽ chấp nhận chuỗi nếu tìm thấy chu trình Hamilton và từ chối nếu không
tìm thấy.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 14/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

2.4.2 Định lý Levin-Cook

Nội dung của định lý Cook-Levin :


Định lý Cook-Levin khẳng định rằng bài toán Boolean satisfiability problem (SAT) là NP-đầy đủ (NP-
complete).
Điều này có nghĩa là :

1. SAT là một vấn đề trong lớp NP: Nghĩa là nếu một bài toán thuộc lớp NP có lời giải, thì lời
giải đó có thể được kiểm chứng trong thời gian đa thức.

2. Mọi vấn đề trong NP có thể được quy về SAT trong thời gian đa thức: Điều này có nghĩa
là bất kỳ vấn đề nào thuộc lớp NP đều có thể được chuyển đổi thành một trường hợp cụ thể của
bài toán SAT mà không mất quá nhiều thời gian (cụ thể là thời gian đa thức).

Tầm quan trọng của định lý Cook-Levin :


Định lý này cực kỳ quan trọng vì nó đặt nền móng cho lý thuyết NP-đầy đủ, giúp xác định và phân loại
các bài toán khó khăn trong khoa học máy tính. Nếu chúng ta có thể tìm ra một thuật toán giải bài toán
SAT trong thời gian đa thức, thì mọi bài toán thuộc lớp NP cũng có thể được giải quyết trong thời gian
đa thức. Điều này sẽ chứng minh rằng P = NP, một trong những câu hỏi mở lớn nhất trong toán học
và khoa học máy tính.
Bài toán SAT :
Bài toán SAT là bài toán xác định xem liệu có tồn tại một cách gán giá trị đúng sai cho các biến trong
một công thức Boolean sao cho công thức đó trở thành đúng. Một công thức Boolean ở đây thường được
biểu diễn dưới dạng chuẩn tắc Chương Trình (Conjunctive Normal Form - CNF ).
Ví dụ về bài toán SAT :
Giả sử bạn có công thức Boolean sau:

(x1 ∨ ¬x2 ) ∧ (¬x1 ∨ x2 )

Bài toán SAT yêu cầu bạn xác định xem có cách nào gán giá trị cho x1 và x2 sao cho công thức này
đúng. Trong trường hợp này, bạn có thể thấy rằng nếu x1 = true và x2 = false, thì công thức sẽ trở
thành:

(true ∨ true) ∧ (false ∨ false)

Điều này là đúng, do đó công thức trên có lời giải thỏa mãn.
Tổng kết :
Định lý Cook-Levin thiết lập cơ sở cho việc nghiên cứu các bài toán NP-đầy đủ và có ảnh hưởng sâu rộng
trong lý thuyết tính toán và khoa học máy tính. Nó giúp xác định các bài toán mà nếu chúng ta có thể
giải quyết hiệu quả một trong số chúng, thì có thể giải quyết hiệu quả tất cả các bài toán thuộc lớp NP.

2.4.3 Chứng minh SAT là NP-complete

Chứng minh bài toán SAT là NP-Complete đòi hỏi hai điều kiện:

1. SAT thuộc NP.

2. Mọi bài toán trong NP đều có thể giảm về SAT trong thời gian đa thức.

Chứng minh SAT thuộc NP rất đơn giản. Khi có một lời giải (certificate) là một phép gán cho các
biến trong công thức SAT, chúng ta có thể dễ dàng xác minh tính đúng đắn của lời giải này trong thời
gian đa thức. Cụ thể, ta chỉ cần kiểm tra xem phép gán có làm công thức logic trở thành đúng hay không,
điều này rõ ràng có thể làm được trong thời gian đa thức.
Việc chứng minh còn lại là mọi bài toán trong NP đều có thể giảm về SAT trong thời gian đa thức. Để
làm điều này, chúng ta sẽ mô hình hóa bài toán NP thành một quá trình làm việc của một máy Turing

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 15/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

không đơn định (nondeterministic Turing machine).


Giả sử ta có một bài toán thuộc NP. Điều này có nghĩa là tồn tại một máy Turing không đơn định M
có thể quyết định bài toán này trong thời gian đa thức. Cụ thể, với một chuỗi đầu vào w, máy Turing
M sẽ kiểm tra xem w có thuộc ngôn ngữ L hay không (với L là tập hợp các chuỗi đầu vào cho kết quả
là đúng) trong thời gian đa thức. Để chứng minh mọi bài toán NP đều có thể giảm về SAT, ta cần làm
các bước sau:

1. Mô tả quá trình làm việc của máy Turing: Mô hình hóa quá trình làm việc của máy Turing
M trên chuỗi đầu vào w như một chuỗi các bước tính toán. Mỗi bước tính toán có thể được mô tả
bởi trạng thái của máy Turing, vị trí đầu đọc/ghi trên băng, và nội dung băng.

2. Biểu diễn các bước tính toán dưới dạng công thức logic: Chuyển đổi mô tả của các bước
tính toán thành một công thức logic. Cụ thể, ta xây dựng một công thức logic sao cho công thức
này khả thỏa nếu và chỉ nếu máy Turing M có thể chuyển từ trạng thái khởi đầu đến trạng thái
chấp nhận trong số bước tính toán không quá đa thức theo độ dài của w.

3. Xây dựng công thức SAT tương ứng: Từ công thức logic đã xây dựng, ta chuyển đổi nó thành
một công thức SAT (công thức ở dạng chuẩn tắc mệnh đề, CNF - Conjunctive Normal Form). Quá
trình chuyển đổi này phải đảm bảo được thực hiện trong thời gian đa thức.

Ta sẽ mô tả quá trình làm việc và chuyển trạng thái của máy turing trong quá trình giải bài toán A
bằng một bảng tabeau như sau :
Một bảng tableau là một ma trận với kích thước nk .nk

Hình 8: bảng tableau

Mỗi dòng ( hay còn gọi là mỗi config ) của bảng tableau bắt đầu và kết thúc bằng kí tự # .Ký tự
# giúp tách biệt các cấu hình khác nhau trong bảng tableau, đảm bảo rằng mỗi cấu hình là một dãy
liên tiếp của các trạng thái và ký tự trên băng. Điều này giúp tránh sự nhầm lẫn giữa các cấu hình khác
nhau. Mỗi một configuration ( config ) tương ứng với mỗi dòng là một trạng thái của máy turing tại một
thời điểm.
Dòng đầu tiên của tableau là trạng thái của cấu hình bắt đầu (starting configuration ) của máy trạng
thái với đầu vào w, mỗi dòng kết tiếp là sự chuyển trạng thái từ trạng thái ở trước đó tuân theo hàm
chuyển trạng thái của N ( với N là máy turing machine ).
Tableau được accepting ( có nghĩa là đạt được trạng thái accept và chuyển sang trạng thái dừng (halting
) nếu bất kì dòng nào của tableau là một trạng thái accepting configuration.
Có tất cả là (nk )2 entries của 1 bảng tableau gọi là cell. Mỗi cell ở dòng i và cột j ( với i là chỉ số dòng và

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 16/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

j là chỉ số cột của tableau ) chứa một kí tự từ C. với C = Q + T + # với Q là kí tự biểu thị các trạng
thái của máy turing, T là kí tự trên băng, và kí tự # . Chúng ta sẽ mã hóa các ô của tableau thành các
biến xi,j,s với i,j là chỉ số cột và hàng, còn s là một kí tự thuộc tập C. Biến xi,j,s với giá trị 1 tương ứng
với true tức có nghĩa là cell[i,j] trong tableau được gán kí tự s.
Ta mô tả toàn bộ quá trình tính toán của máy turing không đơn định bằn cách tạo ra một công thức
Boolean SAT tương ứng là φ.
Công thức φ bao gồm and của 4 phần là φcell , φstart , φaccept , φmove .

1. Công thức φcell : Mô tả các biến trạng thái của máy Turing, Công thức φcell dùng để mã hóa rằng
máy Turing tại mỗi bước chỉ có một trạng thái duy nhất và băng chỉ có một ký hiệu tại một ô nhất
định. Công thức này đảm bảo rằng mọi cấu hình của máy Turing là hợp lệ, nghĩa là tại mỗi thời
điểm chỉ có một trạng thái và mỗi ô băng chỉ chứa một ký hiệu duy nhất.
Cụ thể, ta có công thức:
  
!
^  _  ^ 
ϕcell = 
 xi,j,s ∧
 (¬xi,j,s ∨ ¬xi,j,t )
 .

1≤i,j≤nk s∈C s,t∈C
s̸=t

Giải thích các ký hiệu và ý nghĩa của công thức:


V W
và lần lượt là ký hiệu cho phép AND (và) và OR (hoặc) được lặp lại.
C = {s1 , s2 , . . . , sl } là tập hợp các ký hiệu có thể có trong ô.
xi,j,s là biến Boolean biểu thị việc ký hiệu s nằm ở ô (i, j).
Công thức này gồm hai phần chính:

_
xi,j,s :
s∈C

Biểu thức này đảm bảo rằng ít nhất một biến xi,j,s sẽ bằng True, tức là ít nhất một ký hiệu s sẽ
xuất hiện ở ô (i, j).

^
(¬xi,j,s ∨ ¬xi,j,t ) :
s,t∈C
s̸=t

Biểu thức này đảm bảo rằng không có hai ký hiệu khác nhau s và t cùng xuất hiện ở ô (i, j). Cụ
thể, nếu xi,j,s bằng True thì xi,j,t phải bằng False và ngược lại.
Kết hợp cả hai phần này, công thức φcell đảm bảo rằng mỗi ô (i, j) trong bảng chỉ có duy nhất một
ký hiệu từ tập C, không hơn, không kém.
Như vậy, φcell là một biểu thức lớn bao gồm các phần tử cho mỗi ô trong bảng, với i và j thay
đổi từ 1 đến n. Mỗi phần tử trong đó có hai phần, một phần đảm bảo ít nhất một biến xi,j,s bằng
True, và phần còn lại đảm bảo không có hai biến khác nhau xi,j,s và xi,j,t cùng bằng True. Các
V
phần tử này được kết nối với nhau bằng các phép AND ( ).

2. Công thức φstart : dùng để xác định trạng thái ban đầu của máy Turing. Công thức này mô tả rằng
tại thời điểm bắt đầu (t = 0), máy Turing đang ở trạng thái khởi đầu, đầu đọc ở vị trí đầu tiên của
băng, và các ký hiệu trên băng tương ứng với đầu vào của bài toán. Công thức φstart đảm bảo rằng
hàng đầu tiên của bảng là cấu hình bắt đầu của máy N trên từ đầu vào w bằng cách quy định rõ
ràng rằng các biến tương ứng được bật (on).
Cụ thể, công thức là:

φstart = x1,1,# ∧ x1,2,q0 ∧ x1,3,w1 ∧ x1,4,w2 ∧ . . . ∧ x1,n+2,wn ∧ x1,n+3,_ ∧ . . . ∧ x1,nk −1,_ ∧ x1,nk ,# .

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 17/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Giải thích các ký hiệu và ý nghĩa của công thức:

• x1,1,# : Biến Boolean này biểu thị rằng ô đầu tiên của hàng đầu tiên chứa ký hiệu # (ký hiệu
bắt đầu).
• x1,2,q0 : Biến Boolean này biểu thị rằng ô thứ hai của hàng đầu tiên chứa trạng thái bắt đầu
q0 của máy N .
• x1,3,w1 ∧ x1,4,w2 ∧ . . . ∧ x1,n+2,wn : Các biến này biểu thị rằng các ô tiếp theo trong hàng đầu
tiên chứa các ký hiệu của từ đầu vào w. Cụ thể, ô thứ 3 chứa ký hiệu đầu tiên w1 của từ w, ô
thứ 4 chứa ký hiệu thứ hai w2 , và cứ tiếp tục như vậy cho đến ô chứa ký hiệu cuối cùng wn .
• x1,n+3,_ ∧ . . . ∧ x1,nk −1,_ : Các biến này biểu thị rằng các ô còn lại trong hàng đầu tiên chứa
ký hiệu trống _.
• x1,nk ,# : Biến Boolean này biểu thị rằng ô cuối cùng của hàng đầu tiên chứa ký hiệu # (ký
hiệu kết thúc).

Công thức φstart đảm bảo rằng cấu hình bắt đầu của máy N trên từ w được biểu diễn chính xác
trên hàng đầu tiên của bảng. Cấu hình này bao gồm ký hiệu bắt đầu #, trạng thái bắt đầu q0 , các
ký hiệu của từ w, các ô trống, và ký hiệu kết thúc #. Các biến Boolean này đảm bảo rằng mỗi ô
trong hàng đầu tiên chứa đúng ký hiệu hoặc trạng thái như đã mô tả.

3. Công thức φaccept : Công thức đảm bảo rằng có ít nhất một trạng thái chấp nhận xuất hiện trong
một bước nào đó của máy Turing. Công thức này mã hóa rằng máy Turing kết thúc quá trình tính
toán với một cấu hình chấp nhận, tức là bài toán đưa ra có lời giải.
Công thức φaccept đảm bảo rằng có một cấu hình chấp nhận xuất hiện trong bảng (tableau). Nó
đảm bảo rằng ký hiệu qaccept , là ký hiệu cho trạng thái chấp nhận, xuất hiện trong một trong các
ô của bảng bằng cách quy định rằng một trong các biến tương ứng được bật (on).
Cụ thể, công thức là:

_
φaccept = xi,j,qaccept .
1≤i,j≤nk

Giải thích các ký hiệu và ý nghĩa của công thức:


W W
1≤i,j≤nk :
Dấu là ký hiệu cho phép OR (hoặc) lặp lại, áp dụng cho tất cả các giá trị của
i và j trong phạm vi từ 1 đến nk . Điều này có nghĩa là chúng ta đang xét tất cả các ô trong
bảng.
• xi,j,qaccept : Biến Boolean này biểu thị rằng ô (i, j) chứa ký hiệu qaccept , tức là trạng thái chấp
nhận.

Công thức φaccept nói rằng tồn tại ít nhất một ô (i, j) trong bảng mà biến xi,j,qaccept là True. Điều
này đảm bảo rằng trạng thái chấp nhận qaccept xuất hiện ít nhất một lần trong bảng, nghĩa là có
ít nhất một cấu hình chấp nhận trong quá trình tính toán.
Tóm lại, φaccept đảm bảo rằng trạng thái chấp nhận qaccept xuất hiện trong bảng bằng cách yêu
cầu rằng ít nhất một trong các biến xi,j,qaccept là True.

4. Công thức φmove : Công thức φmove mã hóa các quy tắc chuyển đổi của máy Turing.
Cách Thức Hoạt Động của Máy Turing : Máy Turing là một mô hình tính toán lý thuyết bao
gồm một băng vô hạn, trên đó có các ô có thể ghi các ký tự từ một bảng chữ cái hữu hạn. Có một
đầu đọc/ghi di chuyển qua lại trên băng, đọc ký tự tại vị trí hiện tại và có thể ghi đè nó. Máy được
điều khiển bởi một bộ điều khiển trạng thái hữu hạn, có thể thay đổi trạng thái của nó dựa trên
ký tự hiện tại mà đầu đọc/ghi đọc được và các quy tắc được xác định trước.
Các Điều Kiện Cần Thiết để Mô Phỏng Máy Turing :

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 18/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

• Trạng thái hiện tại của máy: Để biết máy sẽ làm gì tiếp theo, ta cần biết trạng thái hiện tại
của nó.
• Ký tự dưới đầu đọc/ghi: Đầu đọc cần biết ký tự hiện tại để quyết định hành động tiếp theo.
• Hành động tiếp theo: Bao gồm việc ghi một ký tự mới và di chuyển đầu đọc sang trái hoặc
phải.

Người ta sử dụng một cửa sổ 2x3 cho phép mô phỏng một bước hoàn chỉnh của việc chuyển đổi
giữa 2 cấu hình của máy Turing :

• cấu hình tại thời điểm t: Thể hiện một phần của băng và trạng thái của máy tại thời điểm t.
• cấu hình tại thời điểm t+1: Thể hiện cùng một phần băng và sự thay đổi trạng thái sau khi
đầu đọc thực hiện một hành động.

Việc cần làm là chúng ta sẽ mã hóa một công thức sao cho các cửa sổ 2x3 trên tableau đều ở trạng
thái hợp lệ.
Vậy thế nào là cửa sổ 2x3 hợp lệ ?
Chúng ta nói rằng một cửa sổ 2 x 3 là hợp lệ nếu cửa sổ đó không vi phạm các hành động được
xác định bởi hàm chuyển đổi của N. Nói cách khác, một cửa sổ là hợp lệ nếu nó có thể xuất hiện
khi một hàng hợp lệ theo sau một hàng hợp lệ khác.
Ví dụ, giả sử rằng a, b và c là các thành phần của tập C ( tập các kí tự trên tableau ) , và q1 và q2
là các trạng thái của N. Giả sử rằng khi ở trạng thái q1 với đầu đọc trên một ô, N ghi a thành b, ở
lại trạng thái q1 , và di chuyển sang phải; và rằng khi ở trạng thái q1 với đầu đọc trên b, N không
xác định chuyển sang q2 . Các cửa sổ hợp lệ bao gồm:

• ghi a, nhập q2 , và di chuyển sang trái, hoặc


• ghi a thành a, nhập q2 , và di chuyển sang phải.

hàm chuyển đổi trạng thái được mô tả bằng công thức như sau, δ(q1 , a) = {(q1 , b, R)} và δ(q1 , b) =
{(q2 , c, L), (q2 , a, R)}. Ví dụ về các cửa sổ hợp lệ

Hình 9: Ví dụ về các cửa sổ hợp lệ

Trong hình trên, các cửa sổ (a) và (b) là hợp lệ vì hàm chuyển cho phép N di chuyển theo cách
được chỉ định. Cửa sổ (c) là hợp lệ vì, với q1 xuất hiện ở bên phải của hàng trên cùng, chúng ta
không biết kí tự nào nằm phía sau của q1 . Ký tự đó có thể là một a hoặc b, và q1 có thể thay đổi
nó thành a hoặc b và di chuyển sang phải. Khả năng đó sẽ tạo ra cửa sổ này, nên nó không vi phạm
các quy tắc của N .
Ví dụ về các cửa sổ không hợp lệ

Hình 10: Ví dụ về các cửa sổ không hợp lệ

Cửa sổ (a) không hợp lệ vì không tuân theo hàm chuyển trạng thái của N, kí tự b ở dòng trên
không thể thay đổi vì không có một trạng thái q1 nào ở cạnh nó. Cửa sổ (b) không hợp lệ vì hàm

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 19/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

chuyển quy định rằng b nhận được thay đổi thành c chứ không phải a. Cửa sổ (c) không hợp lệ vì
hai trạng thái q2 xuất hiện trong hàng dưới.
Bây giờ chúng ta quay lại việc xây dựng φmove . Nó quy định rằng tất cả các cửa sổ trong bảng là
hợp lệ. Mỗi cửa sổ chứa sáu ô, giá trị của các ô trong cửa sổ 2x3 có thể được sắp xếp theo một số
cách để tạo ra một cửa sổ hợp lệ. Công thức φmove

^
φmove = (cửa sổ (i,j) là hợp lệ).
1≤i<nk,1≤j<nk

Cửa sổ (i,j) có ô [i, j] là vị trí ô ở giữa của hàng trên . Chúng ta thay thế phần "cửa sổ (i,j) là hợp
lệ" trong công thức này bằng công thức sau a1 , a2 , . . . , a6 .

_
(xi,j = a1 ∧ xi,j+1 = a2 ∧ xi,j+2 = a3 ∧ xi+1,j = a4 ∧ xi+1,j+1 = a5 ∧ xi+1,j+2 = a6 ).
a1 ,...,a6

Phần Công Thức Tổng Quát

^
φmove = (the (i, j)-window is legal)
1≤i<nk ,1≤j<nk

Đây là một biểu thức logic toàn phần, nói rằng mọi cửa sổ (i, j) trong bảng phải là hợp lệ. Nó sử
V
dụng toán tử logic "và" ( ) để đảm bảo rằng tất cả các điều kiện về tính hợp pháp của cửa sổ đều
được thỏa mãn. Điều này đảm bảo rằng không có cửa sổ nào trong bảng vi phạm các quy tắc đã
định trước.
Chi Tiết Công Thức Thay Thế
The (i, j)-window has cell [i, j] as the upper central position: Đây là định nghĩa vị trí của từng cửa
sổ. Ô tại vị trí (i, j) được xem là ô trung tâm phía trên của cửa sổ. Cửa sổ gồm tổng cộng sáu ô,
sắp xếp theo hình chữ nhật 2x3.
Công thức cụ thể cho tính hợp lệ của cửa sổ

_
(xi,j−1,a1 ∧ xi,j,a2 ∧ xi,j+1,a3 ∧ xi+1,j−1,a4 ∧ xi+1,j,a5 ∧ xi+1,j+1,a6 )
a1 ,...,a6

Công thức này xác định một cửa sổ là hợp lệ nếu có ít nhất một tập hợp cấu hình (a1 , . . . , a6 ) sao
W
cho các điều kiện được nối bởi "và" (∧) được thỏa mãn. Đây là biểu thức logic "hoặc" ( ) thể hiện
rằng chỉ cần một trong số các cấu hình của cửa sổ là hợp lệ, thì cửa sổ đó được xem là hợp pháp.
Mỗi biến xi,j,a biểu diễn trạng thái của ô tại vị trí (i, j) với giá trị a tương ứng. Công thức này
kiểm tra tất cả các cấu hình có thể của các ô trong một cửa sổ để đảm bảo rằng ít nhất một cấu
hình tuân thủ các quy tắc chuyển đổi hợp pháp.
Kết Luận
Công thức ϕmove và các biểu thức liên quan đảm bảo rằng mỗi cửa sổ trên bảng tuân theo các quy
định hợp pháp của mô hình được mô tả.

2.4.4 Một vài vấn đề NP-completeness

1. Bài toán phân hoạch số: Cho một tập những số nguyên, có thể phân hoạch chúng thành hai tập
con mà có tổng trị số bằng nhau?

2. Bài toán qui hoạch nguyên: Cho một bài toán qui hoạch tuyến tính, liệu có tồn tại một lời giải toàn
số nguyên?

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 20/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

3. Xếp lịch công việc trên đa bộ xử lý ( multiprocessor scheduling): Cho một kỳ hạn (deadline) và
một tập các công tác có chiều dài thời gian khác nhau phải được thực thi trên hai bộ xử lý. Vấn đề
là có thể sắp xếp để thực thi tất cả những công tác đó sao cho thỏa mãn kỳ hạn không?

4. Bài toán phủ đỉnh (VERTEX COVER): Cho một đồ thị và một số nguyên N, có thể kiếm được
một tập nhỏ hơn N đỉnh mà chạm hết mọi cạnh trong đồ thị ?

5. Bài toán xếp thùng (BIN PACKING): cho n món đồ mà phải đặt vào trong các thùng có sức chứa
bằng nhau L. Món đồ i đòi hỏi li đơn vị sức chứa của thùng. Mục đích là xác định số thùng ít nhất
cần để chứa tất cả n món đồ đó.

Hình 11: Mối liên hệ giữa một số bài toán thu giảm đa thức (polynomial reduction)

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 21/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

2.4.5 Một số kỹ thuật để đối phó với những bài toán NP-complete

1. Dùng “giải thuật xấp xỉ “(approximation algorithm) để tìm lời giải xấp xỉ tối ưu (near-optimal).

2. Dựa vào hiệu năng của trường hợp trung bình để phát triển một giải thuật mà tìm ra lời giải trong
một số trường hợp nào đó, mặc dù không làm việc được trong mọi trường hợp.

3. Sử dụng những giải thuật có độ phức tạp hàm mũ nhưng hữu hiệu, ví dụ như giải thuật quay lui.

4. Đưa heuristic vào giải thuật để tăng thêm hiệu quả của giải thuật : Heuristic là tri thức về bài
toán cụ thể được sử dụng để dẫn dắt quá trình tìm ra lời giải của giải thuật. Nhờ sự thêm vào các
heuristic mà giải thuật trở nên hữu hiệu hơn.

5. Sử dụng metaheuristic.

(a) Meta heuristic là loại heuristic tổng quát có thể áp dụng cho nhiều lớp bài tóan.
(b) Gần đây meta heuristic là một lãnh vực nghiên cứu phát triển mạnh mẽ, với sự ra đời của
nhiều meta heuristic như:
i. giải thuật di truyền (genetic algorithm)
ii. giải thuật mô phỏng luyện kim (simulated annealing)
iii. tìm kiếm tabu (Tabu search)

• Giải thuật xấp xỉ (Approximation algorithms): Vì các bài toán NP-complete không thể giải
một cách hiệu quả trong thời gian đa thức cho tất cả các trường hợp, giải thuật xấp xỉ cung cấp
một cách tiếp cận thực tế khi chấp nhận một lời giải gần đúng thay vì chính xác tuyệt đối. Chúng
cho phép đạt được lời giải "gần tối ưu" với sai số có thể chấp nhận được, trong một khoảng thời
gian ngắn hơn nhiều so với việc tìm kiếm lời giải chính xác.

• Giải thuật quay lui (Backtracking): Giải thuật này cho phép giải các bài toán quyết định bằng
cách thử từng lựa chọn một và loại bỏ những lựa chọn không hợp lệ sớm nhất có thể. Điều này
giúp giảm không gian tìm kiếm đáng kể và là một phương pháp hữu ích cho các bài toán có kích
thước nhỏ hơn hoặc khi các bài toán có cấu trúc đặc biệt phù hợp.

• Heuristic và Metaheuristic: Các giải thuật heuristic không tìm kiếm lời giải chính xác mà tập
trung vào việc tìm lời giải khả thi trong thời gian ngắn. Heuristic thường dựa trên kinh nghiệm
hoặc trực giác để giải quyết vấn đề. Metaheuristic là một bộ lớn hơn của heuristic, được thiết kế
để áp dụng cho nhiều lớp bài toán khác nhau và không bị giới hạn trong một cấu trúc vấn đề cụ
thể. Chúng bao gồm các giải thuật như di truyền, mô phỏng luyện kim, và tìm kiếm tabu, đều là
các phương pháp mạnh mẽ để tìm kiếm lời giải trong không gian lớn.

Tất cả các kỹ thuật này không chỉ giúp giải quyết các bài toán một cách nhanh chóng mà còn đảm
bảo rằng kết quả cuối cùng, dù không phải là tối ưu hoàn hảo, nhưng vẫn nằm trong khoảng chấp nhận
được so với lời giải tối ưu. Chúng đặc biệt hữu ích trong thực tế khi đối mặt với các bài toán có quy mô
lớn hoặc đòi hỏi giải quyết trong thời gian có hạn.

2.5 Lớp những bài toán bất khả giải quyết


• Không thể giải quyết: Không có thuật toán nào có thể trả lời một cách chính xác cho các bài toán
bất khả giải quyết.

• Không thể chứng minh tính đúng sai: Không thể sử dụng phép chứng minh toán học để chứng minh
tính đúng hoặc sai của một giải pháp cho bài toán bất khả giải quyết.

Thí dụ: Bài toán quyết định xem một chương trình có dừng trên một máy Turing :
Vấn đề dừng lại là một khái niệm cơ bản trong khoa học máy tính đã được Alan Turing định lý vào năm
1936. Nó lý giải rằng không có thuật toán nào có thể xác định, đối với một chương trình và đầu vào cụ

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 22/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

thể, liệu chương trình đó sẽ kết thúc (dừng lại) hay tiếp tục chạy vô hạn.
Giả định :
Giả sử có một thuật toán A mà có thể giải quyết vấn đề này. Nghĩa là, cho một chương trình P và một
đầu vào I, thuật toán A sẽ trả lời:

• Trả lời 1 nếu chương trình P dừng lại trên đầu vào I.

• Trả lời 0 nếu chương trình P không dừng lại trên đầu vào I.

Xây dựng Chương trình :


Sử dụng thuật toán A, chúng ta tạo ra một chương trình mới Q như sau:

• Q sẽ kiểm tra xem chính nó khi chạy với đầu vào là chính nó có dừng lại hay không, bằng cách sử
dụng thuật toán A.

• Nếu A(Q, Q) = 0 (tức là Q không dừng khi chạy với chính nó), thì Q sẽ dừng lại.

• Nếu A(Q, Q) = 1 (tức là Q dừng khi chạy với chính nó), thì Q sẽ không dừng lại.

Mâu thuẫn :
Khi chạy chương trình Q với đầu vào là chính nó:

• Nếu A(Q, Q) = 0 (nghĩa là theo thuật toán A, Q không dừng khi chạy với chính nó), thì theo định
nghĩa của Q, nó lại phải dừng lại. Điều này tạo ra mâu thuẫn vì Q không thể vừa không dừng vừa
dừng lại cùng một lúc.

• Ngược lại, nếu A(Q, Q) = 1 (nghĩa là theo thuật toán A, Q dừng khi chạy với chính nó), thì theo
định nghĩa của Q, nó lại không được phép dừng lại. Điều này cũng tạo ra mâu thuẫn vì Q không
thể vừa dừng vừa không dừng lại cùng một lúc.

Kết luận Do sự tồn tại của mâu thuẫn trên, giả định ban đầu rằng có một thuật toán A có thể xác
định liệu một chương trình có dừng lại trên một đầu vào nhất định hay không là sai. Do đó, vấn đề dừng
lại được kết luận là không thể giải quyết được, tức là không tồn tại một thuật toán nào có thể chính xác
quyết định mọi trường hợp của vấn đề này.

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 23/24
Trường Đại Học Công nghệ thông tin
Khoa Khoa Học Máy tính

Lời kết
Qua đồ án cuối kì của học kỳ này, em không chỉ tích lũy được thêm các kinh nghiệm học thuật khi
thực hiện các nội dung mà cô đưa ra, mà còn luyện tập được khả năng giao tiếp, làm việc, tra cứu một
cách hiệu quả, năng suất.
Tuy vậy, trong quá trình thực hiện đồ án, khó tránh khỏi các sai sót, ở điểm này em rất mong cô xem
xét bỏ qua. Đồng thời, do trình độ lý luận cũng như kinh nghiệm thực tiễn còn hạn chế nên bài báo cáo
không thể tránh khỏi những thiếu sót, em rất mong nhận được ý kiến đóng góp từ cô để em có thể tích
lũy được thêm nhiều kinh nghiệm và sẽ hoàn thành tốt hơn trong các đồ án sắp tới.
Để kết thúc đồ án cuối kì này, em xin một lần cuối cùng gửi lời cảm ơn chân thành nhất đến cô, các
anh chị, các bạn sinh viên trong cộng đồng sinh viên Đại học Quốc Gia - TP.HCM nói chung và sinh
viên Đại học Công nghệ thông tin nói riêng đã giúp em hoàn thành tốt đẹp toàn bộ đồ án của bộ môn
Phân tích và thiết kế thuật toán của học kỳ này.

Tài liệu
[1] Computers and Intractability ( Michael Garey and David S. Johnson )

[2] Introduction to the theory of Computation - Michael Sipser

[3] Computational Complexity: A Modern Approach ( Sanjeev Arora and Boaz Barak )

[4] NP-complete - Havard University : https://people.seas.harvard.edu/ cs125/fall16/lec14.pdf

[5] Complexity: P, NP, NP-completeness, Reductions - MIT : https://ocw.mit.edu/courses/6-


046j-design-and-analysis-of-algorithms-spring-2015/resources/lecture-16-complexity-p-np-np-
completeness-reductions/

[6] CSC 320 Notes: SAT, the First NP-complete Problem : https://webhome.cs.uvic.ca/ wendym/cours-
es/320/17/npcomplete/2notes.html

Đồ án cuối kì Phân tích thiết kế giải thuật (CS112) - Niên khóa 2023-2024 Trang 24/24

You might also like