Dưới dạng một bài toán thì một vấn đề sẽ gồm có đầu vào và đầu ra, trong đó đầu vào mô tả không gian các giá trị có thể có của bài toán và đầu ra là giá trị mong muốn tương ứng với đầu v
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI -
NGUYỄN DUY HIỆP
ỨNG DỤNG THUẬT TOÁN LAI
GIẢI BÀI TOÁN CÂY KHUNG TRUYỀN THÔNG TỐI ƯU
Trang 2~ 1 ~
Lời cảm ơn
Đầu tiên tôi xin bày tỏ sự biết ơn sâu sắc PGS TS Nguyễn Đức Nghĩa, thầy đã tận
tình giảng dạy chúng tôi các môn học chuyên ngành và nhiệt tình hướng dẫn, giúp
đỡ tôi hoàn thành luận văn này
Tôi cũng muốn bày tỏ lòng biết ơn các thầy cô khoa Công nghệ Thông tin trường Đại học Bách khoa Hà Nội đã giảng dạy cho chúng tôi các môn học chuyên đề trong khóa học
Cuối cùng tôi xin gửi lời cảm ơn sâu sắc đến gia đình, và bạn bè, những người luôn
ở bên cạnh giúp đỡ, động viên tôi trong quá trình hoàn thành đồ án
Mặc dù đã có nhiều cố gắng, nhưng vì kiến thức và thời gian hạn chế nên chắc chắn luận văn này còn nhiều thiếu sót Tôi xin chân thành cảm ơn và rất mong nhận được những ý kiến đóng góp từ các thầy cô và các bạn Những góp ý xin gửi về địa chỉ:
Nguyễn Duy Hiệp
Bộ môn Khoa học máy tính, viện Công nghệ thông tin và truyền thông, trường Đại học Bách Khoa Hà Nội
Email: hiepnd@soict.hut.edu.vn hoặc
nguyenduyhiep@gmail.com
Hà Nội, ngày 31 tháng 10 năm 2010
Nguyễn Duy Hiệp Học viên cao học Lớp Công nghệ thông tin 2008 – 2010 Trường Đại học Bách Khoa Hà Nội
Trang 3~ 2 ~
Lời mở đầu
Việc phát triển các thuật toán hiệu quả để giải các bài toán NP – khó (NP – hard) là một vấn đề được quan tâm của nhiều nhà khoa học nghiên cứu về máy tính Bởi vì chúng thường có rất nhiều ứng dụng trong thực tiễn, ví dụ như bài toán người du lịch, bài toán đóng thùng, bài toán cây Steiner, bài toán người đưa thư Trung Hoa,
… Đối với các bài toán này các thuật toán giải chính xác thường có thời gian tính lớn do độ phức tăng rất nhanh khi kích thước bài toán tăng Do đó hiện nay người ta thường sử dụng cách tiếp cận giải gần đúng Các phương pháp giải gần đúng thường dùng là: các thuật toán xấp xỉ (approximation schemes), tìm kiếm cục bộ (local search), các phương pháp xác xuất (probabilistic methods), tính toán tiến hóa (evolutionary computation), thuật toán di truyền (genetic algorithm), …
Luận văn này tập trung vào xây dựng thuật toán di truyền lai để giải bài toán cây
khung truyền thông tối ưu (Optimal Communication Spanning Tree - OCST) Đây
là một trong những bài toán trên đồ thị thuộc lớp NP-khó, và có ứng dụng trong nhiều lĩnh vực thực tế như thiết kế vi mạch và các mô hình mạng
Thuật toán đề xuất đã được chạy thử nghiệm trên các bộ dữ liệu thường dùng bởi các nhà khoa học để đánh giá các thuật toán giải bài toán OCST, và một số bộ dữ liệu có kích thước lớn được sinh ngẫu nhiên Kết quả thực nghiệm cho thấy thuật toán cho kết quả là tốt hơn so với một số một số thuật toán di truyền tốt nhất hiện biết Những kết quả đạt được được trình bày thành một bài báo và đã được chấp nhận đăng trong hội thảo quốc tế lần thứ 26 về tính toán ứng dụng (Symposium On Applied Computing – SAC) diễn ra vào 21-24/3/2011 tại đại học Tunghai, TaiChung, Taiwan
Luận văn được bố cục như sau :
Chương 1 trình bày một số kiến thức cơ sở trong lý thuyết về độ phức tạp tính toán,
lớp bài toán NP-khó làm nền tảng cho các chương tiếp theo
Trang 4~ 3 ~
Chương 2 trình bày tổng quan về bài toán cây khung truyền thông tối ưu và các
hướng tiếp cận đã được đề xuất để giải quyết bài toán
Chương 3 trình bày sơ đồ của hai giải thuật meta-heuristic gồm giải thuật di truyền
và giải thuật tối ưu hóa bày đàn
Chương 4 đề xuất giải thuật di truyền lai dựa trên giải thuật di truyền chuẩn kết hợp
với giải thuật tối ưu hóa bày đàn để giải bài toán cây khung truyền thông tối ưu
Chương 5 trình bày kết quả thực nghiệm của giải thuật di truyền lai đề xuất trong
chương 4 Giải thuật được thực hiện với sáu loại mã hóa cây khung và hai phương pháp lai ghép nhằm so sánh hiệu quả so với các giải thuật hiện biết
Kết luận và hướng phát triển
Đánh giá tổng quan lại những kết quả đã thực hiện được, những hạn chế của luận văn và một số vấn đề mở cần tiếp tục giải quyết
Trang 5~ 4 ~
Mục lục
Lời cảm ơn 1
Lời mở đầu 2
Danh mục hình vẽ 7
Danh mục bảng 10
Danh mục thuật ngữ tiếng Anh 11
CHƯƠNG 1 CÁC KHÁI NIỆM CƠ BẢN 13
1.1 Thuật toán và đánh giá độ phức tạp của thuật toán 13
1.1.1 Khái niệm thuật toán 13
1.1.2 Đánh giá thuật toán 19
1.2 Độ phức tạp tính toán của bài toán 24
1.2.1 Khái niệm về độ phức tạp của bài toán 24
1.2.2 Các bài toán NP 27
1.3 Một số cách tiếp cận giải các bài toán NP-khó 36
1.3.1 Phương pháp xấp xỉ 36
1.3.2 Phương pháp xác xuất 37
1.3.3 Phương pháp heuristic 38
1.3.4 Phương pháp tính toán tiến hóa 40
CHƯƠNG 2 BÀI TOÁN CÂY KHUNG TRUYỀN THÔNG TỐI ƯU 46
2.1 Bài toán cây khung truyền thông tối ưu 46
2.2 Một số tính chất của các trường hợp đặc biệt của bài toán OCST 49
2.2.1 Bài toán MRCT 49
2.2.2 Bài toán cây khung truyền thông tối ưu tích nhu cầu (PROCT) 51
2.2.3 Bài toán cây khung truyền thông tối ưu tổng nhu cầu (SROCT) 52
2.2.4 Bài toán nhiều nguồn (Multiple Source) 52
2.3 Một số ứng dụng của bài toán cây khung truyền thông 54
Trang 6~ 5 ~
2.4 Các phương pháp tiếp cận để giải bài toán OCST 57
CHƯƠNG 3 THUẬT TOÁN DI TRUYỀN VÀ TỐI ƯU HÓA BẦY ĐÀN ……… 67
3.1 Tính toán tiến hóa 67
3.2 Giải thuật di truyền 69
3.3 Giải thuật tối ưu hóa bầy đàn 74
CHƯƠNG 4 GIẢI THUẬT DI TRUYỀN LAI GIẢI BÀI TOÁN OCST 79
4.1 Mô hình lai ghép đề xuất 79
4.2 Sơ đồ giải thuật đề xuất 80
4.3 Mã hóa cá thể 83
4.3.1 Mã hóa Prufer 83
4.3.2 Mã hóa NetKeys (Network Random Keys Encoding) 85
4.3.3 Mã hóa CB-TCR 87
4.3.4 Mã hóa NB (Node Biased Encoding) 90
4.3.5 Mã hóa LB (Link Biased Encoding) 91
4.3.6 Mã hóa LNB (Link and Node Biased Encoding) 92
4.4 Chọn lọc cá thể 94
4.5 Toán tử di truyền 95
4.5.1 Toán tử lai ghép 95
4.5.2 Toán tử đột biến 96
CHƯƠNG 5 KẾT QUẢ THỰC NGHIỆM 97
5.1 Cài đặt thử nghiệm 97
5.1.1 Dữ liệu thực nghiệm 97
5.1.2 Các tham số cho các thử nghiệm 99
5.2 Kết quả thực nghiệm 100
5.2.1 Kết quả trên các bộ test chuẩn 100
5.2.2 Kết quả trên các bộ test ngẫu nhiên 107
Trang 7~ 6 ~
5.3 So sánh với các thuật toán khác 108
5.3.1 So sánh với giải thuật tiến hóa (Sang-moon 2006) 109
5.3.2 So sánh với giải thuật di truyền, mô phỏng tôi luyện, tìm kiếm cục bộ (Rothlauf 2009) 111
5.3.3 So sánh với giải thuật tối ưu hóa bầy đàn (2010) 113
KẾT LUẬN 115
TÀI LIỆU THAM KHẢO 117
Trang 8~ 7 ~
Danh mục hình vẽ
Hình 1-1 Minh họa thuật toán 15
Hình 1-2 Minh họa bài toán chọn lịch xem phim 17
Hình 1-3 Phản ví dụ của thuật toán 1 17
Hình 1-4 Phản ví dụ của thuật toán 2 17
Hình 1-5 Cận trên và cận dưới để đánh giá cho độ phức tạp của hàm 20
Hình 1-6 Ký hiệu -lớn 21
Hình 1-7 Ký hiệu -lớn 21
Hình 1-8 Ký hiệu -lớn 22
Hình 1-9 Tốc độ tăng theo kích thước đầu vào của một số hàm 23
Hình 1-10 Mối quan hệ giữa thời gian thực hiện và kích thước đầu vào của một số lớp hàm 24
Hình 1-11 Mối quan hệ giữa 3 lớp bài toán P, NP và Co-NP 32
Hình 1-12 Sơ đồ phép quy dẫn 32
Hình 1-13 Minh họa mối quan hệ giữa các lớp bài toán 35
Hình 1-14 Danh sách một số bài toán NP-khó và sơ đồ quy dẫn giữa chúng 35
Hình 1-15 Đồ thị vô hướng và đồ thị có hướng 41
Hình 1-16 Danh sách kề và ma trận kề 44
Hình 2-1 Minh họa cách tính giá cây khung trong bài toán OCST 47
Hình 2-2 Minh họa bài toán SROCT và PROCT 48
Hình 2-3 Các biến thể của bài toán cây khung truyền thông tối ưu tổng quát 49
Hình 2-4 Minh họa cách tính độ trễ của cặp đỉnh 50
Hình 2-5 Một cây khung 3-star, trong đó B,C,E là các nút trong và A,D,E,F,G,H,I là các nút lá 51
Hình 2-6 Cây khung 1-star, với B là nút trong và các nút còn lại là nút lá 51
Hình 2-7 Thiết kế mạng truyền thông 56
Hình 2-8 Thủ tục xây dựng cây – tree building 60
Trang 9~ 8 ~
Hình 2-9 Thủ tục cải tiến cây – tree improvement 61
Hình 2-10 Cấu trúc của thuật toán Memetic 64
Hình 3-1 Mô hình một thuật toán tiến hóa 68
Hình 3-2 Minh họa Allele, Gen và nhiễm sắc thể 69
Hình 3-3 Sơ đồ chung của thuật toán di truyền 71
Hình 3-4 Bài toán tối ưu có thể có rất nhiều cực trị 73
Hình 3-5 Mô tả giải thuật PSO 76
Hình 3-6 Mô tả giải thuật PSO 78
Hình 4-1 Sơ đồ giải thuật di truyền lai đề xuất 82
Hình 4-2 Giải thuật mã hóa cây khung thành chuỗi Prufer 83
Hình 4-3 Cây khung được mã hóa bởi chuỗi Prufer 2565 84
Hình 4-4 Giải thuật giải mã cây khung từ một chuỗi Prufer 85
Hình 4-5 Giải thuật xây dựng cây khung từ chuỗi NetKeys 86
Hình 4-6 Cây thu được theo mã hóa NetKeys 87
Hình 4-7 Giải thuật xây dựng cây khung từ một chuỗi CB-TCR 88
Hình 4-8 Đồ thị minh họa cho mã hóa CB-TCR 89
Hình 4-9 Cây khung sinh ra từ chuỗi CB-TCR (1,5,2,1,4,3,2,5) 90
Hình 4-10 Giải thuật Prim 91
Hình 4-11 Cây khung thu được từ mã hóa LNB 94
Hình 4-12 Mô tả phương pháp chọn lọc theo vòng quay Roulette 94
Hình 4-13 Các bước trong phương pháp chọn lọc theo vòng quay Roulette 95
Hình 4-14 Minh họa phương pháp lai ghép một điểm cắt 95
Hình 4-15 Minh họa phương pháp lai ghép đồng bộ 96
Hình 5-1 So sánh tốc độ hội tụ khi sử dụng hai mã hóa CB-TCR và NB 105
Hình 5-2 So sánh kết quả tìm được bởi hai toán tử lai ghép trên bộ Raidl100 106
Trang 10~ 9 ~
Hình 5-3 So sánh tốc độ hội tụ của giải thuật với hai loại lai ghép trên bộ Raidl100 106Hình 5-4 So sánh tốc độ hội tụ của giải thuật trên bộ test NE-RAND-200 107Hình 5-5 So sánh tốc độ hội tụ của giải thuật trên bộ test E-RAND-200 108
Trang 11~ 10 ~
Danh mục bảng
Bảng 1-1 Mối tương quan giữa quá trình tiến hóa và tính toán tiến hóa 40
Bảng 2-1 Các bài toán OCT và tỉ lệ xấp xỉ tốt nhất hiện biết của nó 54
Bảng 4-1 Chuỗi NetKeys cùng nhãn của các cạnh trong đồ thị 86
Bảng 5-1 Các bộ test chuẩn 98
Bảng 5-2 Kết quả chạy các bộ test chuẩn sử dụng mã hóa Prufer và CB-TCR 101
Bảng 5-3 Kết quả chạy các bộ test chuẩn sử dụng mã hóa NetKeys và NB 102
Bảng 5-4 Kết quả chạy trên các bộ test chuẩn sử dụng mã hóa LNB và LB 103
Bảng 5-5 So sánh về độ lệch của kết quả tìm được so với kết quả đã biết 109
Bảng 5-6 So sánh thời gian tìm ra kết quả tốt nhất 110
Bảng 5-7 So sánh số lượng thế hệ tối thiểu để tìm ra kết quả tốt nhất 111
Bảng 5-8 So sánh với một số giải thuật meta-heuristic 112
Bảng 5-9 So sánh với giải thuật tối ưu hóa bầy đàn 114
Trang 12~ 11 ~
Danh mục thuật ngữ tiếng Anh
STT Thuật ngữ Viết tắt Đề nghị dịch tiếng Việt
8
Relative performance ration Đảm bảo về tỷ số chênh lệch
tương đối
9 Absolute performance guarantee Đảm bảo về sai số tuyệt đối
10 Polynomial time approximation
Trang 1326 Uniform order-based crossover Lai ghép đồng bộ theo thứ tự
27 Optimal Communication
Cây khung truyền thông tối
29 Optimal Product Requirement
Communication Spanning Tree PROCT
Cây khung truyền thông tích nhu cầu
30 Optimal Sum Requirement
Communication Spanning Tree SROCT
Cây khung truyền thông tổng nhu cầu
32 Minimum Average Stretch
Cây khung tối thiểu khoảng giãn
33 Particle Swarm Optimization PSO Tối ưu hóa bầy đàn
Trang 14~ 13 ~
CHƯƠNG 1
CÁC KHÁI NIỆM CƠ BẢN
Chương này trình bày tổng quan về các khái niệm và các thuật ngữ cơ sở được sử dụng trong luận văn Các khái niệm và thuật ngữ được trình bày dựa trên các tài liệu [10] [22] [23] [32] [38]
1.1 Thuật toán và đánh giá độ phức tạp của thuật toán
1.1.1 Khái niệm thuật toán
Ngày nay máy tính đã trở thành một công cụ sản xuất quan trọng, một thiết bị không thể thiếu trong bất cứ lĩnh vực nào Nó được sử dụng để trực tiếp giải quyết, hoặc để hỗ trợ con người trong việc giải quyết các vấn đề trong thực tế Do vậy việc nghiên cứu lý thuyết về khoa học máy tính và các vấn đề về giải quyết bài toán bằng máy tính ngày càng quan trọng và được phát triển mạnh mẽ
Các vấn đề xuất phát từ trong thực tế hằng ngày rất đa dạng, có thể là các vấn đề đơn giản cũng có thể là các vấn đề mà không thể giải quyết được Nhưng cho dù vấn đề là gì đi nữa để giải quyết nó bao giờ cũng vậy, trước hết chúng ta cần phát biểu lại vấn đề đó một cách chính xác dưới dạng các bài toán Dưới dạng một bài toán thì một vấn đề sẽ gồm có đầu vào và đầu ra, trong đó đầu vào mô tả không gian các giá trị có thể có của bài toán và đầu ra là giá trị mong muốn tương ứng với đầu vào đó
Ví dụ: bài toán sắp xếp được định nghĩa như sau
Đầu vào: một dãy gồm khóa
Đầu ra: một hoán vị của dãy khóa đầu vào thỏa mãn
Trang 15~ 14 ~
Như vậy dãy đầu vào có thể là dãy số bất kỳ, hoặc có thể là dãy các xâu ký tự, hoặc
là dãy các đối tượng…
Ở đây chúng ta chỉ đề cập đến việc giải quyết bài toán bằng máy tính Để giải quyết bài toán bằng máy tính trước hết chúng ta phải biểu diễn được bài toán đó trên máy tính, tức là biểu diễn được đầu vào và đầu ra của nó Trong máy tính tất cả các dữ liệu và câu lệnh đều được biểu diễn dưới dạng mã nhị phân (biểu diễn bằng các chuỗi nhị phân gồm bit 1 và 0)
Ví dụ:
Một số nguyên được biểu diễn dưới dạng chuỗi bit sử dụng mã bù 2 (nếu là kiểu số nguyên có dấu) hoặc là sử dụng số trong hệ nhị phân tương ứng (nếu
là số nguyên không dấu)
Một số thực được biểu diễn trong máy tính dưới dạng chuỗi bit nhị phân sử dụng chuẩn IEEE-754
Một kí tự được biểu diễn bằng số thứ tự (dưới dạng mã nhị phân) của nó trong bảng mã nào đó như bảng mã ASCII, Unicode …
Một xâu kí tự được biểu diễn là ghép nối biểu diễn của các kí tự thành phần của xâu đó
Một vector được biểu diễn là ghép nối biểu diễn nhị phân (mảng – array) của
các thành phần tọa độ của các chiều
Một ma trận được biểu diễn bởi ghép nối các biểu diễn của các vector thành phần hoặc ma trận thành phần cấp thấp hơn nó một đơn vị
Một hệ phương trình tuyến tính dạng có thể biểu diễn dưới dạng nhị phân là ghép nối của các xâu biểu diễn nhị phân của các thành phần trong
ma trận A và vector b
Đa thức một biến dạng được đặc trưng bởi dãy các hệ số , ,…, và số mũ Do đó có thể dùng các xâu nhị phân
Trang 16~ 15 ~
biểu diễn dãy hệ số và xâu nhị phân biểu diễn là ta có thể tạo thành một
biểu diễn hợp lệ cho P(x)
Đồ thị có thể được biểu diễn bằng ma trận kề, hoặc danh sách kề
Các dữ liệu phức hợp được tổ chức dưới dạng tổ hợp cấu trúc của các dữ liệu
cơ bản, ví dụ như mảng, bản ghi, cây …
Như vậy chúng ta có thể định nghĩa một cách hình thức bài toán tính toán như sau:
Định nghĩa 1.1 Bài toán tính toán F là ánh xạ từ các xâu nhị phân độ dài hữu hạn
vào tập các xâu nhị phân độ dài hữu hạn: F: {0,1}* → {0,1}*
Các dữ liệu trong bài toán tổng quát có thể không hữu hạn, tuy nhiên khi đã chuyển vào trong máy tính thì chúng ta phải chuyển nó thành hữu hạn, bởi vì không gian của máy tính là hữu hạn Nói một cách khác các xâu nhị phân biểu diễn bài toán có
độ dài là hữu hạn
Để giải quyết bài toán (vấn đề trong thực tế) chúng ta phải đề xuất ra một phương
án Trong giải quyết bài toán bằng máy tính phương án được gọi là thuật toán (algorithm) Một thuật toán để giải quyết bài toán có thể được định nghĩa như sau
Định nghĩa 1.2 Thuật toán giải bài toán đặt ra là một thủ tục xác định bao gồm một
dãy hữu hạn các bước cần thực hiện để thu được đầu ra cho một đầu vào cho trước của bài toán
Thuật toán (Algorithm)
Đầu vào (Input)
Đầu ra (Output)
Hình 1-1 Minh họa thuật toán
Thuật toán có những đặc trưng sau đây:
Có đầu vào (Input): là tập các dữ liệu cần cung cấp cho thuật toán để xử lý
Trang 17~ 16 ~
Có đầu ra (Output): với mỗi một bộ dữ liệu vào, thuật toán sẽ cho ra một bộ
các dữ liệu ra tương ứng với lời giải của bài toán cho bộ dữ liệu vào
Chính xác (Precision): Các bước của thuật toán cần phải được mô tả chính
xác và rõ ràng để có thể cài đặt được trên máy tính và có thể thực hiện được
Hữu hạn (Finiteness): với mọi đầu vào thuật toán phải đưa được đầu ra sau
một số hữu hạn (có thể rất lớn) bước thực hiện
Đơn trị (Uniqueness): các kết quả trung gian trong quá trình thực hiện thuật
toán được xác định một cách đơn trị và chỉ phụ thuộc vào đầu vào cũng như kết quả ở những bước trước
Tổng quát (Generality): thuật toán có thể áp dụng để giải mọi bài toán có
Đầu vào: Một tập L gồm thời gian chiếu (thời điểm bắt đầu và kết thúc) trong ngày của bộ phim
Đầu ra: Tập con của L chứa số bộ phim lớn nhất có thể xem (không được giao nhau
về thời gian)
Để đơn giản có thể biểu diễn các bộ phim dưới dạng các đoạn thẳng không giao nhau như hình bên dưới Trong đó P1, P2, và P3 là các phòng chiếu
Trang 18~ 17 ~
P1 P2 P3
Hình 1-2 Minh họa bài toán chọn lịch xem phim
Thuật toán 1 Chọn bộ phim có thời điểm bắt đầu sớm nhất trong L mà có thời gian không bị giao với các bộ phim đã chọn trước đó Lặp lại cho đến khi không thể chọn thêm
Với thuật toán này ta có thể đưa ra một ví dụ chỉ ra thuật toán (phản ví dụ) sai như sau
P1 P2
Hình 1-3 Phản ví dụ của thuật toán 1
Thuật toán 2 Chọn bộ phim có thời gian chiếu ngắn nhất trong L mà có thời gian không bị giao với các bộ phim đã chọn trước Lặp lại cho đến khi không chọn thêm được
Với thuật toán 2 ta có thể chỉ ra một phản ví dụ
P1 P2
Hình 1-4 Phản ví dụ của thuật toán 2
Thuật toán 3 Duyệt toàn bộ: duyệt tập con của n bộ phim trong L Chọn ra tập con nào có số lượng phần tử lớn nhất Đảm bảo thu được kết quả tối ưu Thuật toán chạy rất chậm, vd số tập con là 220
Trang 19~ 18 ~
Thuật toán 4 Thuật toán tối ưu: sắp xếp các lịch chiếu phim theo thứ tự không giảm thời điểm kết thúc Lần lượt xem xét các phim trong danh sách đã sắp xếp, bổ sung vào danh sách xem bộ phim đang xét nếu nó không chồng lên các bộ phim đã có trong danh sách xem
Để chỉ ra thuật toán là không chính xác ta chỉ cần đưa ra một phản ví dụ của thuật toán Tuy nhiên chưa chỉ ra được một phản ví dụ của thuật toán không có nghĩa là thuật toán chính xác Để chứng minh một thuật toán là chính xác ta phải chứng minh bằng toán học Có những bài toán mà không tồn tại thuật toán chính xác để giải!
Với một bài toán có thể tồn tại rất nhiều thuật toán để giải, mỗi thuật toán nó cần sử dụng lượng tài nguyên máy tính khác nhau Chúng ta đánh giá hiệu quả của thuật toán thông qua lượng tài nguyên mà nó cần để tìm ra lời giải cho bài toán Tất nhiên
là chúng ta chỉ đánh giá hiệu quả của những thuật toán chính xác Các tài nguyên máy tính mà chúng ta xét đến ở đây là thời gian CPU (để thực hiện thuật toán thì CPU cần thực hiện lệnh của nó), dung lượng bộ nhớ cần dùng, và các tài nguyên khác như ổ cứng, mạng,… Trong đó thời gian CPU và bộ nhớ là hai tài nguyên quan trọng nhất Ngày nay với sự phát triển mạnh của công nghệ bán dẫn nên giá thành bộ nhớ máy tính giảm nhanh chóng, vì thế tài nguyên thời gian CPU được đánh giá quan trọng hơn Mặc dù công nghệ chế tạo CPU cũng phát triển rất nhanh Theo định luật Moore ―máy tính sẽ tăng gấp đôi khả năng tính toán với cùng mức giá hoặc giảm giá chỉ còn một nửa với cùng khả năng tính toán cứ sau 18 tháng‖ Tuy nhiên khi thực hiện trên đầu vào với kích thước đủ lớn thì thuật toán hiệu quả hơn dù được thực hiện trên máy tính tốc độ chậm vẫn luôn chiến thắng thuật toán tồi hơn nhưng được thực hiện trên máy tính có tốc độ nhanh hơn Vì thế để đánh giá hiệu quả của các thuật toán người ta thường căn cứ vào thời gian thực hiện của thuật toán
Trang 20~ 19 ~
1.1.2 Đánh giá thuật toán
Một vấn đề được đặt ra ở đây là thời gian thực hiện thuật toán trên máy tính phụ thuộc vào rất nhiều yếu tố như tốc độ CPU, bộ nhớ, thời điểm chạy chương trình
do đó không thể đánh giá thời gian thực hiện thuật toán bằng thời gian trên máy tính, và cũng không thể dùng thời gian này để so sánh hiệu quả của các thuật toán được Có hai mô hình đánh giá thời gian thuật toán hay sử dụng trong thực tế là mô hình RAM và O-lớn
Mô hình RAM: Thực hiện thuật toán trên một máy tính giả định gọi là Random
Access Machine hoặc RAM
Mỗi phép tính đơn giản (+, *, –, =, if, call) thực hiện trong 1 đơn vị thời gian (hoặc 1 bước)
Vòng lặp, hàm, thủ tục: là kết hợp của nhiều phép tính đơn lẻ
Mỗi bước truy cập bộ nhớ mất 1 đơn vị thời gian
Luôn có đủ bộ nhớ cần thiết để thực hiện thuật toán
Thời gian thực hiện của thuật toán phụ thuộc vào đầu vào của bài toán Các trường hợp đầu vào khác nhau thời gian thực hiện khác nhau Khi đánh giá thời gian thực hiện thuật toán, người ta chia thành 3 loại là
Độ phức tạp trong trường hợp tồi nhất (worst-case complexity): Là số lượng bước lớn nhất thuật toán cần thực hiện với bất cứ đầu vào kích thước nào
Độ phức tạp trong trường hợp tốt nhất (best-case complexity): Là số lượng bước nhỏ nhất thuật toán cần thực hiện với bất cứ đầu vào kích thước nào
Độ phức tạp trong trường hợp trung bình (average-case complexity): Là số lượng bước trung bình thuật toán cần thực hiện trên tất cả các trường hợp đầu vào kích thước
Trong 3 đánh giá độ phức tạp trên đánh giá trong trường hợp tồi nhất là đánh giá quan trọng nhất
Trang 21~ 20 ~
Trong mô hình RAM chúng ta đánh giá thời gian thực hiện thuật toán bằng cách đếm số đơn vị thời gian cần Ưu điểm của mô hình này là đơn giản, tuy nhiên việc đếm số đơn vị thời gian cần không phải lúc nào cũng đơn giản Trong một số trường hợp việc này gần như là không thể bởi vì hàm thời gian thực hiện là hàm có rất nhiều điểm lồi, và để xác định nó một cách chính xác ta cần phân tích rất tỉ mỉ Hơn nữa theo mô hình RAM thời gian thực hiện của thuật toán thường có dạng đa thức
Trong đó là kích thước đầu vào của dữ liệu Chúng ta nhận thấy là thời gian thực hiện thuật toán phụ thuộc rất nhiều số hạng, nhưng số hạng có số mũ cao nhất trong
đó là thành phần có yếu tố quan trọng nhất Nó quyết định chính đến tốc độ tăng thời gian thực hiện của thuật toán
Hình 1-5 Cận trên và cận dưới để đánh giá cho độ phức tạp của hàm
Phân tích O-lớn: trong mô hình phân tích này chúng ta đơn giản phân tích trong mô hình RAM, bỏ bớt những thành phần ít ảnh hưởng đến thời gian thực hiện của thuật toán khi so sánh các thuật toán với nhau
Trang 22~ 21 ~
Ví dụ trong O-lớn thì và là như nhau
Các ký hiệu tiệm cận được dùng để phân tích độ phức tạp của thuật toán trong thực tế
Kí hiệu biểu diễn tập các hàm = { : tồn tại các hằng
số dương và sao cho , với mọi .} Ta nói là cận trên tiệm cận của hay có bậc không quá
Kí hiệu biểu diễn tập các hàm = { : tồn tại các hằng
số dương và sao cho , với mọi .} Ta nói cận dưới tiệm cận của hay có bậc ít nhất là
Kí hiệu biểu diễn tập các hàm = { : tồn tại các hằng
số dương và sao cho , với mọi } Ta nói là đánh giá tiệm cận đúng của hay có bậc là
Với là các hằng số dương không phụ thuộc vào , và
Ví dụ
vì chọn thì
Hình 1-7 Ký hiệu 𝛰-lớn Hình 1-6 Ký hiệu 𝛺-lớn
Trang 23~ 22 ~
vì chọn thì khi
vì với bất kỳ hằng số c nào thì khi
vì chọn thì khi
vì với bất kỳ giá trị thì khi đủ lớn ( nếu , nếu )
vì với bất kỳ hằng số c nào thì khi
Trang 24~ 23 ~
•
Các lớp hàm thông dụng:
Hàm hằng Thời gian thực hiện là hằng số VD hàm tính tổng 2 số
Hàm loga VD tìm kiếm nhị phân
Hàm tuyến tính VD Tìm giá trị lớn nhất trong dãy số
Hàm siêu tuyến tính VD QuickSort, MergeSort
Hàm bậc hai VD Sắp xếp nổi bọt (bubble sort )
Hàm bậc ba
Hàm mũ , là hằng số >1
Hàm giai thừa
Hình 1-9 Tốc độ tăng theo kích thước đầu vào của một số hàm
Hình 1-9 và 1-10 minh họa tốc độ tăng và thời gian thực hiện của một số lớp hàm thông dụng
Mối quan hệ giữa các ký hiệu tiệm cận và các mô hình đánh giá:
Trang 25~ 24 ~
Thời gian tính là được hiểu là : ―đánh giá trong tình huống tồi nhất
là ‖ Nghĩa là thời gian tính trong tình huống tồi nhất được xác định bởi một hàm nào đó
Thời gian tính là được hiểu là : ―đánh giá trong tình huống tốt nhất
là ‖ Nghĩa là thời gian trong tình huống tốt nhất được xác định bởi một hàm nào đó
Hình 1-10 Mối quan hệ giữa thời gian thực hiện và kích thước đầu vào của một số lớp hàm
1.2 Độ phức tạp tính toán của bài toán
1.2.1 Khái niệm về độ phức tạp của bài toán
Như đã biết, đối với một bài toán có thể có nhiều thuật toán khác nhau để giải Mỗi thuật toán có độ phức tạp tính toán khác nhau Một câu hỏi được đặt ra là độ phức tạp tính toán của các thuật toán có liên quan gì đến bài toán không? Hay nói cách khác có phải bài toán nào cũng khó như nhau không? Câu trả lời là không Mỗi bài toán nó có một mức độ khó khác nhau và được đặc trưng bởi độ phức tạp tính toán của thuật toán tốt nhất trong số tất cả các thuật toán có thể để giải nó
Định nghĩa 1.3 Độ phức tạp tính toán của một bài toán là thời gian của thuật toán
tốt nhất trong số tất cả các thuật toán có thể để giải bài toán đó
Trang 26~ 25 ~
Một vấn đề được đặt ra là làm thế nào có thể xác định độ phức tạp tính toán của bài toán khi mà chúng ta còn chưa biết hết các thuật toán có thể để giải bài toán Có 2 cách để giải quyết vấn đề này
Cách thứ nhất ta tìm cách để đưa ra cận dưới cho độ phức tạp tính toán của bài toán
Còn trong cách thứ hai ta tìm cách chỉ ra rằng bài toán đang xét có mức độ khó (tức là độ phức tạp tính toán) không thua kém gì bất kì một bài toán khó nào hiện biết
Phần còn lại của mục này chúng ta đi tìm hiểu về cách tiếp cận thứ nhất, còn cách tiếp cận thứ 2 sẽ được trình bày ở mục tiếp theo
Định nghĩa 1.4 Gọi là thời gian tính của thuật toán đối với đầu vào Khi
đó, thời gian tính trong tình huống tồi nhất của thuật toán đối với dữ liệu đầu vào kích thước được định nghĩa là thời gian tính lớn nhất của thuật toán trên mọi bộ
Thông thường do tính phức tạp của bài toán cũng như các thuật toán giải nó nên không dễ dàng gì để đưa ra một đánh giá chính xác cho thời gian tính của nó Do đó thay vì đi tìm đánh giá chính xác cho độ phức tạp tính toán của một bài toán, người
ta có thể đi đánh giá cận trên và cận dưới của nó
Trang 27~ 26 ~
Định nghĩa 1.6 Nếu là một thuật toán để giải bài toán và có thời gian tính trong tình huống tồi nhất là thì rõ ràng
tức là ta có cận trên cho độ phức tạp của bài toán là
Định nghĩa 1.7 Để chỉ ra cận dưới của độ phức tạp tính toán của bài toán là
ta cần có đồng thời 2 điều kiện sau:
i Có thuật toán với thời gian tính để giải bài toán ;
ii Mọi thuật toán giải bài toán đều đòi hỏi thời gian tính trong tình huống tốt nhất là
Điều kiện ii) có thể thay bởi điều kiện
ii*) Cận dưới cho độ phức tạp tính toán của bài toán là
Ví dụ xét bài toán tìm kiếm một giá trị khóa trên danh sách gồm phần tử không có thứ tự Rõ ràng để tìm kiếm xem trong phần tử có phần tử nào có giá trị khóa bằng khóa cần tìm hay không chúng ta cần phải duyệt tất cả phần tử Vì vậy cận dưới cho bài toán này là Hơn nữa dễ thấy chỉ cần so sánh với khóa của phần tử là đủ để kiểm tra xem khóa có xuất hiện trong dãy hay không Như vậy độ phức tạp của bài toán này là
Trang 28~ 27 ~
Chúng ta thấy đánh giá cận trên của bài toán cho ta biết rằng bài toán có thể được giải bằng một thuật toán nào đó có độ phức tạp không quá Còn đánh giá cận dưới của bài toán ta muốn biết xem bài toán khó đến mức nào, tức là ta không thể giải bài toán bằng một thuật toán nào đó mà có độ phức tạp thấp hơn
1.2.2 Các bài toán NP
Như đã đề cập đến ở phần trước, để đánh giá độ phức tạp của một bài toán chúng ta
có thể đi tìm cận dưới độ phức tạp của nó, hoặc đi chứng minh rằng bài toán đang xét có độ phức tạp không thua kém bất cứ một bài toán khó nào hiện biết Nếu chúng ta chứng minh được điều đó thì bài toán đang xét sẽ được xếp vào lớp các bài toán NP-khó
Định nghĩa 1.9 Bài toán quyết định (decision problems) là bài toán mà đầu ra chỉ
có thể là ‗yes‘ hoặc ‗no‘ ( hay là đúng/sai, 0/1, chấp nhận/từ chối, accept/reject)
Đối với một bài toán quyết định, có những bộ dữ liệu vào của nó có câu trả lời (đầu
ra) là ‗yes‘ và cũng có những bộ dữ liệu vào có câu trả lời là ‗no‘ Những bộ dữ liệu vào với câu trả lời ‗yes‘ (‗no‘) sẽ được gọi là bộ dữ liệu vào ‗yes‘ (‗no‘) Và tương
tự, những bộ dữ liệu vào với câu trả lời ‗no‘ sẽ được gọi là bộ dữ liệu vào ‗no‘
Ví dụ:
Bài toán về tính nguyên tố: ―Hỏi số nguyên có là số nguyên tố hay không?‖.Với là bộ dữ liệu vào ‗yes‘, còn là bộ dữ liệu vào
‗no‘ của bài toán
Bài toán tổng con (Subset sum): ―Cho tập gồm số nguyên dương
và số nguyên dương Hỏi có thể tìm được tập con của với tổng các số trong là bằng ?‖
Trang 29~ 28 ~
Bài toán người du lịch dạng quyết định (Dec-TSP): ―Cho ma trận chi phí
và một số Hỏi rằng tồn tại hay không hành trình của người du
lịch với tổng chi phí không vượt quá ?‖
Định nghĩa 1.10 Xét bài toán tối ưu hóa
Định lý 1 Nếu bài toán quyết định tương ứng với một bài toán tối ưu có thể giải
được hiệu quả (chẳng hạn bằng thuật toán có thời gian tính đa thức) thì bài toán tối
ưu đó cũng giải được hiệu quả (bằng thuật toán thời gian tính đa thức)
Chứng minh:
Giả sử bài toán (PD) được giải bằng thuật toán A có thời gian tính với là hằng số Ta cũng giả thiết rằng là hàm nhận giá trị nguyên có cận trên và cận dưới trên miền xác định là và với Khi đó sơ đồ thuật
toán giải bài toán tối ưu (P) có thể cho như sau:
Trang 30~ 29 ~
Rõ ràng số bước lặp của thuật toán trên là Thời gian tính của mỗi bước lặp bằng thời gian tính của một lần thực hiện thuật toán giải bài toán dạng quyết định, tức là bằng Do đó thuật toán giải bài toán tối ưu (P) ở trên có
tổng thời gian tính là Vậy ta có điều phải chứng minh
Rất nhiều bài toán quyết định cùng có một đặc điểm chung là để xác nhận câu trả
lời ‗yes‘ đối với bộ dữ liệu vào ‗yes‘ của chúng, ta có thể đưa ra bằng chứng ngắn gọn dễ kiểm tra xác nhận câu trả lời ‗yes‘ cho bộ dữ liệu vào ‗yes‘ đó
Bài toán tổng con, bằng chứng xác nhận câu trả lời ‗yes‘ đối với bộ dữ liệu
là vectơ , trong đó nếu được chọn vào tập và nếu trái lại Việc kiểm tra xem tập gồm các số được chọn có thoả mãn yêu cầu đặt ra hay không, rõ ràng, có thể thực hiện sau thời gian đa thức
Bài toán người du lịch dạng quyết định, bằng chứng xác nhận câu trả lời
‗yes‘ cho ma trận chi phí { } của bài toán là dãy các thành phố trên hành trình Bằng việc cộng tổng chi phí trên các quãng đường, việc kiểm tra xem dãy các thành phố đã cho có phải là hành trình với chi phí không vượt quá có thể thực hiện xong sau thời gian đa thức
Trang 31~ 30 ~
Định nghĩa 1.11 Ta gọi bằng chứng ngắn gọn dễ kiểm tra xác nhận câu trả lời ‗yes’
cho bộ dữ liệu vào ‘yes’ của bài toán là một bằng chứng có độ dài bị chặn bởi một
đa thức bậc cố định của độ dài dữ liệu đầu vào của bài toán, và việc kiểm tra nó là
bằng chứng xác nhận câu trả lời ‘yes’ đối với đầu vào đã cho của bài toán có thể
thực hiện xong sau thời gian đa thức
Hoàn toàn tương tự, có thể đưa ra định nghĩa bằng chứng ngắn gọn dễ kiểm tra để
xác nhận câu trả lời ‘no’
Có những bài toán việc đưa ra bằng chứng ngắn gọn dễ kiểm tra xác định câu trả lời
‘no’ là dễ tìm hơn so với việc đưa ra bằng chứng ngắn gọn xác định câu trả lời
‘yes’, và cũng có những bài toán thì ngược lại
Ví dụ:
Đối với bài toán kiểm tra tính nguyên tố, để đưa ra bằng chứng ngắn gọn dễ
kiểm tra xác nhận câu trả lời ‗no’ cho đầu vào của nó, ta có thể đưa ra một
ước số của
Còn với bài toán kiểm tra tính hợp số thì để đưa ra bằng chứng ngắn gọn dễ
kiểm tra xác nhận câu trả lời ‗yes’ cho đầu vào của nó, ta cũng chỉ cần đưa
ra một ước số của
Có những bài toán mà việc đưa ra bằng chứng ngắn gọn dễ kiểm tra xác nhận câu
trả lời ‗yes’ cũng như ‗no’ đều là không dễ dàng
Ví dụ:
Bài toán về tính duy nhất của đường đi đơn nối 2 đỉnh của đồ thị vô hướng: Cho đơn đồ thị vô hướng Hỏi đường đi đơn dài nhất nối hai đỉnh
và của đồ thị có tồn tại duy nhất?
Định nghĩa 1.12 Ta gọi là lớp các bài toán có thể giải được sau thời gian đa thức
Trang 32~ 31 ~
Đôi khi còn được gọi là lớp các bài toán dễ giải bởi vì các bài toán thuộc lớp này
có thể giải được nhờ các thuật toán thời gian tính đa thức
Ví dụ:
Bài toán về tính liên thông của đồ thị có thể giải được nhờ thuật toán với thời
gian tính là bài toán thuộc lớp
Bài toán nhân dãy ma trận có thể giải được nhờ sử dụng quy hoạch động với thời
gian tính cũng là bài toán thuộc lớp
Định nghĩa 1.13 Ta gọi NP là lớp các bài toán quyết định mà để xác nhận câu trả
lời ‗yes’ của nó ta có thể đưa ra bằng chứng ngắn gọn dễ kiểm tra
Ví dụ: Các bài toán kiểm tra tính hợp số, bài toán tổng con hay bài toán du lịch dạng quyết định là các bài toán thuộc lớp NP
Định nghĩa 1.14 Ta gọi co-NP là lớp các bài toán quyết định mà để xác nhận câu
trả lời ‗no’ của nó ta có thể đưa ra bằng chứng ngắn gọn dễ kiểm tra
Ví dụ: Các bài toán kiểm tra tính nguyên tố, bài toán về tính không chấp nhận được của biểu thức Boolean là các bài toán thuộc lớp co-NP
Còn bài toán về tính duy nhất của đường đi đơn nối 2 đỉnh của đồ thị vô hướng thì
vẫn chưa biết là có thuộc lớp nào trong 2 lớp NP và co-NP hay không
Với một bài toán thuộc lớp P do ta có thể tìm được lời giải của nó sau thời gian đa thức nên ta cũng có thể xác nhận được câu trả lời ‗yes‘ hoặc ‗no‘ của nó (bằng việc
giải nó) sau thời gian đa thức Vì vậy,
và P co-NP
Tuy nhiên điều ngược lại
tức là hay không,
Trang 33Hình 1-11 Mối quan hệ giữa 3 lớp bài toán P, NP và Co-NP
Định nghĩa 1.15 Giả sử và là hai bài toán quyết định Ta nói bài toán có thể qui dẫn sau thời gian đa thức về bài toán nếu tồn tại thuật toán thời gian đa thức cho phép biến đổi bộ dữ liệu vào của thành bộ dữ liệu vào của sao cho
là bộ dữ liệu ‗yes’ (nghĩa là bộ dữ liệu mà câu trả lời cho nó là ‗yes’) của khi và
chỉ là bộ dữ liệu ‗yes‘ của
Trong phần tiếp theo ta chỉ xét phép qui dẫn sau thời gian đa thức, vì thế để ngắn gọn, ta sẽ gọi là phép qui dẫn thay cho phép qui dẫn sau thời gian đa thức
Nếu A qui dẫn được về B và để giải B đã có thuật toán đa thức thì A cũng sẽ giải
được sau thời gian đa thức
Giải thuật quy dẫn
(R)
Giải thuật giải (B) Đầu vào
cho B
Đầu vào
cho A
Đầu ra của B
Đầu ra của A
Trang 34~ 33 ~
Dễ thấy phép quy dẫn có tính chất bắc cầu: và thì
Phép quy dẫn thường dùng để so sánh độ khó của 2 bài toán Nếu quy dẫn được
về thì, sai khác một thời gian đa thức, không khó hơn Nếu A là khó (theo
nghĩa chưa tìm được thuật toán thời gian tính đa thức để giải ) thì cũng là khó, còn nếu là dễ (nghĩa là đã có thuật toán thời gian tính đa thức giải ) thì cũng
là dễ
Từ khái niệm quy dẫn chúng ta đưa ra định nghĩa các định nghĩa về lớp các bài toán
NP-khó và NP-đầy đủ như sau
Định nghĩa 1.16 Một bài toán quyết định được gọi là NP-đầy đủ nếu như
là bài toán trong NP, nghĩa là
o là bài toán dạng quyết định
o Để xác nhận câu trả lời ‗yes‘ của ta có thể đưa ra bằng chứng ngắn gọn dễ kiểm tra
Mọi bài toán trong NP đều có thể quy dẫn về
NP-đầy đủ vẫn được người ta coi là lớp bài toán khó nhất trong lớp các bài toán NP
Bổ đề 1.1 Giả sử bài toán là NP-đầy đủ, bài toán là thuộc NP, và bài toán
qui dẫn về Khi đó bài toán cũng là NP-đầy đủ
Chứng minh:
Giả thiết đã cho là bài toán thuộc NP, vấn đề còn lại là chỉ việc chứng minh mọi
bài toán trong NP đều có thể quy dẫn về Thực vậy, vì là bài toán NP-đầy đủ nên mọi bài toán NP đều có thể quy dẫn về , mà lại quy dẫn về Do tính chất bắc cầu của phép quy dẫn ta có mọi bài toán NP đều quy dẫn được về Từ đó ta
có điều phải chứng minh
Kết hợp định nghĩa 1.15 và bổ đề 1.1 ta có nếu là một bài toán NP-đầy đủ thì mọi
bài toán thuộc lớp NP đều có thể quy dẫn về , tức là khó không kém bất cứ một
Trang 35~ 34 ~
bài toán nào thuộc lớp NP Suy rộng hơn nữa, vì mọi bài toán NP-đầy đủ trước tiên phải là bài toán NP, do đó các bài toán NP-đầy đủ có thể suy dẫn về nhau, hay nói
cách khác chúng có độ khó tương đương nhau Vấn đề khó khăn nhất là làm thế nào
để tìm được bài toán NP-đầy đủ đầu tiên, bởi vì từ đó ta có thể xây dựng nên những bài toán NP-đầy đủ khác nhờ quy dẫn
Mối quan hệ giữa các lớp bài toán được minh họa trong hình 1-13
Năm 1971, Stephen A Cook đã chứng minh được bài toán Cir-Sat (Circuit
Satisfiability Problem – bài toán về tính thực hiện của mạch logic) là bài toán đầy đủ Bài toán được phát biểu như sau:
NP-Bài toán Cir-Sat: Cho một mạch logic với đầu vào gồm n giá trị, hỏi có tồn tại một
đầu vào của mạch để đầu ra của mạch là True hay mạch luôn đưa ra giá trị False
Một yêu cầu bắt buộc với mọi bài toán NP-đầy đủ là chúng phải ở dạng quyết định
Tuy nhiên có những bài toán không phải là bài toán dạng quyết định nhưng lại khó
không kém bất kì một bài toán NP nào, tức là nó có tính chất mọi bài toán trong NP
đều có thể quy dẫn về bài toán đó Với những bài toán như vậy, người ta xếp chúng
vào lớp bài toán NP-khó
Định nghĩa 1.17 Một bài toán A được gọi là NP-khó (NP-hard) nếu như sự tồn tại
thuật toán đa thức để giải nó kéo theo sự tồn tại thuật toán đa thức để giải mọi bài
toán trong NP
Như đã nói ở trên, khi đã tìm ra và chứng minh được một bài toán là NP-đầy đủ thì
ta có thể chứng minh nhiều bài toán khác cũng là NP-đầy đủ nhờ sử dụng phép quy
dẫn Sau đây là sơ đồ chứng minh một bài toán thuộc lớp bài toán NP-đầy đủ:
Chứng minh thuộc NP bằng cách đưa ra một bằng chứng ngắn gọn dễ kiểm tra
Chọn một bài toán đã được chứng minh là thuộc lớp bài toán NP-đầy đủ hoặc NP-khó
Trang 36Hamilton Circle
Set Cover Subset Sum
Vertex Cover Clique
Max Clique
Hình 1-14 Danh sách một số bài toán NP-khó và sơ đồ quy dẫn giữa chúng
Trang 37~ 36 ~
1.3 Một số cách tiếp cận giải các bài toán NP-khó
Như ta đã biết, các bài toán NP-khó (trong đó có NP-đầy đủ) hiện vẫn chưa có thuật
toán hiệu quả để giải Do đó người ta hướng tới các phương pháp giải gần đúng và
các phương pháp dùng tính toán tiến hóa, một số phương pháp giải các bài toán NP
thường sử dụng đến kỹ thuật quy hoạch tuyến tính nới lỏng (relaxed linear programming)
Chỉ số đặc trưng cho phương pháp xấp xỉ chính là sai số tuyệt đối hoặc tỷ số chênh lệch tương đối cho phép giữa lời giải gần đúng và lời giải đúng
hoặc
Trong đó gọi là đảm bảo về tỷ số chênh lệch tương đối (relative performance guarantee) và gọi là đảm bảo về sai số tuyệt đối (absolute performance guarantee) Tuy nhiên phương pháp xấp xỉ không phải lúc nào cũng đảm bảo được tính chất này với mọi bài toán NP-khó, nghĩa là có những bài toán (ví dụ như bài toán đóng thùng
Trang 38~ 37 ~
– bin packing – người ta đã xây dựng được những phương án xấp xỉ trong thời gian
đa thức (polynomial time approximation schemes – PTAS) cho phép đạt tới kết quả sai khác với kết quả đúng không quá một sai số cho trước bất kì Tuy nhiên với một
số bài toán, ví dụ như bài toán tìm bè lớn nhất của đồ thị vô hướng (Maximum Clique), thì không thể làm được điều này, thậm chí không thể xấp xỉ kết quả tới một giá trị sai khác với lời giải đúng một sai số hoặc một tỉ số đa thức
Một hạn chế khác của phương pháp xấp xỉ là chúng chỉ có thể được áp dụng để giải những bài toán tối ưu hóa mà không áp dụng để giải những bài toán dạng quyết định thuần túy được (tuy nhiên người ta có thể chuyển đổi qua lại giữa dạng tối ưu hóa và dạng quyết định của những bài toán như vậy)
1.3.2 Phương pháp xác xuất
Phương pháp xác xuất (probabilistic methods) hay còn gọi là phương pháp ngẫu nhiên (randomized) sử dụng các bộ sinh giá trị ngẫu nhiên như là đầu vào phụ giúp thuật toán định hướng xử lí và hy vọng thuật toán sẽ có hiệu quả hoạt động cao trong tình huống trung bình Với phương pháp này khả năng thuật toán hoạt động tồi vẫn có thể xảy ra nhưng xác suất xảy ra là nhỏ
ví dụ sau: Hãy tìm một kí tự ‗a‘ trong mảng gồm n thành phần trong đó một nửa là
kí tự ‗a‘, một nửa còn lại là kí tự ‗b‘
Một cách tiếp cận tự nhiên là ta đi xét từng phần tử của mảng, nhưng rõ ràng cách làm này khá tốn thời gian (cần n/2 phép toán) nếu mảng được xếp bởi các kí tự ‗b‘ trước rồi đến các kí tự ‗a‘ sau Còn nếu ta duyệt các phần tử của mảng theo chiều ngược từ cuối trở về hoặc theo chiều xuôi nhưng với bước nhảy là 2 phần tử ta vẫn
có thể gặp vấn đề tương tự với một bộ dữ liệu nào đó Tóm lại là với bất kì một thuật toán có tính xác định (deterministic) nào, ta không thể đảm bảo rằng thuật toán đó sẽ hoạt động tốt với mọi bộ dữ liệu Nhưng nếu ta sử dụng phương pháp xác suất để duyệt các phần tử của mảng trên một cách ngẫu nhiên, ta có thể hy vọng với
Trang 39có chi phí thấp nhất theo hàm trong đó là chi phí chính xác của đường đi từ trạng thái đầu tới nút đang xét Nếu là một hàm dự đoán tốt thì hiển nhiên A* cũng có nhiều khả năng tìm ra lời giải tốt, trong đó có thể có lời giải tối ưu Vấn đề thực sự giờ đây nằm ở chỗ lựa chọn hàm như thế nào để hỗ trợ tìm kiếm hiệu quả Có nhiều cách để xây dựng heuristic cho bài toán
Sử dụng hàm chi phí của các bài toán con làm heuristic, vì chi phí của bài toán tổng được tổ hợp từ chi phí của bài toán con, tất nhiên có thể hàm tổ hợp đó rất phức tạp, nhưng những thông tin về chi phí các bài toán con là rất
Trang 40~ 39 ~
hữu ích cho việc ước đoán chi phí của bài toán tổng, đặc biệt nếu ta có nhiều kinh nghiệm tiếp xúc với dạng bài toán này Để tiết kiệm thời gian tính toán người ta thường hay sử dụng một cơ sở dữ liệu mẫu (pattern database) lưu trữ lại lời giải đúng của mọi bài toán con
Sử dụng lời giải của chính bài toán đó nhưng đã được loại bỏ một số điều kiện ràng buộc (việc loại bỏ này cho phép ta có thể tìm được lời giải đúng cho bài toán với thời gian tính chấp nhận được)
Phương pháp heuristic có nét giống với phương pháp xác suất ở chỗ nó đôi lúc cho
ra những lời giải tồi hoặc có thời gian thực hiện là rất lâu Tuy nhiên xác suất để xảy ra điều đó lại là rất thấp Hơn thế nữa, nhờ sử dụng những tri thức và kinh nghiệm bổ trợ (heuristic), các phương pháp heuristic thường cho mang lại hiệu quả cao xét về cả chất lượng lời giải lẫn thời gian tính toán trong quá trình ứng dụng thực tế, nhưng nó không đảm bảo được rằng điều đó lúc nào cũng xảy ra
Các phương pháp heuristic có một ưu điểm là giúp cải thiện đáng kể hiệu quả tính toán Giả sử ta đang đứng ở một nút trên cây tìm kiếm, khoảng cách từ nút này tới nút đích là , và trên cây tìm kiếm trung bình một nút rẽ thành nhánh Nếu sử dụng thuật toán tìm kiếm vét cạn thời gian tính sẽ là Ta tìm được lời giải tối
ưu nhưng trả giá bằng chi phí thời gian quá đắt và nhiều lúc sẽ trở thành không chấp nhận được Nhưng nếu sử dụng heuristic ta có thể rút hệ số rẽ nhánh (branching factor) từ xuống một giá trị thấp hơn nào đó, và hiển nhiên chi phí thời gian sẽ được rút xuống rất nhiều
Kĩ thuật heuristic được ứng dụng nhiều trong trí tuệ nhân tạo (Artificial Intelligence
- AI) nhưng ta cũng thấy với cơ chế như trên nó cũng giúp nâng cao hiệu quả các
thuật toán giải các bài toán tối ưu hóa thuộc lớp NP-khó