Báo cáo môn trí tuệ nhân tạo I-Đề tài: Mô tả không gian trạng thái bài toán người đưa thư(Travelling Saleman Problem – PST) và dùng giải thuật Local Search để giải quyết. II-Mô tả bài toán: - Bài toán người đưa thư là một bài toán cổ điển, thuộc tối ưu rời rạc hay tổ hợp. Đây là một minh họa điển hình cho lớp bài toán trong lý thuyết độ phức tạp tính toán. - Nội dung: Có một người giao hàng cần đi giao hàng tại n thành phố. Xuất phát từ một thành phố nào đó, đi qua các thành phố khác để giao hàng và trở về thành phố ban đầu. Mỗi thành phố chỉ đến một lần, khoảng cách từ một thành phố đến các thành phố khác là xác định được. Hãy tìm một chu trình (một đường đi khép kín thỏa mãn điều kiện trên) sao cho tổng độ dài các cạnh là nhỏ nhất. III-Giao diện chính của chương trình: Chương trình được thiết kế trên Visual Basic 2005 sử dụng ngôn ngữ VB.Net.
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 2Báo cáo môn trí tuệ nhân tạo
I-Đề tài:
Mô tả không gian trạng thái bài toán người đưa thư(Travelling Saleman Problem – PST) và dùng giải thuật Local Search để giải quyết
II-Mô tả bài toán:
- Bài toán người đưa thư là một bài toán cổ điển, thuộc tối ưu rời rạc hay tổ hợp Đây là một minh họa điển hình cho lớp bài toán trong lý thuyết độ phức tạp tính toán
- Nội dung: Có một người giao hàng cần đi giao hàng tại n thành phố Xuất phát từ một thành phố nào đó, đi qua các thành phố khác để giao hàng và trở về thành phố ban đầu Mỗi thành phố chỉ đến một lần, khoảng cách từ một thành phố đến các thành phố khác là xác định được Hãy tìm một chu trình (một đường đi khép kín thỏa mãn điều kiện trên) sao cho tổng độ dài các cạnh là nhỏ nhất
III-Giao diện chính của chương trình:
Chương trình được thiết kế trên Visual Basic 2005 sử dụng ngôn ngữ VB.Net
Trang 3Bao gồm:
- Picturebox: để biểu diễn không gian trạng thái của bài toán
- Textbox: để nhập vào số thành phố
- Nút khởi tạo: khởi tạo các trọng số (khoảng cách giữa 2 thành phố)
- Nút Generate để vẽ không gian trạng thái của bài toàn dựa vào số thành phố nhập vào
- Combobox: chọn điểm (thành phố)xuất phát
- Chạy: chạy thuật toán local search để tìm đường đi ngắn nhất cho bài toán
IV- Ví dụ:
- Số thành phố nhập vào là 5
- Khởi tạo trọng số (khoảng cách) giữa các thành phố như hình vẽ:
Trang 4- Sau khi chạy chương trình với điểm xuất phát là thành phố 2 ta được kết quả như sau:
Đường đi ngắn nhất của ví dụ là đường màu đỏ và có tổng độ dài là 101
Có thể thử thay đổi điểm xuất phát để thấy rằng: kết quả của bài toán có thay đổi nhưng ít hoặc không đáng kể
Trang 5V- Thuật toán:
Thuật toán chính được sử dụng trong chương trình là Local Search Theo
đó sau khi điểm xuất phát được xác định thì thuật toán sẽ tìm tại điểm đó có những đường nào có thể đi tiếp và chọn ra đường đi ngắn nhất Cho đến khi đi hết tất cả các thành phố phải qua rồi quay lại điểm xuất phát, mỗi thành phố chỉ
đi qua một lần
Hạn chế chính của thuật toán: đây là giải thuật mang tính local, không kèm theo sự ước lượng và phán đoán Do đó lời giải của bài toàn thường là không tối
ưu Và thuật toán dễ rơi vào vòng lặp không thoát ra được
Áp dụng vào bài toán người đưa thư:
- Khởi tạo số thành phố
- Khai báo 1 mảng 2 chiều a(i, j) để lưu khoảng cách giữa các thành phố với
i và j là số thành phố
- Nhập dữ liệu (khoảng cách) cho mảng
- Chọn điểm xuất phát s
- Xét giá trị của mảng a(s, j):
tìm min (a(s, j))
Xác định j tại đó a(s,j) min
- J sẽ là thành phố được đi qua tiếp theo
- Trước khi xét tiếp đỉnh J phải xóa đi giá trị a (s, j) và a (j, s) để đảm bảo sẽ không quay lại thành phố vừa đi qua
- Tiếp tục xét giá trị của mảng a(s, j) (với s = j) và lặp lại quá trình trên Nhưng lần này khi xóa thì sẽ xóa cả mảng a (s, j) và mảng a(j,s)
- TH1: Nếu trong quá trình xét mà xác định được điểm tiếp theo chính là điểm xuất phát thì sẽ kiểm tra xem đã đi đủ số thành phố cần đi qua chưa Nếu chưa thì sẽ quay lại đỉnh vừa rồi và xét tiếp trừ điểm xuất phát ra Ngược lại nếu đã đủ số thành phố cần đi qua thì dừng thuật toán
Trang 6- TH2: Nếu điểm tiếp theo chỉ có còn điểm xuất phát mà số thành phố đi qua chưa đủ thì đó là bài toán không có lời giải Dừng thuật toán
- TH3: Hoặc sau khi đến thành phố thứ n (không phải thành phố xuất phát)
mà không còn đường đi tiếp thì đấy cũng là bài toán không có lời giải Dừng thuật toán
- Từ đầu thuật toán sẽ có 1 biến đếm để đếm độ dài quãng đường đã đi qua
VI – Code:
a Nút khởi tạo:
- Số thành phố nhập vào nhỏ hơn 2 thì báo lỗi
If tp <= 2 Then
MsgBox("So thanh pho nhap vao phai lon hon 2") Exit Sub
Else
- Gán giá trị cho các phần tử trong 2 mảng a(i,j) và a1(i,j)
For i = 1 To tp
For j = 1 To tp
a(i, j) = max
a1(i, j) = max
Next
Next
- Nhập khoảng cách giữa các thành phố vào nửa ma trận chéo trên của a(i,j)
For i = 1 To tp
For j = i + 1 To tp
a(i, j) = InputBox("Nhap khoang cach tu thanh pho " & i & " den thanh pho " & j, "", max)
a(j, i) = a(i, j)
Next
Next
End If
Trang 7b Nút Generate:
- Tạo 1 mảng chứa các phần tử có giá trị random để gán cho các điểm Randomize()
For i = 1 To (tp * 2)
random(i) = Int(Rnd() * 400) + 1
Next
- Tạo số point đúng bằng số thành phố nhập vào (mỗi point là một thành phố):
ứng với mỗi point sẽ là 1 vòng tròn và số thứ tự của point đó
Dim f As Integer = 1
Dim font As New Font("arial", 16)
For i = 1 To tp
point(i) = New Point(random(f), random(f + 1)) g.DrawEllipse(pen3, random(f) - 10, random(f + 1) - 10, 20, 20)
g.DrawString(Convert.ToString(i), font,
Brushes.BlueViolet, random(f) - 10, random(f + 1) - 10)
f += 2
Next
- Kiểm tra trong mảng a(i,j) nếu có giá trị khác max thì nối point i với point j
For i = 1 To tp
For j = i + 1 To tp
If (a(i, j) <> max) Then
g.DrawLine(pen, point(i), point(j)) End If
Next
Next
- Add tọa độ các point vào combobox (mỗi point sẽ là 1 phần tử của
combobox)
For i = 1 To tp
Trang 8ComboBox1.Items.Add(point(i))
Next
c Nút Chạy:
- Lấy chỉ số của phần tử mà combobox đang được chỉ định
Dim index As Integer = ComboBox1.SelectedIndex + 1
- Đổ giá trị trong mảng a(i,j) vào mảng a1(i,j) để lưu lại các giá trị khởi tạo ban đầu
For i = 1 To tp
For j = 1 To tp
a1(i, j) = a(i, j)
a1(j, i) = a(j, i)
Next
Next
- Tìm đoạn đường ngắn nhất xuất phát từ điểm ban đầu
For i = 1 To tp
If (a1(index, i) < min) Then
min = a1(index, i)
End If
Next
dodai += min
For i = 1 To tp
If a1(index, i) = min Then
t = i
duongdi(2) = t
End If
Next
a1(index, t) = max
a1(t, index) = max
Dim dem As Integer = 1
- Tìm đoạn đường ngắn nhất từ điểm hiện tại đến các điểm tiếp theo
Trang 9For j = 1 To tp - 1
min = max
For i = 1 To tp
If a1(t, i) < min Then
min = a1(t, i)
End If
Next
dodai += min
- TH1: không về được điểm xuất phát hoặc về được điểm xuất phát nhưng không qua được tất cả các đỉnh
If min = max Then
MsgBox("Bai toan khong co loi giai")
Exit Sub
End If
t2 = t
For i = 1 To tp
If a1(t, i) = min Then
t = i
Exit For
End If
Next
If t = index Then
- TH2: tìm được điểm xuất phát sau khi đi hết các TP
If dem = tp - 1 Then
dem += 1
duongdi(j + 2) = i
Exit For
- TH3: Về điểm xuất phát nhưng chưa qua hết các TP Quay lại đỉnh trước
đó và bỏ qua đỉnh xuất phát ở lần xét tiếp theo
Else
a1(index, t2) = max
Trang 10a1(t2, index) = a1(index, t2)
t = t2
j -= 1
dodai -= min
Continue For
End If
Else
- Sau khi tìm được đỉnh đến tiếp theo thì xóa hết các thông tin của đỉnh trước đấy trong mảng a1(i,j) để đảm bảo không bị quay lại
dem += 1
duongdi(j + 2) = i
For i = 1 To tp
a1(t2, i) = max
a1(i, t2) = max
Next
Continue For
End If
Next
- Thông báo thứ tự các thành phố đã đi qua và tổng độ dài của đoạn đường
For i = 1 To tp
MsgBox(duongdi(i))
g.DrawLine(pen2, point(duongdi(i)),
point(duongdi(i + 1)))
Next
MsgBox("Tong do dai doan duong la " & dodai)
- Refresh lại combobox và picturebox khi chọn thành phố khác
dodai = 0
For i = 1 To tp
point(i) = New Point(random(f), random(f + 1)) g.DrawEllipse(pen3, random(f) - 10, random(f + 1) - 10, 20, 20)
g.DrawString(Convert.ToString(i), font,
Brushes.BlueViolet, random(f) - 10, random(f + 1) - 10)
f += 2
Next
For i = 1 To tp
For j = i + 1 To tp
Trang 11If (a(i, j) <> max) Then
g.DrawLine(pen, point(i), point(j))
End If
Next
Next
VII- Nhận xét và đánh giá:
- Về thuật toán:Đối với tất cả những bài toán thuộc lớp PTS (có lời giải) thì thuật toán local search luôn cho lời giải mặc dù lời giải không phải là tối
ưu Tuy nhiên lời giải sẽ gần như không có đột biến và nếu rơi vào vòng lặp hoặc đường cụt thì sẽ không thoát ra được Chẳng hạn như bài toán đang xét là có lời giải, nhưng vì tại 1 điểm, thuật toán chọn giá trị nhỏ nhất, dẫn đến ngõ cụt thì bài toán đấy trở thành không có lời giải
- Về chương trình:Do chương trình được viết trong thời gian ngắn và chỉ mang tính chất mô phỏng thuật toán nên còn rất nhiều hạn chế về mặt lâp trình
Giao diện vẫn còn phức tạp
Chương trình khi chạy tốn bộ nhớ
- Cuối cùng do còn thiếu kinh nghiệm về lập trình cũng như sự hạn chế về mặt thuật toán nên chương trình chỉ có thể mô tả được một cách đơn giản nhất của thuật toán Mong thầy bỏ qua và tiếp tục hướng dẫn em