Đồ án số 15: Không gian trạng thái được mô tả là bản đồ giao thông của 1 xã, phường nào đó. Hãy xây dựng chương trình cho phép tìm kiếm đường đi từ 1 điểm trên bản đồ đến 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Nhành và cậnI.Cơ sở lý thuyết:1.Bài toán tìm kiếmBài toán tìm kiếm có thể hiểu 1 cách tổng quát là: Trong 1 tập hợp rất nhiều đối tượng tìm một đối tượng thỏa mãn một số yêu cầu nào đó. Ví dụ như các trò chơi, ví dụ như cờ caro, cờ vua cũng có thể xem là 1 bài toán tìm kiếm, hoặc tìm đường đi cũng là 1 bài toán tím kiếm khá cơ bản và được tập trung nghiên cứu trong môn:” Nhập môn Trí tuệ Nhân tạo “Kỹ thuật tìm kiếm được chia ra làm 3 loại:- Kỹ thuật tìm kiếm mù: Trong bài toán này, chúng ta hoàn toàn không biết gì về các đối tượng để hướng dẫn tìm kiếm mà chỉ đơn thuần là xem xét tất cả các đối tượng của 1 hệ thống để phát hiện ra đối tượng cần tìm. Một số kỹ thuật tìm kiếm mù: Tìm kiếm theo chiều rộng (Breadth-first search) và tìm kiếm theo chiều sâu (depth-first search)- Kỹ thuật tìm kiếm có kinh nghiệm (Tìm kiếm với hàm Heuristic): Hàm Heuristic là hàm đánh giá được xây dựng nhờ vào kinh nghiệm và sự hiểu biết của chúng ta về vấn đề cần giải quyết. Một số kỹ thuật tìm kiếm có kinh nghiệm: Tìm kiếm beam, Tìm kiếm leo đồi.- Kỹ thuật tìm kiếm tối ưu: Trong không gian trạng thái cần tìm kiếm, mỗi 1 đối tượng x đều gắn với 1 số đo giá trị của nó là f(x) , mục tiêu đặt ra là tìm đối tượng có giá trị f(x) lớn nhất hoặc nhỏ nhất. Hàm f(x) được gọi là hàm mục tiêu. Một số kỹ thuật tìm kiếm tối ưu: Các kỹ thuật tìm đường đi ngắn nhất trong không gian trạng thái (Thuật toán A*, thuật toán nhánh và cận, …..), các kỹ thuật tìm kiếm đối tượng tốt nhất (Tìm kiếm leo đồi, tìm kiềm Gradient, …), tìm kiếm bắt chước sự tiến hóa (Thuật toán gene)Trong các kỹ thuật tìm kiếm, đồ án này sử dụng kỹ thuật tìm kiếm tối ưu Nhánh và cận.2. Thuật toán Nhánh và cận: Thuật toán nhánh và cận là thuật toán sử dụng tìm kiếm leo đồi với hàm đánh giá f(u)a.Tìm kiếm leo đồi Tìm kiếm leo đồi là phương pháp tìm kiếm theo chiều sâu có sử dụng hàm đánh giá Khác với phương pháp tìm kiếm theo chiều sâu, khi phát triển 1 đỉnh u, ta lựa chọn trong số các đỉnh con của u, đỉnh nào có nhiều hứa hẹn nhất thì phát triển, việc xác định đỉnh nào có nhiều hứa hẹn nhất được thực hiện bởi hàm đánh giáVD: Xét không gian trạng thái , Tìm đường
Trang 1HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO MÔN HỌC TRÍ TUỆ NHÂN TẠO
Giáo viên hướng dẫn: Ngô Hữu Phúc
HÀ NỘI 3/2010
Trang 2Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
Báo cáo đồ án môn: Trí tuệ nhân tạo Giáo viên: Ngô Hữu Phúc
Sinh Viên: Nguyễn Thế Định – Tin học 5A
Đồ án số 15: Không gian trạng thái được mô tả là bản đồ giao thông của 1 xã, phường nào
đó Hãy xây dựng chương trình cho phép tìm kiếm đường đi từ 1 điểm trên bản đồ đến 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Nhành và cận
I Cơ sở lý thuyết:
1.Bài toán tìm kiếm
Bài toán tìm kiếm có thể hiểu 1 cách tổng quát là: Trong 1 tập hợp rất nhiều đối tượng tìm một đối tượng thỏa mãn một số yêu cầu nào đó Ví dụ như các trò chơi, ví dụ như cờ caro, cờ vua cũng có thể xem là 1 bài toán tìm kiếm, hoặc tìm đường đi cũng là 1 bài toán tím kiếm khá cơ bản và được tập trung nghiên cứu trong môn:” Nhập môn Trí tuệ Nhân tạo “
Kỹ thuật tìm kiếm được chia ra làm 3 loại:
- Kỹ thuật tìm kiếm mù: Trong bài toán này, chúng ta hoàn toàn
không biết gì về các đối tượng để hướng dẫn tìm kiếm mà chỉ đơn thuần là xem xét tất cả các đối tượng của 1 hệ thống để phát hiện ra đối tượng cần tìm Một số kỹ thuật tìm kiếm mù: Tìm kiếm theo chiều rộng (Breadth-first search) và tìm kiếm theo chiều sâu (depth-first search)
- Kỹ thuật tìm kiếm có kinh nghiệm (Tìm kiếm với hàm Heuristic):
Hàm Heuristic là hàm đánh giá được xây dựng nhờ vào kinh nghiệm và sự hiểu biết của chúng ta về vấn đề cần giải quyết Một số kỹ thuật tìm kiếm có kinh nghiệm: Tìm kiếm beam, Tìm kiếm leo đồi
- Kỹ thuật tìm kiếm tối ưu: Trong không gian trạng thái cần tìm kiếm,
mỗi 1 đối tượng x đều gắn với 1 số đo giá trị của nó là f(x) , mục tiêu đặt ra là tìm đối tượng có giá trị f(x) lớn nhất hoặc nhỏ nhất Hàm f(x) được gọi là hàm mục tiêu Một số kỹ thuật tìm kiếm tối ưu: Các kỹ thuật tìm đường đi ngắn nhất trong không gian trạng thái (Thuật toán A*, thuật toán nhánh và cận,
… ), các kỹ thuật tìm kiếm đối tượng tốt nhất (Tìm kiếm leo đồi, tìm kiềm Gradient, …), tìm kiếm bắt chước sự tiến hóa (Thuật toán gene)
Trong các kỹ thuật tìm kiếm, đồ án này sử dụng kỹ thuật tìm kiếm tối ưu Nhánh và cận
2 Thuật toán Nhánh và cận:
Thuật toán nhánh và cận là thuật toán sử dụng tìm kiếm leo đồi với hàm đánh giá f(u)
Trang 3a Tìm kiếm leo đồi
Tìm kiếm leo đồi là phương pháp tìm kiếm theo chiều sâu có sử dụng hàm đánh giá Khác với phương pháp tìm kiếm theo chiều sâu, khi phát triển 1 đỉnh u, ta lựa chọn trong số các đỉnh con của u, đỉnh nào có nhiều hứa hẹn nhất thì phát triển, việc xác định đỉnh nào có nhiều hứa hẹn nhất được thực hiện bởi hàm đánh giá
VD: Xét không gian trạng thái , Tìm đường đi từ A đến B:
- Đầu vào: Trạng thái đầu là A, trạng thái kết thúc là B
- Thực hiện thuật toán:
Bước 1: Xét A sinh ra C,D,E với h(C) = 15, h(D) = 6, h(E) = 7
h(D) nhỏ nhất nên chọn D
Bước 2 : Xét D sinh ra I, F với h(F) = 10, h(I) = 8
h(I) nhỏ nhất nên chọn I
Bước 3: Xét I sinh ra B và G
B là trạng thái kết thúc
- Thuật toán được biểu diễn thông qua cây sau:
Trang 4Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
Cài đặt thuật toán:
Procedure Hill_Climbing_Search;
Begin
Bước 1: Khởi tạo danh sách L chỉ chứa trạng thái đầu;
Bước 2: Loop do
1 If L rỗng then { thông báo thất bại; stop; }
2 Loại trạng thái u đầu danh sách L;
3 If u là trạng thái kết thúc then { thông báo thành công; stop; }
4 For mỗi trạng thái v kề u đặt v vào L sao cho các phần tử được đưa vào đầu
danh sách L có đánh giá giảm dần;
Bước 3: End;
b Thuật toán nhánh và cận
Trong thuật toán này, tại mỗi bước phát triển trạng thái u, chọn lấy trang thái v trong
số các trạng thái kề với u sao cho f(v) đạt min
Làm tương tự cho tới khi:
- V là đích, hoặc
Trang 5- V ko có đỉnh kề, hoặc
- V có f(v) lớn hơn độ dài đường đi hiện thời
Khi đó, không phát triển đỉnh v nữa mà quay về cha của v để tìm trạng thái tốt nhất trong các trạng thái chưa xét
Ví dụ về thuật toán Nhánh và cận:
Xét không gian trạng thái trên, tìm đường đi ngắn nhất từ A đến B
Đầu vào: A là trang thái ban đầu, B là trạng thái đích
Thực hiện thuật toán:
Phát triển A, có các đỉnh con C, D, E, F với f(C) = 24; f(D) = 13; f(E) = 21; f(F) =
27
Chọn D, sinh các con H, E (mới) với f(H) = 25; f(E) = 19.
Chọn E, sinh ra K, I với f(K) = 17; f(I) = 18.
Chọn K, sinh ra B với f(B) = g(B) = 21 → đường đi tạm thời là 21
Từ B, quay về K Từ K quay về E
Từ E, sang I, f(I) = 18 < độ dài tạm thời 21 Sinh ra K, B với f(K) = 25, f(B) = g(B)
= 19 → đường đi tạm thời là 19
Với B, không tìm được điểm nào có chi phí tốt hơn nữa
Vậy đường đi tối ưu có độ dài 19
Thuật toán được biểu diễn qua cây sau:
Trang 6Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
Cài đặt thuật toán:
Procedure Branch_and_Bound;
Begin
1 Khởi tạo danh sách L chỉ chứa trạng thái ban đầu;
Gán giá trị ban đầu cho cost;
1 Loop do
2.1 If L rỗng then stop;
2.2 Loại trạng thái u ở đầu danh sách L;
2.3 If u là trạng thái kết thúc then
if g(u) ≤ cost then { cost ← g(u); quay lại 2.1;}
2.4 If f(u) > cost then quay về 2.1;
2.5 For mỗi trạng thái v kề u do
{ g(v) ← g(u)+k(u,v); f(v) ← g(v)+h(v); đặt v vào danh sách L1}
2.6 Sắp xếp L1 theo thứ tự tăng của hàm f;
2.7 Chuyển L1 vào đầu danh sách L sao cho L trạng thái đầu của L1 vào đầu L;
3 End;
Nhận xét: Thuật toán nhánh và cận cũng là 1 thuật toán đầy đủ và tối ưu nếu:
- Hàm đánh giá h(u) là đánh giá thấp
Trang 7- Độ dài các cung không nhỏ hơn 1 số dương nào đó
Từ những cơ sở lý thuyết trên, em đã xây dựng chương trình:” Tìm đường đi ngắn nhất “ dùng thuật toán Nhánh và cận:
1 Giao diện của chương trình:
Trang 8Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
- Giao diên chương trình gồm có:
2 ô combobox dùng để lựa chọn điểm xuất phát và đich đến
3 label để hiển thị: độ dài tối ưu, đường đi tối ưu và 1 đường đi khác trong quá trình duyệt
1 ô picturebox dùng để hiển thị bản đồ giao thông
2 buttton: 1 button tìm đường để bắt đầu quá trình tìm kiếm sau khi đã chọn điểm xuất phát và đich đến, 1 button thoát để thoát khỏi chương trình
32 button dùng để đánh dấu các mốc trên bản đồ
Trang 92 Các bước xây dựng chương trình
a Cấu trúc dữ liệu:
Yêu cầu của bài toán:: Không gian trạng thái được mô tả là bản đồ giao
thông của 1 xã, phường nào đó Hãy xây dựng chương trình cho phép tìm kiếm đường đi từ 1 điểm trên bản đồ đến 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Nhành và cận
Đầu vào: 1 bản đồ giao thông
Không gian trạng thái đang xét là 1 bản đồ giao thông:
- Các đường có mũi tên là đường 1 chiều, chiều đúng của đường là theo chiều mũi tên
Trang 10Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
- Đặt các button để xác định các điểm mốc
- Lưu tọa độ của button vào 1 mảng: vittribtn(2,n) (Chỉ số n >= số nút trên bản
đồ)
Nút A có tọa độ (Ax, Ay) sẽ được lưu trong mảng vitribtn như sau
Vitribtn(1,A) = Ax
Vitribtn(2,A) = Ay
vitribtn(1, 1) = 66
vitribtn(2, 1) = 51
vitribtn(1, 2) = 210
vitribtn(2, 2) = 6
vitribtn(1, 3) = 307
vitribtn(2, 3) = 25
vitribtn(1, 4) = 201
vitribtn(2, 4) = 67
vitribtn(1, 5) = 295
vitribtn(2, 5) = 88
vitribtn(1, 6) = 373
vitribtn(2, 6) = 101
vitribtn(1, 7) = 137
vitribtn(2, 7) = 162
vitribtn(1, 8) = 184
vitribtn(2, 8) = 171
vitribtn(1, 9) = 280
vitribtn(2, 9) = 193
vitribtn(1, 10) = 388
vitribtn(2, 10) = 216
vitribtn(1, 11) = 401
vitribtn(2, 11) = 127
vitribtn(1, 12) = 507
vitribtn(2, 12) = 242
vitribtn(1, 13) = 122
vitribtn(2, 13) = 202
vitribtn(1, 14) = 175
vitribtn(2, 14) = 222
vitribtn(1, 15) = 269
vitribtn(2, 15) = 252
vitribtn(1, 16) = 314
vitribtn(2, 16) = 266
vitribtn(1, 17) = 384
vitribtn(2, 17) = 289
vitribtn(1, 18) = 531
vitribtn(2, 18) = 273
vitribtn(1, 19) = 529
vitribtn(2, 19) = 327
vitribtn(1, 20) = 306
vitribtn(2, 20) = 291
vitribtn(1, 21) = 226
vitribtn(2, 21) = 314
vitribtn(1, 22) = 287
vitribtn(2, 22) = 336
vitribtn(1, 23) = 416
vitribtn(2, 23) = 366
vitribtn(1, 24) = 529
Trang 11vitribtn(2, 24) = 390
vitribtn(1, 25) = 69
vitribtn(2, 25) = 336
vitribtn(1, 26) = 182
vitribtn(2, 26) = 385
vitribtn(1, 27) = 258
vitribtn(2, 27) = 413
vitribtn(1, 28) = 42
vitribtn(2, 28) = 118
vitribtn(1, 29) = 150
vitribtn(2, 29) = 57
vitribtn(1, 30) = 2
vitribtn(2, 30) = 168
vitribtn(1, 31) = 376
vitribtn(2, 31) = 260
vitribtn(1, 32) = 146
vitribtn(2, 32) = 118
Mảng vitribth lần lượt lưu tọa độ của 32 nút từ 1 đến 32 tương ứng trên bản đồ
- Việc xác định đường 1 chiều và 2 chiều trên bản đồ được giải quyết như sau:
Khi đã có các mốc là các button,
Ví dụ đường Trần Phú trên bản đồ là đường 1 chiều Chiều đi của đường Trần Phú theo hướng các button ta đã đặt vào là:
12 -> 10 -> 9 -> 8 -> 7
Vậy: Ta chỉ đi được từ 12 đến 10 chứ ko đi được từ 10 đến 12
Đường Hùng Vương là đường 2 chiều, Chiều đi của đường Hùng Vương theo hướng các button:
14 -> 8 -> 4 -> 2
Hoặc: 2 -> 4 -> 8 -> 14
Vậy: Ta có thể đi từ 14 đến 8 hoăc 8 đến 14
Vì vậy: Ta dùng mảng duong2chieu(n,n) (Chỉ số n >= số nút trên bản đồ) để xác
định có đường đi hay ko từ nút A đến nút B Nếu từ nút A có thể đi đến nut B, ta cho giá trị duong2chieu(A,B) = 1, Nếu từ nút A ko thể đi đến nút B thì ta cho giá trị duong2chieu(A,B) = 0
Ví dụ: Vậy nếu duong2chieu(A,B) = 1 và duong2chieu(B,A) = 1 thì đường AB là
đường 2 chiều Nếu duong2chieu(A,B) = 1 nhưng duong2chieu(B,A) = 0 thì đường A đến B là đường 1 chiều, chỉ đi được từ A đến B và ko đi được từ B đến A
Việc gán vào mảng duong2chieu(50,50) này đồng thời cũng biến bản đồ ta có thành
1 đồ thì không gian trạng thái với các nút và đường đi giữa chúng
Trong bài toán cụ thể này, mảng duong2chieu có giá trị như sau:
Trang 12Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
duong2chieu(2, 29) = 1
duong2chieu(29, 2) = 1
duong2chieu(32, 28) = 1
duong2chieu(7, 32) = 1
duong2chieu(32, 29) = 1
duong2chieu(29, 32) = 1
duong2chieu(30, 13) = 1
duong2chieu(30, 28) = 1
duong2chieu(28, 30) = 1
duong2chieu(4, 29) = 1
duong2chieu(29, 4) = 1
duong2chieu(1, 29) = 1
duong2chieu(29, 1) = 1
duong2chieu(7, 28) = 1
duong2chieu(1, 28) = 1
duong2chieu(28, 1) = 1
duong2chieu(4, 2) = 1
duong2chieu(2, 4) = 1
duong2chieu(4, 8) = 1
duong2chieu(8, 4) = 1
duong2chieu(8, 7) = 1
duong2chieu(2, 3) = 1
duong2chieu(3, 2) = 1
duong2chieu(4, 5) = 1
duong2chieu(5, 4) = 1
duong2chieu(3, 5) = 1
duong2chieu(5, 3) = 1
duong2chieu(6, 3) = 1
duong2chieu(3, 6) = 1
duong2chieu(5, 6) = 1
duong2chieu(6, 5) = 1
duong2chieu(5, 9) = 1
duong2chieu(9, 5) = 1
duong2chieu(9, 8) = 1
duong2chieu(6, 11) = 1
duong2chieu(11, 6) = 1
duong2chieu(12, 11) = 1
duong2chieu(11, 12) = 1
duong2chieu(12, 18) = 1
duong2chieu(18, 12) = 1
duong2chieu(18, 19) = 1
duong2chieu(19, 24) = 1
duong2chieu(10, 11) = 1
duong2chieu(11, 10) = 1
duong2chieu(10, 9) = 1
duong2chieu(7, 13) = 1
duong2chieu(13, 7) = 1
duong2chieu(8, 14) = 1
duong2chieu(14, 8) = 1
duong2chieu(13, 14) = 1
duong2chieu(14, 15) = 1
duong2chieu(14, 21) = 1
duong2chieu(21, 14) = 1
duong2chieu(13, 25) = 1
duong2chieu(25, 13) = 1
duong2chieu(9, 15) = 1
duong2chieu(15, 9) = 1
duong2chieu(15, 16) = 1
duong2chieu(16, 17) = 1
Trang 13duong2chieu(17, 19) = 1
duong2chieu(16, 20) = 1
duong2chieu(20, 16) = 1
duong2chieu(17, 20) = 1
duong2chieu(20, 17) = 1
duong2chieu(21, 15) = 1
duong2chieu(26, 21) = 1
duong2chieu(25, 26) = 1
duong2chieu(26, 25) = 1
duong2chieu(27, 26) = 1
duong2chieu(20, 22) = 1
duong2chieu(22, 20) = 1
duong2chieu(23, 22) = 1
duong2chieu(22, 27) = 1
duong2chieu(27, 22) = 1
duong2chieu(24, 23) = 1
duong2chieu(18, 31) = 1
duong2chieu(31, 16) = 1
duong2chieu(17, 31) = 1
duong2chieu(31, 17) = 1
duong2chieu(10, 31) = 1
duong2chieu(31, 10) = 1
Sau khi gán giá trị cho mảng duong2chieu(n,n) ta có không gian trạng thái như sau:
Trang 14Thuật toán Nhánh và cận
Giáo viên hướng dấn : Ngô Hữu Phúc Sinh viên : Nguyễn Thế Định – Tin học 5A
Và bây giờ, bài toán tìm đường đi trên bản đồ chính là bài toán tìm đường đi trên không gian trạng thái trên
b Thuật toán:
Thuật toán tìm kiếm Nhánh và cận như đã trình bầy ở phần Cơ sở lý thuyết
đầu tiên cần xác định được điểm xuất phát và đích đến
- Nút xuất phát được nhập ở combobox1
- Dích đến được nhập ở combobox2
Hàm mục tiêu f(u) dùng để so sánh trong hàm Heuristic
F(u) = g(u) + h(u)
G(u): Quãng đường đi từ điểm xuất phát đến u
H(u): Giá trị ước lượng quãng đường từ u đến đích – Trong bài toán này h(u) là khoảng cách đường chim bay từ u đến đích
Trang 15Từ yêu cầu đó, ta cần có 1 hàm tính khoảng cách giữa 2 điểm
Public Function tinhkc( ByVal ox1 As Double , ByVal oy1 As Double , ByVal ox2 As Double , ByVal oy2 As Double ) As Double
Return (Math.Sqrt((ox2 - ox1) * (ox2 - ox1) + (oy2 - oy1) * (oy2 - oy1)))
End Function
Hàm tinhkc dùng để tính khoảng cách giữa 2 điểm A và B với tham số truyền và là ox1: tọa độ x của A,
oy1: tọa độ y của A,
ox2: tọa độ x của B
oy2: tọa độ y của B
Công thức tính quảng cách:
Math.Sqrt((ox2 - ox1) * (ox2 - ox1) + (oy2 - oy1) * (oy2 - oy1)))
Hàm trả về giá trị khoảng cách giữa A và B theo kiểu double
Hàm duyệt trạng thái con:
Public Sub dttcon(ByVal cha As Integer, ByVal gcha As Double)
nhocha = cha
demmc = 0
Dim kcconcha As Double
For i = 1 To 32
If duong2chieu(cha, i) = 1 Then
mangcon(0, demmc, cha) = i ' Gán nút con i vào mảng con
kcconcha = tinhkc(vitribtn(1, cha), vitribtn(2, cha), vitribtn(1, i), vitribtn(2, i)) ' Khoảng cách giữa nút con i và nút cha
mangcon(1, i, cha) = gcha + kcconcha 'Giá trị hàm G(i) hiện tại = G(cha) + kc từ nút con i đến cha
mangcon(2, i, cha) = tinhkc(vitribtn(1, i), vitribtn(2, i), vitribtn(1, dich), vitribtn(2, dich)) ' h(i) - Giá trị ước lượng từ nút con
i đến đích
demmc += 1
End If
Next
' Nếu số nút con > 1 thì xắp xếp các nút giảm dần theo giá trị f
Dim a, b, fa, fb As Double
If demmc > 1 Then
For i = 0 To demmc - 1
For j = i + 1 To demmc - 1
a = mangcon(0, i, cha)
b = mangcon(0, j, cha)
fa = mangcon(1, a, cha) + mangcon(2, a, cha)
fb = mangcon(1, b, cha) + mangcon(2, b, cha)
If fa < fb Then
temp = a
a = b