Tải bản đầy đủ (.docx) (19 trang)

Báo cáo trí tuệ nhân tạo :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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (501.78 KB, 19 trang )

Thuậ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
HỌ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
Thuậ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)
Thuậ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
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 đ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:
Thuậ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
Thuậ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 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:
Thuậ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
Thuậ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
- Độ 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:
II. Đồ án:
1. Giao diện của chương trình:
Thuậ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 đồ
Thuậ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
2. 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

Thuậ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
Thuậ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
vitribtn(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:
Thuậ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
Thuậ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(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:
Thuậ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
Thuậ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ừ 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
Thuậ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 = temp
mangcon(0, i, cha) = a
mangcon(0, j, cha) = b
End If
Next
Next
End If
If demmc = 0 Then
ktracon = True
Else
ktracon = False
End If
End
Tham số truyền vào gồm nút cha và G(nút cha)
Dùng vòng lặp for chạy biến i từ 1 đến số điểm mốc (32)
Nếu giá trị nào của i mà có đường đi từ nút cha đến nút I (duong2chieu(cha,i) = 1) thì
i đó chính là con của nút cha
Mỗi nút con i thì cần lưu lại 3 giá trị
-Lưu lại i
-Lưu lại giá trị h(i) - Quãng đường ước lượng từ nút i đến đích
-Lưu lại giá trị f(i) – f(i) = g(cha) + khoảng cách từ nút i đến nút cha
Với g(cha) là quãng đường đã đi qua của nút cha
-Lưu lại cha của nút i
Các giá trị đó Ta lưu vào 1 mảng là: mangcon(2,n) (n >= số nút trên bản đồ)
Mang(0,demmc,cha) lưu giá trị I (Giá trị nút con)
Mang(1, I, cha) lưu giá trị hàm G(i)

Mang(2, i, cha) lưu lại giá trị h(u)
Biến nhocha dùng để lưu lại cha nút i
Sau khi đã tìm ra các con i của nút cha,
Nếu số con từ 2 trở lên, ta dùng thuật toán xắp xếp nổi bọt để xắp xếp các con i tìm được
theo thứ tự giảm dần của giá trị f(i)
Nếu nút cha nhập vào ko có con, Ta trả về giá trị ktracon = false
Thuậ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
Sau khi đã xây dựng xong hàm duyệt trạng thái con (dttcon) ta bắt đầu đi vào thuật toán
tìm kiếm Nhánh và cận được thực hiện khi click button Tìm đường (btntimduong)
' Sự kiện khi click vào nút tìm đường
Private Sub btntimduong_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btntimduong.Click
khoitao()
Dim nutdangxet, nutcha, sonutdiqua, nhokqtoiuu, nhovitri, soduongdi
As Integer
Dim quangduong, cost, costphu, nhotam As Double
Mangduongdi(1, 50) = New Integer
mangvidu(1, 50) = New Integer
soduongdi = 0
sonutdiqua = 1
cost = 100000
quangduong = 0
Try
dich = Convert.ToDouble(ComboBox2.Text)
start = Convert.ToDouble(ComboBox1.Text)
stackduyet.Push(start)
stackduyet.Push(start)
Mangduongdi(0, 0) = start
Mangduongdi(1, 0) = start

lap:
If stackduyet.Count = 0 Then
GoTo ketqua
Else
nutdangxet = stackduyet.Pop
nutcha = stackduyet.Pop
temp = mangcon(1, nutdangxet, nutcha)
quangduong = temp + mangcon(2, nutdangxet, nutcha)
If nutdangxet = dich Then
soduongdi += 1
If quangduong < cost Then
' Lưu lại quãng đường tối ưu tr'c đó
costphu = cost
nhotam = nhokqtoiuu
For i = 0 To nhotam
mangvidu(0, i) = mangketqua(0, i)
mangvidu(1, i) = mangketqua(1, i)
Next
'Update quãng đường tối ưu mới
cost = temp
nhokqtoiuu = sonutdiqua ' Lưu lại vị trí sát đích
For i = 0 To sonutdiqua
mangketqua(0, i) = Mangduongdi(0, i)
mangketqua(1, i) = Mangduongdi(1, i)
Next
GoTo lap
Else
' Lưu lại đường đi khác
costphu = temp
Thuậ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
nhotam = sonutdiqua
For i = 0 To sonutdiqua
mangvidu(0, i) = Mangduongdi(0, i)
mangvidu(1, i) = Mangduongdi(1, i)
Next
'
GoTo lap
End If
Else
If quangduong < cost Then
dttcon(nutdangxet, mangcon(1, nutdangxet, nutcha))
' Nếu nút duyệt ko có con -> Bỏ qua
If ktracon = True Then
GoTo lap
End If
For i = 0 To sonutdiqua
If sonutdiqua > 2 Then
If nutdangxet = Mangduongdi(0, i) And
nutcha = Mangduongdi(1, i) Then
For j = i To sonutdiqua
Mangduongdi(0, j) = 0
Mangduongdi(1, j) = 0
Next
GoTo lap
End If
End If
Next
'Gán vào mảng tạm đường đi hiện tại
For i = 0 To sonutdiqua

If nutcha <> Mangduongdi(0, sonutdiqua - i)
Then
vitribtn(0, sonutdiqua - i) = 0
vitribtn(1, sonutdiqua - i) = 0
Else
nhovitri = sonutdiqua - i
Exit For
End If
Next
sonutdiqua = nhovitri + 1
Mangduongdi(0, sonutdiqua) = nutdangxet
Mangduongdi(1, sonutdiqua) = nutcha
For i = 0 To demmc - 1
stackduyet.Push(nhocha)
stackduyet.Push(mangcon(0, i, nhocha))
Next

Else
GoTo lap
End If
End If
GoTo lap
End If
ketqua:
' Đường đi tối ưu
Thuậ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
Label4.Text = Convert.ToString(cost * 2) + " (mét)"
For i = 1 To nhokqtoiuu
Label6.Text += Convert.ToString(mangketqua(0, i)) + " > "

Next
Label6.Text += Convert.ToString(dich)
' Hiển thị đường đi khác trong quá trình duyet:
If soduongdi > 1 Then
For i = 1 To nhotam
Label8.Text +=Convert.ToString(mangvidu(0, i)) + " >"
Next
Label8.Text = Label8.Text + Convert.ToString(dich) + " =
" + Convert.ToString(costphu * 2)
Else
Label8.Text = "Ko tim thay duong khi nao khac trong qua
trinh duyet"
End If
Catch ex As Exception
MsgBox("Nhập lại giá trị trong combobox")
End Try
End Sub
III Kết quá thu được từ chương trình tìm đường sử dụng thuật toán Nhánh và cận:
Khuôn khổ của đồ án này chỉ giới hạn trong việc minh họa cho thuật toán Nhánh và cận,
chứ chưa hướng tới việc áp dụng trong thực tế
Nếu muốn áp dụng cho thực tế thì sẽ cần nhiều thời gian và quá trình tìm hiểu hơn, sau khi
kết thúc môn học này, em mong thầy có thể giúp đỡ em để em hoàn thành chương trình 1
cách hoàn thiện hơn
Em xin cám ơn !
IV.Tài liệu tham khảo:
-Slide và bải giảng của thầy Ngô Hữu Phúc
-Và 1 số tài liệu khác

×