I.Mô tả bài toán-Phương pháp Tìm kiếm beam (beam search) giống như tìm kiếm theo bề rộng, nó phát triển các đỉnh ở một mức rồi phát triển các đỉnh ở mức tiếp theo. Tuy nhiên, trong tìm kiếm theo bề rộng, ta phát triển tất cả các đỉnh ở một mức, còn trong tìm kiếm beam, ta hạn chế chỉ phát triển k đỉnh tốt nhất (các đỉnh này được xác định bởi hàm đánh giá). Do đó trong tìm kiếm beam, ở bất kỳ mức nào cũng chỉ có nhiều nhất k đỉnh được phát triển, trong khi tìm kiếm theo bề rộng, số đỉnh cần phát triển ở mức d là bd (b là nhân tố nhánh). -Áp dụng vào bài toán: Một người cần tìm đường đi từ 1 điểm tới 1 điểm khác trên bản đồ của 1 phường, xã nào đó. Chỉ cần biết điểm bắt đầu và kết thúc đưa ra đường đi tối ưu đi được giữa 2 điểm đó.II.Mô tả chương trình1.Giao diện chương trình
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
Đề tài: Xây dựng chương trình cho phép tìm kiếm
đường đi từ 1 điểm tới 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Beam
Giáo viên hướng dẫn: Ngô Hữu Phúc
Sinh viên thực hiện : Văn Anh Đức
Lớp : TH5A
HÀ NỘI 3/2010
Trang 2I Mô tả bài toán
- Phương pháp Tìm kiếm beam (beam search) giống như tìm kiếm theo bề rộng, nó phát triển các đỉnh ở một mức rồi phát triển các đỉnh ở mức tiếp theo Tuy nhiên, trong tìm kiếm theo bề rộng, ta phát triển tất cả các đỉnh ở một mức, còn trong tìm kiếm beam, ta hạn chế chỉ phát triển k đỉnh tốt nhất (các đỉnh này được xác định bởi hàm đánh giá) Do đó trong tìm kiếm beam, ở bất kỳ mức nào cũng chỉ có nhiều nhất k đỉnh được phát triển, trong khi tìm kiếm theo bề rộng, số đỉnh cần phát triển ở mức d là bd (b là nhân tố nhánh)
- Áp dụng vào bài toán: Một người cần tìm đường đi từ 1 điểm tới 1 điểm khác trên bản đồ của 1 phường, xã nào đó Chỉ cần biết điểm bắt đầu và kết thúc đưa ra đường đi tối ưu đi được giữa 2 điểm đó
II Mô tả chương trình
1 Giao diện chương trình
Đây là giao diện chương trình mô tả bài toán gồm có:
+ 1Picturebox: Là 1 bản đồ diễn tả không gian trạng thái của bài toán với các vị trí đã được xác định trước
+ 2Combobox: Chứa danh sách các điểm xuất phát và địa điểm đích
+ 1Combobox: Chứa danh sách số các node hạn chế
Trang 3+ 1 lable show: chứa nội dung kết quả tìm đường của bài toán
2 Mô tả thuật toán
- Do yêu cầu bài toán đặt ra là sử dụng phương pháp tìm kiếm Beam nên thuật toán Beam được sử dụng chính trong bài toán này
- Áp dụng:
+ Tạo 1 mảng lưu trữ các trường: tọa độ x,y, tên và ID của các địa điểm tương ứng trên bản đồ
+ Khởi tạo mảng 2 chiều lưu trữ danh sách các địa điểm kề với điểm xuất phát
+ Khởi tạo hàm đánh giá Heuristic được tính bằng khoảng cách đường chim bay từ các điểm tới điểm đích
+ Chọn K node giới hạn + Tạo vòng lặp và kiểm tra
Nếu các node lưu trữ trong mảng chứa danh sách các đỉnh kề rỗng thì Stop.Thông báo tìm kiếm thất bại Loại trạng thái u ở đầu danh sách ra khỏi mảng
Xét các điểm kề với địa điểm bắt đầu và lưu vào trong 1 queue Sau đó đưa so sánh hàm đánh giá của các địa điểm này với nhau rồi sau đó sắp xếp các địa điểm này vào 1 mảng khác
Kiểm tra điều kiện của K; nếu k node vượt quá n địa điểm kề với node cha thì gán k=n
Nếu trạng thái u ở trạng thái kết thúc thì Stop Thông báo thành công
3 VD bài toán
Tìm đường đi từ Viện nghiên cứu địa chính-HQV đến ngã 4 nghĩa tân - Nguyễn phong Sắc
Nhập: điểm xuất phát (Start)- Viện nghiên cứu địa chính-HQV Điểm đích: (End)
Trang 4Chọn K=2
Click: Beamsearch
Và kết quả:
Trang 54 Mô tả code
Tạo class point với các trường i, j, name, ID và mảng lưu trữ danh sách địa điểm kề: ke
Public Class point
Public ke As New ArrayList()
Public x, s, y, ID As Integer
Public name As String
Public Sub New()
End Sub
Public Sub New(ByVal i As Integer, ByVal j As Integer, ByVal n As String, ByVal o As Integer)
x = i
y = j
name = n
ID = o
End Sub
End Class
Tạo sub dinhke() lưu tất cả các địa điểm kề với các điểm khác:
Public Sub dinhke()
lblshow.Text = ""
For i As Integer = 0 To 12
arr(i).ke.Clear()
Next
Trang 6arr(0).ke.Add(arr(1))
arr(0).ke.Add(arr(2))
arr(0).ke.Add(arr(3))
arr(0).ke.Add(arr(7))
arr(1).ke.Add(arr(0))
arr(1).ke.Add(arr(2))
arr(2).ke.Add(arr(0))
arr(2).ke.Add(arr(1))
arr(2).ke.Add(arr(3))
arr(2).ke.Add(arr(4))
arr(3).ke.Add(arr(0))
arr(3).ke.Add(arr(2))
arr(3).ke.Add(arr(4))
arr(3).ke.Add(arr(5))
arr(3).ke.Add(arr(7))
arr(4).ke.Add(arr(2))
arr(4).ke.Add(arr(3))
arr(4).ke.Add(arr(5))
arr(4).ke.Add(arr(11))
arr(5).ke.Add(arr(3))
arr(5).ke.Add(arr(4))
arr(5).ke.Add(arr(6))
arr(5).ke.Add(arr(7))
arr(6).ke.Add(arr(5))
arr(6).ke.Add(arr(7))
arr(6).ke.Add(arr(8))
arr(6).ke.Add(arr(9))
arr(7).ke.Add(arr(0))
arr(7).ke.Add(arr(3))
arr(7).ke.Add(arr(5))
arr(7).ke.Add(arr(6))
arr(7).ke.Add(arr(8))
arr(8).ke.Add(arr(7))
arr(8).ke.Add(arr(9))
arr(8).ke.Add(arr(10))
arr(9).ke.Add(arr(6))
arr(9).ke.Add(arr(8))
arr(9).ke.Add(arr(10))
arr(10).ke.Add(arr(8))
arr(10).ke.Add(arr(9))
arr(10).ke.Add(arr(11))
arr(10).ke.Add(arr(12))
arr(11).ke.Add(arr(7))
arr(11).ke.Add(arr(10))
arr(11).ke.Add(arr(12))
arr(12).ke.Add(arr(10))
arr(12).ke.Add(arr(11))
End Sub
Click Load form ta khởi tạo các tọa độ, tên, ID và các đỉnh kề tương ứng với các địa điểm:
dinhke()
Trang 7arr(0) = New point(130, 30, "Viện nghiên cứu địa chính-HQV" , 0) arr(1) = New point(41, 238, "Phạm Văn Đồng" , 1)
arr(2) = New point(266, 250, "Trần Quốc Hoàn" , 2)
arr(9) = New point(724, 190, "Ngã 3 Tô Hiệu" , 9)
arr(10) = New point(757, 328, "CV Nghĩa Đô" , 10)
arr(11) = New point(527, 370, "Trần Đăng Ninh" , 11)
arr(12) = New point(670, 486, "Chùa Hà" , 12)
Tạo hàm đánh giá “dodai”:
Function dodai(ByVal d1 As point, ByVal d2 As point) As Double
Return Math.Sqrt(Math.Pow((d1.x - d2.x), 2) + Math.Pow((d1.y - d2.y),2)) End Function
Tạo Sub Beam search thực hiện thuật toán áp dụng
Gán và lưu trữ 2 giá trị của điểm bắt đầu và kết thúc vào 2 biến “pend” và
“pstart”
Tạo vòng lặp và kiểm tra: nếu trường tên trong mảng arr(i) trùng tên trên
combobox bắt đầu thì gán “pstart” =arr(i) và đưa vào cuối mảng Queue và thoát khỏi vòng lặp
For i As Integer = 0 To 12
If (arr(i).name = cmbs.Text) Then
pstart = arr(i)
q.Enqueue(arr(i))
Exit For
End If
Next
Với điểm kết thúc tương tự nhưng ta không đưa điểm kết thúc vào mảng queue:
For i As Integer = 0 To 12
If (arr(i).name = cmbe.Text) Then
pend = arr(i)
Exit For
End If
Next
Khai báo biến found kiểu booloean = false
Trang 8Tạo vòng lặp với điều kiện số phần tử trong queue “số con của điểm cha khác rỗng”
While (q.Count <> 0)
Đưa giá trị trong mảng queue ra xét và gán vào biến p kiểu point Sau đó kiểm tra: nếu ID của điểm đích trùng với ID trong mảng queue thì tìm kiếm thành công thoát khỏi vòng lặp “While”
While (q.Count <> 0)
p = q.Dequeue()
If (p.ID = pend.ID) Then
found = True
Exit While
End if
Vòng lặp duyệt các điểm kề với điểm bắt đầu và lưu trữ trong mảng queue Đồng
thời xóa điểm bắt đầu ra khỏi mảng queue
For Each diemke In p.ke
For l = 0 To diemke.ke.Count - 1
px = diemke.ke(l)
If (px.ID = p.ID) Then
diemke.ke.RemoveAt(l)
Exit For
End If
Next
q.Enqueue(diemke)
father(diemke.ID) = p.ID
Next
lưu trữ ID của node cha vào mảng father(.ID)
Đưa queue ra 1 mảng rồi sắp xếp mảng đó theo thứ tự tăng dần sau đó lại đưa lại vào queue:
For Each diem As point In q
phu(i) = diem
i += 1
Next
For i = 0 To n - 1
For j As Integer = i + 1 To n
If dodai(phu(i), p) > dodai(phu(j), p) Then
Dim ph As point = phu(i)
phu(i) = phu(j)
phu(j) = ph
End If
Next
Trang 9Next
Clear()
Xét điều kiện K node do user chọn So sánh k với số node n trong queue
Nếu n< k thì gán k=n
Dim k As Integer = Integer.Parse(cmbk.Text) - 1
If (n < k) Then k = n
Lặp quá trình đưa k node kề vào trong queue
For i = 0 To k
q.Enqueue(phu(i))
Next
Kết thúc vòng lặp while
Thực hiện quá trình hiển thị lộ trình đi trên lblshow:
If found Then
MsgBox( "Found Success" , MsgBoxStyle.Information, "Happi" )
demw = 1
Dim w As New point()
w = pend
Dim s As Integer = 0
arrw(0) = w
Dim so As Integer = w.ID
lblshow.Text += w.name & vbNewLine
While (so <> pstart.ID)
so = father(so)
s += 1
For i As Integer = 0 To 12
If arr(i).ID = so Then
demw += 1
arrw(s) = arr(i)
lblshow.Text += "<++ " + arr(i).name & vbNewLine End If
Next
End While
End If
Ở btnbeam ta xử lý = 1 số lệnh hỏi và gọi sub beamsearch() và sub vẽ đường đi trên bản đồ ra:
isDraw = True
If cmbs.Text = "" Then
MsgBox( "Choose start point" , MsgBoxStyle.Information, "Try again" ) ElseIf cmbe.Text = "" Then
MsgBox( "Choose end point" , MsgBoxStyle.Information, "Try again" ) ElseIf cmbk.Text = "" Then
MsgBox( "Choose K" , MsgBoxStyle.Information, "Try again" )
Else
Call beamsearch()
Call picb1.Invalidate()
End If
Trang 10III Kết luận đánh giá
- Thuật toán luôn cho kết quả nếu có đường đi từ điểm xuất phát tới điểm đích tuy nhiên sử dụng hàm đánh giá trong bài toán này là
đường chim bay giữa các địa điểm với nhau nên tìm ra lời giải tối ưu chưa đạt được
- Chương trình mô phỏng thuật toán với hàm đánh giá Heuristic áp dụng theo bài giảng chỉ đáp ứng được yêu cầu của đề bài nên còn rất nhiều hạn chế khi áp dụng thực tế Một phần nữa là do khả năng viết chương trình còn hạn chế nên chưa lột tả được hết đặc tính ưu việt của bài toán nên mong được sự đóng góp và đánh giá của thầy Em xin chân thành cám ơn