Tải bản đầy đủ (.doc) (10 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 tới 1 điểm khác trên bản đồ theo phương pháp tìm kiếm Beam

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 (421.9 KB, 10 trang )

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.

×