Báo cáo môn học Nhập môn trí tuệ nhân tạo Đề bài: Không gian trạng thái được mô tả là một bản đồ giao thông của một 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ừ một đỉểm nào đó trên bản đồ đến một điểm khác trên bản đồ bằng phương pháp tìm kiếm Greedy Best First Search. Tên học viên: Khuất Đình Đăng Giảng viên: TS. Ngô Hữu Phúc Yêu cầu: Mô phỏng bằng chương trình. Ngôn ngữ sử dụng là VC++.Net hoặc C#.NET I.Phương pháp tìm kiếm Greedy Best First Search Phương pháp tìm kiếm Greedy Best First Search là một dạng đặc biệt của phương pháp tìm kiếm Greedy Best First Search. Lấy ý tưởng của giải thuật tìm kiếm theo chiều rộng kết hợp với hàm đánh giá để tìm kiếm trong không gian trạng thái. 1.Hàm đánh giá. a.Khái niệm. Trong tìm kiếm sử dụng kinh nghiệm, ta xây dựng một hàm đánh giá h(n). Với mỗi trạng thái u thuộc vào không gian trạng thái, hàm đánh giá sẽ xác định “giá” của trạng thái đó. “Giá” của u là một giá trị số h(u) tượng trưng cho “độ tốt” của trạng thái u, tức là khả năng từ u đi được đến đích. Trong tìm kiếm sử dụng kinh nghiệm, hàm đánh giá có vai trò rất quan trọng. Nếu xây dựng được hàm đánh giá tốt, việc tìm kiếm sẽ rất nhanh. Ngược lại, với một hàm đánh giá tồi, công việc tìm kiếm có thể đi chệch hướng và tìm kiếm kém hiệu quả. Không có một phương pháp chung để xây dựng hàm đánh giá tổng quát cho mọi bài toán. Việc xây dựng hàm đánh giá tùy thuộc vào vấn đề cần giải quyết. b.Một số ví dụ về hàm đánh giá.
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 học Nhập môn trí tuệ nhân tạo
Đề bài:
Không gian trạng thái được mô tả là một bản đồ giao thông của một 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ừ một đỉểm nào đó trên bản đồ đến một điểm khác trên bản đồ bằng phương pháp tìm kiếm Greedy Best First Search
Tên học viên:
Khuất Đình Đăng
Giảng viên:
TS Ngô Hữu Phúc
Yêu cầu:
Mô phỏng bằng chương trình Ngôn ngữ sử dụng là VC++.Net hoặc C#.NET
Trang 3I Phương pháp tìm kiếm Greedy Best First Search
Phương pháp tìm kiếm Greedy Best First Search là một dạng đặc biệt của phương pháp tìm kiếm Greedy Best First Search Lấy ý tưởng của giải thuật tìm kiếm theo chiều rộng kết hợp với hàm đánh giá
để tìm kiếm trong không gian trạng thái
1 Hàm đánh giá
a Khái niệm
Trong tìm kiếm sử dụng kinh nghiệm, ta xây dựng một hàm đánh giá h(n) Với mỗi trạng thái u thuộc vào không gian trạng thái, hàm đánh giá sẽ xác định “giá” của trạng thái đó “Giá” của u là một giá trị số h(u) tượng trưng cho “độ tốt” của trạng thái u, tức là khả năng từ u đi được đến đích
Trong tìm kiếm sử dụng kinh nghiệm, hàm đánh giá có vai trò rất quan trọng Nếu xây dựng được hàm đánh giá tốt, việc tìm kiếm sẽ rất nhanh Ngược lại, với một hàm đánh giá tồi, công việc tìm kiếm có thể đi chệch hướng và tìm kiếm kém hiệu quả Không có một phương pháp chung để xây dựng hàm đánh giá tổng quát cho mọi bài toán Việc xây dựng hàm đánh giá tùy thuộc vào vấn đề cần giải quyết
b Một số ví dụ về hàm đánh giá
Trong bài toán tìm kiếm đường đi trên bản đồ, có thể xây dựng hàm đánh giá:
Đường chim bay từ thành phố này sang thành phố khác, hoặc
Sử dụng khoảng cách thực trên đường đi giữa các thành phố, hoặc
Sử dụng cả khoảng cách và một số trọng số khác ảnh hưởng tới việc tìm kiếm (đóng vai trò làm tăng thời gian di chuyển giữa các thành phố),
Xét bài toán 8 số, ta có thể xây dựng hàm đánh giá như sau:
Hàm H1: với một trạng thái u, H1(u) là số quân ở sai vị trí // H1(u) = 4
Trạng thái đích
Trang 4Trạng thái đích u
Hàm H2: H2(u) là tổng khoảng cách giữa vị trí quân ở trạng thái u với vị trí ở trạng thái đích // H2(u) = 9
2 Phương pháp Greedy Best First Search
a Ý tưởng
Tìm kiếm Greedy Best First Search = tìm kiếm theo chiều rộng + hàm đánh giá
Hàm đánh giá sử dụng trong phương pháp tìm kiếm này là hàm ước lượng giá từ trạng thái u đến trạng thái đích Tức là xác định khả năng từ trạng thái u đi được đến trạng thái đích Node được lựa chọn để phát triển ở bước kế tiếp là node có “giá” đến trạng thái đích “tốt nhất” theo yêu cầu bài toán Tức là chọn node “được cho là” gần với trạng thái đích nhất để phát triển
Ví dụ: trong tìm kiếm trên bản đồ, hàm h(n) = Khoảng cách theo đường chim bay từ n đến thành
phố đích
Tìm kiếm đường đi với giá tính theo Km:
Trang 5Ở ví dụ trên, xuất phát từ thành phố Arad đi đến đích là thành phố Bucharest.
b Cài đặt
Sử dụng hàng đợi có ưu tiên Sắp xếp các node trong hàng đợi theo thứ tự tăng dần của hàm đánh giá
Procedure Greedy_Best_First_Search;
Begin
Khởi tạo queue L chỉ chứa trạng thái ban đầu;
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 queue 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 do
Xen v vào queue L sao cho các node trong L được sắp xếp theo thứ tự tăng dần của hàm đánh giá;
Trang 6c Đánh giá giải thuật GBFS
Tính đủ: Không Có thể vào vòng lặp quẩn (trường hợp bài toán có không gian trạng thái vô
hạn và ta duyệt phải nhánh vô hạn trong khi nghiệm của bài toán không nằm trên nhánh đó.)
Độ phức tạp thời gian: O(bm) Nếu hàm heuristic xấp xỉ tốt trong thực tế thì thời gian chạy
sẽ giảm đi rất nhiều
Độ phức tạp không gian: O(bm) Lưu trữ tất cả các Nodes.
Tính tối ưu: do không có tính đủ nên giải thuật này cũng không có tính tối ưu.
Trang 7II Các kết quả đạt được
1 Mô phỏng bản đồ giao thông xã, phường
Bản đồ giao thông xã, phường được mô tả trong chương trình như một đồ thị vô hướng Mỗi đỉnh của đồ thị tượng trưng cho một điểm trên bản đồ Mỗi đỉnh được gán một số thứ tự Mỗi cạnh nối 2 đỉnh trên đồ thị tượng trưng cho đường nối giữa 2 điểm trên bản đồ Trọng số gắn với mỗi cạnh nối 2 đỉnh của đồ thị tượng trưng cho khoảng cách thực tế giữa 2 điểm trên bản đồ
Giá trị được ghi trên mỗi cạnh của
đồ thị là khoảng cách thực tế giữa 2 điểm trên bản đồ Giá trị được ghi dưới mỗi đỉnh của đồ thị là giá trị hàm
Giá trị của hàm đánh giá h(n) tại mỗi đỉnh u thuộc không gian trạng thái được xác định bằng tổng khoảng cách theo đường chim bay từ trạng thái u đến trạng thái đích và khoảng cách thực tế từ trạng thái trước đó đã expand ra trạng thái u đến nó
h(u) = d cb (u, e) + d(father(u),u)
Trong đó, dcb(u,e) là khoảng cách tính theo đường chim bay từ u đến đích; father(u) là trạng thái
“cha” của trạng thái u, trước đó đã expand ra u; d(father(u),u) là khoảng cách thực tế từ father(u) đến u
3 Kết quả làm được
a Các bước xây dựng bản đồ và tìm đường trên bản đồ
Click vào background để tạo các đỉnh
Click vào đỉnh và rê chuột đến đỉnh khác để tạo cạnh nối sau đó nhập độ dài cạnh nối
Trang 8 Nhập đỉnh bắt đầu và đỉnh kết thúc.
Nhấn Tìm để bắt đầu tìm kiếm
Thông báo kết quả thông qua MessageBox và RichTextBox
b Cấu trúc chương trình
Các lớp của chương trình:
Lớp dinh mô tả các đỉnh của đồ thị tương ứng với các điểm trên bản đồ Lớp này được
khai báo các thuộc tính như sau:
private Graphics gr;
private int x, y, ID;
private int r = 30;
public double H;
private SolidBrush sbr = new SolidBrush ( Color Blue); private bool selected;
- gr, sbr được sử dụng để hiển thị hình dạng đỉnh
- x, y xác định vị trí tâm của đỉnh
- ID xác định số thứ tự đỉnh
- R: bán kính đỉnh (đỉnh được thể hiện là một hình tròn bán kính r)
- H là giá trị hàm đánh giá tại đỉnh
- Selected xác định đỉnh có đang được chọn bằng chuột hay không
Các phương thức chính của lớp:
public bool ifChecked( int _x, int _y) xác định có phải đỉnh đang được trỏ đến bởi chuột hay không.
public void show( PaintEventArgs e)
hiển thị đỉnh bằng một hình tròn bán kính r và số thứ tự đỉnh.
public void showH( PaintEventArgs e)
hiển thị giá trị hàm đánh giá bên dưới hình tròn.
Lớp canh mô tả các cạnh của đồ thị tương ứng với các đường đi trên bản đồ Các thuộc tính của lớp canh
private int xdau, ydau, xcuoi, ycuoi;
// tọa độ 2 đỉnh của cạnh.
Trang 9private int dinhdau, dinhcuoi;
// số thứ tự 2 đỉnh.
private Graphics gr;
private Pen pen = new Pen ( Color Black, 1);
// gr và pen dùng để “vẽ” cạnh ra màn hình
private int dodai;
// độ dài cạnh
Các phương thức của lớp:
public void show( PaintEventArgs e)
// hiển thị cạnh ra màn hình là một đường thẳng
public void showS( PaintEventArgs e)
// hiển thị độ dài cạnh
Lớp bando thực chất là ma trận kể của đồ thị Lớp này chỉ có 2 thuộc tính, một mảng 2 chiều public int[,] duongdi; chính là ma trận kề của đồ thị và một số nguyên public int sophantu; thể hiện số chiều của ma trận Lớp này có 2 contructor tính toán giá trị của ma trận kề dựa vào các đỉnh và các cạnh của đồ thị
Lớp GBFS định nghĩa thuật toán GBFS Các thuộc tính của lớp được khai báo như sau:
ArrayList alC;
// mảng các cạnh của đồ thị
ArrayList alD;
// mảng các đỉnh của đồ thị
dinh start, end;
// đỉnh bắt đầu và đỉnh kết thúc
int tongquangduong;
// độ dài đường đi tìm được từ đỉnh đầu đến đỉnh kết thúc int sodinh;
// số đỉnh của đồ thị
int [,] Matrix;
// ma trận kề của đồ thị
Các phương thức của lớp:
public double birdFly( dinh p)
Trang 10// trả về khoảng cách đường chim bay từ đỉnh p đến đỉnh kết thúc
double F( dinh p, dinh cha)
// tính toán giá trị hàm đánh giá tại p
public void GBFS_algorith( RichTextBox r, ArrayList
arrlCanh)
// tìm kiếm đường đi từ đỉnh bắt đầu đến đỉnh kết thúc bằng thuật toán GBFS Thông báo kết quả thông qua RichTextBox và MessageBox
c Xử lí các sự kiện
Sự kiện Paint của PictureBox:
// hiển thị các cạnh, các đỉnh của đồ thị
Sự kiện nhấn chuột:
private void pictureBox1_MouseDown( object sender,
{
//nếu nhấn chuột trái
if (e.Button == MouseButtons Left)
{
foreach ( dinh temp in pList)
// nếu nhấn vào một đỉnh
if (temp.ifChecked(e.X, e.Y))
{
drag = true ;
// cập nhật tọa độ đỉnh đầu, đỉnh cuối của cạnh trùng với tọa độ tâm đỉnh được nhấn
c.X1 = c.X2 = temp.X;
c.Y1 = c.Y2 = temp.Y;
Trang 11// lưu ID đỉnh đầu cạnh = ID đỉnh đang được nhấn
c.P1 = temp.getID;
return ;
}
// nếu đang nhấn 1 vị trí “trống”
if (ID <= 14)
{
ID++;
// thêm một đỉnh vào mảng các đỉnh
pList.Add( new dinh (ID, e.X, e.Y));
}
}
pictureBox1.Invalidate();
}
Sự kiện di chuyển chuột:
private void pictureBox1_MouseMove( object sender,
{
// nếu trước đó vừa nhấn vào một đỉnh
if (drag)
{
// cập nhật tọa độ đỉnh cuối của cạnh bằng với tọa độ chuột hiện tại
c.X2 = e.X; c.Y2 = e.Y;
}
foreach ( dinh temp in pList)
// cập nhật lại trạng thái các đỉnh (có đang được chuột trỏ vào hay không)
temp.ifChecked(e.X, e.Y);
pictureBox1.Invalidate();
Trang 12}
Sự kiện nhả chuột:
private void pictureBox1_MouseUp( object sender,
{
foreach ( dinh temp in pList)
{
// nếu vị trí chuột hiện tại trùng với vị trí tâm của một đỉnh và trước đó đã nhấn vào một đỉnh
if (temp.ifChecked(e.X, e.Y) && drag)
{
// cập nhật đỉnh cuối của cạnh
c.P2 = temp.getID;
// gọi form nhập độ dài cạnh, trong form đó thực hiện thêm cạnh đó vào trong mảng các cạnh
Inputbox = new inputBox ( new canh (c.X1, c.Y1, temp.X, temp.Y, c.P1, c.P2, 1));
Inputbox.Show();
break ;
}
}
// cho đỉnh đầu đỉnh cuối cạnh trùng nhau (để hiển thị không
bị lỗi)
c.X2 = c.X1; c.Y2 = c.Y1;
drag = false ;
pictureBox1.Invalidate();
}
Nhấn nút Tìm:
Trang 13private void button1_Click( object sender, EventArgs
e)
{
start = true ;
richTextBox1.Clear();
map = new bando (pList.Count, cList);
int isp= int Parse(textBox1.Text);
int iep= int Parse(textBox2.Text);
dinh ps= new dinh ();
dinh pe = new dinh ();
foreach ( dinh p in pList)
{
if (p.getID == isp) ps = p;
if (p.getID == iep) pe = p;
}
GBFS greedy = new GBFS (cList,
pList,map.duongdi,ps,pe);
foreach ( dinh p in pList)
{
// cập nhật giá trị hàm đánh giá cho các đỉnh
p.H = greedy.birdFly(p);
}
pictureBox1.Invalidate();
// thực hiện giải thuật GBFS
greedy.GBFS_algorith(richTextBox1,cList);
}
III Hạn chế
Chưa mô tả đúng không gian trạng thái theo yêu cầu bài toán