Đối với nhiều bài toán, hoặc không có lời giải, hoặc độ phức tạp tính toán làhàm mũ, hoặc là bài toán NP-đầy đủ…, có nghĩa là nó không có lời giải khả thi, thì thông thường thay vì tìm l
Trang 1PHƯƠNG PHÁP NGHIÊN CỨU KHOA HỌC TRONG
TIN HỌC
Đề tài : “Tìm hiểu về thuật toán Heuristic và ứng dụng trong việc giải quyết một số bài toán”
Bùi Duy Linh – CHK7
Trang 2MỤC LỤC
Phần I: Thuật toán Heuristic 2
1 Lời giới thiệu 2
2 Mô tả thuật toán 3
Phần II: Ứng dụng thuật toán Heuristic vào một số bài toán 5
1 Bài toán người đưa thư 6
1.1 Mô tả bài toán 7
1.2 Cài đặt bài toán 8
1.3 Nhận xét và kết luận 9
2 Bài toán tô màu đồ thị 10
2.1 Mô tả bài toán 31
2.2 Cài đặt thuật toán 33
2.3.Kết luận 33
Trang 3Đối với nhiều bài toán, hoặc không có lời giải, hoặc độ phức tạp tính toán là
hàm mũ, hoặc là bài toán NP-đầy đủ…, có nghĩa là nó không có lời giải khả thi,
thì thông thường thay vì tìm lời giải tối ưu cho chúng, chúng ta cố gắng tìm lời
giải có thể chấp nhận được, đáp ứng được yêu cầu của thực tế Các lời giải này
chính là các thuật toán Heuristic
Các thuật toán tìm kiếm luôn luôn đóng vai trò quan trọng trong việc giải
các bài toán tin học Các thuật toán loại này rất phong phú, có thể kể đến như: vét
cạn, đệ quy quay lui, nhánh cận, nhị phân…Tuy nhiên, khi gặp những bài toán có
không gian tìm kiếm lớn (đặc biệt trong các trò chơi cờ) thì các thuật toán tìm
kiếm thông thường không cho kết quả hoặc kết quả không tối ưu (do những hạn
chế về thời gian và bộ nhớ) Một hướng tiếp cận độc đáo có thể đáp ứng được đòi
hỏi cho nhiều bài toán loại này là dùng thuật toán Heuristic
Để hiểu rõ hơn về thuật toán này, em đã có bài “Tìm hiểu về thuật toán
Heuristic” Trong quá trình làm bài không tránh khỏi sự thiếu xót, em rất mong
được sự góp ý của thầy giáo và các bạn
Trang 4I – Khái quát về thuật toán Heuristic
Thuật ngữ Heuristic xuất phát từ tiếng Hy Lạp là ″heuriskein″ có nghĩa là
″tìm kiếm″ hoặc ″phát minh″ Chắc chắn chúng ta vẫn còn nhớ câu chuyện về nhà
bác học Archimedes Khi phát hiện ra định luật về trọng lượng riêng, ông đã trần
truồng chạy ra đường và kêu lớn ″tôi tìm ra rồi″ Thực ra, lúc đó ông đã kêu lên
″heureka″, về sau này người ta đổi từ này thành ″eureka″
Thuật ngữ Heuristic được Feigenbaum Feldman định nghĩa như sau:
″Heuristic là các quy tắc, phương pháp, chiến lược, mẹo giải hay phương cách nào
đó nhằm làm giảm khối lượng tìm kiếm lời giải trong không gian bài toán cực lớn
″
Tư tưởng chính để giảm khối lượng tìm kiếm là thay vì ″loại bỏ các hướng
tìm kiếm chắc chắn không dẫn đến lời giải″, ta hãy ″chọn đi theo hướng có nhiều
khả năng dẫn đến lời giải″.
Do thuật toán Heuristic được con người sử dụng thường mang đặc trưng của
những gợi ý hay lời khuyên, nên các phương pháp dựa trên Heuristic đôi khi
không chỉ ra con đường trực tiếp để đạt tới mục đích
Nhiều kết quả nghiên cứu trong trí tuệ nhân tạo cho thấy rằng, tuy có nhiều
điểm mạnh nổi bật, nhưng trong một vài lĩnh vực nghiên cứu nào đó thì các
phương pháp Heuristic còn bộc lộ những điểm yếu nhất định Điều phức tạp chính
là vì mọi chương trình máy tính phải đảm bảo chắc chắn kết thúc công việc (theo
định nghĩa một thuật toán phải đảm bảo tính đúng và tính dừng) Vì vậy, nếu nói
rằng một chương trình nào đó sử dụng Heuristic thì kết luận về tính dừng chỉ đúng
trong đa số các trường hợp Do đó, trong phần lớn trường hợp giải quyết bài toán,
các chương trình Heuristic có lúc cho kết quả mong đợi, đôi khi lại không
Trang 5Các Heuristic không chỉ tác động đến các chiến lược tìm kiếm, mà còn ảnh
hưởng quyết định tới các chiến lược điều khiển (hướng tìm kiếm trong không
gian bài toán và xử lý cạnh tranh) Đối với những bài toán trí tuệ phức tạp, số khả
năng có thể lớn tới mức không thể có một máy tính nào dầu hiện đại đến mấy đáp
ứng nổi Do vậy, thủ tục duyệt toàn thể không thể chấp nhận được Trong phần lớn
các bài toán chứng minh định lý sử dụng logic, số khả năng cần phải xét trở lên vô
hạn Việc lựa chọn một nước đi tốt nhất trong trò chơi đòi hỏi phải tìm kiếm trong
khoảng 1040 khả năng khác nhau, thậm chí đối với chơi cờ, số khả năng cỡ 10120
Một cách xử lý tốt trong những trường hợp này là sử dụng thao tác rút gọn các
hướng tìm kiếm
Vấn đề quan trọng là ở chỗ, chúng ta biết khai thác khéo léo thông tin tại
mỗi trạng thái để tìm ra thứ tự ưu tiên và đẩy nhanh quá trình tìm kiếm Thông
thường ta gắn với mỗi trạng thái của bài toán với một số đo (một hàm đánh giá)
nào đó để đánh giá mức độ gần đích của nó
Một kỹ thuật Heuristic được coi là hợp lý khi nó cho phép tiến hành đánh
giá các khả năng để làm rõ khả năng nào tốt hơn các khả năng còn lại Những ví
dụ điển hình về các hàm đánh giá là các ước lượng khoảng cách đường chim bay
từ một đỉnh nào tới đỉnh đích trong bài toán xác định đường đi ngắn nhất, hay các
đánh giá ước lượng mức độ quan trọng của các quân cờ trong mỗi thế cờ dựa trên
tổ hợp các trọng số của chúng…
Trang 6II - Ứng dụng thuật toán Heuristic vào giải quyết một số bài toán
1- Bài toán người đưa thư
Bài toán: Để tiết kiệm thời gian đi đưa thư trong một địa phương Người đưa
thư phải đi qua tất cả các điểm cần phát thư rồi trở về vị trí ban đầu với đường đi
ngắn nhất Bài toán có thể phát biểu lại như sau: Giả sử có một đồ thị có trọng số
dương, tìm đường đi ngắn nhất qua tất cả các đỉnh của đồ thị rồi trở về đỉnh ban
đầu.
Hạn chế khi sử dụng giải thuật tối ưu : Đồ thị có n đỉnh, khi đó thuật toán tối
ưu cho bài toán này sẽ là thuật toán tìm đường đi ngắn nhất cho chu trình
Haminton Do đó thuật toán tối ưu sẽ có độ phức tạp là O( n!) là Không thể thực
hiện thuật toán
-> cần Tìm một thuật giải Heuristic cho bài toán này.
Theo kinh nghiệm của con người trong thực tế thì khi ta đi trên những
đoạn đường ngắn nhất thì cuối cùng ta sẽ có một hành trình ngắn
nhất là “sử dụng nguyên lý tham lam”.
- Thuật giải bài toán sử dụng nguyên lý tham lam:
- Ví dụ về thuật giải trên:
Trang 7Với một đồ thị trọng số dương như hình bên Nếu
ta xuất phát từ đỉnh sổ 1, thì đỉnh tiếp theo phải
đến là 2 ( vì cạnh 1-2 có trọng số nhỏ nhất so với
các đỉnh chưa đến của 1), như vậy tiếp theo ta sẽ
đến các đỉnh theo thứ tự là 5, 3, 4, và trở về 1
Như vậy đường đi ngắn nhất theo giải thuật trình bày trên tìm được là:
1 + 3 + 2 + 1+ 7 = 14
- Ta có dạng ma trận hóa của đồ thị
trong ví dụ ở mục 3, như hình bên:
- Chương trình được viết trên môi
trường visual C++ 6.0
- Input: một ma trận vuông bằng file “graph.txt “ có dạng như hình
bên, hay nhập ma trận bằng tay
- Output: đường đi theo thuật giải Heuristic, và chi phí của đường đi
đó
- Tổ chức dữ liệu chương trình: (hình bên)
+ n: là biến cho biết số đỉnh của đồ thị
+ G: dùng để trỏ tới các giá trị của ma trận
+ v[Gr.n + 1]: dùng để lưu trữ đường đi theo thuật giải Heuristic
+ Gr.G[ i][j ]: đồ thị dưới dạng ma trận
+ x: là đỉnh đầu tiên xuất phát
+ initGraph(Graph &Gr): Hàm dùng để khởi tạo một đồ thị mới từ cấu
trúc đã tổ chức
Trang 8+ ReadGraph(Graph &Gr): dùng để đọc đồ thị từ file txt
+ inputHandle( Graph &Gr): dùng để nhập đồ thị bằng tay
+ outputGraph(Graph Gr): dùng để xuất đồ thị đã được nhập ra màn
hình
+ testGraph(int a, int* v, Graph Gr): Kiểm tra điểm đang duyệt có
trùng với điểm đã duyệt trên ma trận không Được gọi trong hàm
topNear(…)
+ topNear(int a, Graph Gr, int* v) : Hàm tìm đỉnh kế tiếp theo thuật
giải Heuristic Được gọi lại trong hàm FindWay(…)
Trang 9+ FindWay(int x, Graph Gr, int* v): Hàm tìm đường đi theo giải thuật
Heuristic Dựa theo cách tìm đường đi có trọng số nhỏ nhất để đi bước
tiếp theo
- Giao diện chương trình: console Aplication
Khi thực thi, chương trình sẽ yêu cầu chọn nhập ma trận đồ thị bằng
tay hay bằng file “graph.txt” Ví dụ như hình trên chọn nhập ma trận
bằng file txt Ta nhập tiếp đỉnh bắt đầu (ở đây nhập 1), thì chương
trình sẽ cho ra đáp án cho ví dụ trên:
Đường đi là: 1 – 2 – 5 – 3 – 4 – 1
Chi phí cho đường đi này theo giải thuật Heuristic là: 14
Trang 10Nếu như chọn cách nhập ma trận bằng tay thì ta phải nhập từng giá
trị của ma trận vào
- Nhấn ESC để thoát khỏi chương trình, Phím bất kỳ để tiếp tục
chương trình với cách duyệt từ đỉnh khác
- Ưu điểm: Thuật giải Heuristic cho bài toán người đưa thư có độ phức
tạp O(n2 ) tốt hơn rất nhiều so với thuật toán tối ưu ( có độ phức tạp
O( n!) )
- Nhược điểm: thuật giải có những hạn chế, chưa cho ra lời giải chính
xác
-> K ế t lu ậ n : Thuật giải Heuristic cho bài toán người đưa thư tuy chưa
đưa ra được lời giải chính xác cho bài toán, nhưng nó cho ra một lời
giải có thể chấp nhận được với độ phức tạp thấp hơn nhiều so với
thuật toán tối ưu
Trang 112 - Bài toán tô màu cho đồ thị
Giả sử G = là một đồ thị không định hướng Yêu cầu tô màu cho tất cả các
đỉnh của G sao cho hai đỉnh được nối bằng một cung thì phải có hai màu khác
nhau Có thể thấy rằng bài toán tô màu này sao cho số màu được dùng là ít nhất là
một bài toán NP-đầy đủ Lúc này, ta tìm một lời giải tốt có thể chấp nhận được
theo một thuật toán heuristic như sau:
Ban đầu chọn một màu và một đỉnh xuất phát Ta tô màu đỉnh này và tất cả
các đỉnh khác có thể tô được mà vẫn thoả mãn điều kiện của bài toán Chúng ta
chọn màu mới và một đỉnh xuất phát mới (chưa được tô), ta tô đỉnh này và tất cả
các đỉnh khác (còn chưa được tô) có thể tô được bằng màu thứ hai, và cứ như
vậy…cho đến khi tô hết các đỉnh của G thì thôi
Bài tập: Các ô vuông thần bí
Kế tục thành công của trò chơi với khối lập phương thần bí, Ngài Rubik
sáng tạo ra dạng phẳng của trò chơi này gọi là trò chơi các ô vuông thần bí Đây là
một bảng gồm 8 ô vuông bằng nhau (xem Hình 1)
Chúng ta xét bảng trong đó mỗi ô vuông có một màu khác nhau Các màu
được ký hiệu bởi tám số nguyên dương đầu tiên (xem Hình 1) Trạng thái của
bảng được cho bởi dãy ký hiệu màu của các ô được viết lần lượt theo chiều kim
đồng hồ bắt đầu bởi ô ở góc trái trên và kết thúc tại ô ở góc trái dưới Ví dụ, trạng
thái của bảng trong hình 1 được cho bởi dãy (1, 2, 3, 4, 5, 6, 7, 8) Trạng thái này
Trang 12được gọi là trạng thái khởi đầu (hay trạng thái đích)
Có thể dùng 3 phép biến đổi cơ bản đối với bảng có tên là′A′, ′B′, ′C′:
′A′: đổi chỗ dòng trên và dòng dưới Ví dụ sau phép biến đổi ′A′thì hình 1
thành:
′B′: thực hiện một phép hoán vị vòng quanh sang phải Ví dụ sau phép biến
đổi ′B′ thì hình 1 thành:
′C′: quay theo chiều kim đồng hồ bốn ô giữa Ví dụ sau phép biến đổi ′C′ thì
hình 1 thành:
Biết rằng từ một trạng thái khởi đầu luôn có thể chuyển về một trạng thái bất
kỳ bằng cách dùng các phép biến đổi cơ bản nói trên
Hãy viết chương trình tìm các phép biến đổi cơ bản để chuyển bảng từ trạng
thái khởi đầu cho trong hình 1 về một trong các trạng thái cho trước (Câu A), bạn
sẽ được thêm hai điểm nếu số lượng phép biến đổi tìm được không vượt quá 300
(Câu B)
Dữ liệu vào: file INPUT.TXT chứa 8 số nguyên dương trong dòng đầu tiên mô tả
trạng thái đích
Trang 13phép biến đổi của dãy các phép biến đổi tìm được Trong L dòng tiếp theo phải ghi
dãy tên các phép biến đổi cơ bản theo trình tự thực hiện, mỗi tên ghi ở vị trí đầu
tiên của mỗi dòng
Ví dụ về dữ liệu vào và dữ liệu ra:
Trang 14KẾT LUẬN
Thuật toán Heuristic tuy có nhiều điểm mạnh nổi bật, nhưng trong một vài
lĩnh vực nghiên cứu nào đó thì các phương pháp Heuristic còn bộc lộ những điểm
yếu nhất định, vì vậy chúng ta phải tìm hiểu kỹ thuật toán để có thể áp dụng vào
từng trường hợp cụ thể nhằm thu được kết quả tốt nhất
Trang 15TÀI LIỆU THAM KHẢO
1 Phan Dũng, Phương pháp luận sáng tạo khoa học kỹ thuật, Nhà xuất bản
TP.HCM-1998
2 Hoàng Kiếm, Giải một bài toán trên máy tính như thế nào (tập 1, 2, 3),
Nhà xuất bản Giáo dục 2001, 2002, 2004