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 tới 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Beam

10 1.8K 5
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 tới 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Beam

Đang tải... (xem toàn văn)

Thông tin tài liệu

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

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 Đề 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 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à b d (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ế + 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) Chọn K=2 Click: Beamsearch Và kết quả: 4. 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 arr(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() arr(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(3) = New point(442, 160, "Ngã 4 Nghĩa Tân, Nguyễn Phong Sắc", 3) arr(4) = New point(459, 249, "Ngã 4 Nguyễn Phong Sắc, Tô Hiệu", 4) arr(5) = New point(522, 157, "Ngã 4 tập thể nghĩa Tân", 5) arr(6) = New point(623, 154, "Sân vận động Nghĩa Tân", 6) arr(7) = New point(542, 37, "Cao đẳng SP mẫu giáo TW", 7) arr(8) = New point(765, 33, "Nguyễn Văn Huyên –HQV", 8) 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 Tạ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 Next 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 III. 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. . 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),. 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 . MsgBoxStyle.Information, "Try again") ElseIf cmbe.Text = "" Then MsgBox("Choose end point", MsgBoxStyle.Information, "Try again") ElseIf cmbk.Text = ""

Ngày đăng: 25/03/2014, 20:52

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan