A.Thuật toán tìm kiếm theo chiều sâu (Depth First Search) •Việc tìm kiếm tối ưu trong không gian trạng thái là công việc đã sớm được nghiên cứu trong ngành Trí Tuệ Nhân Tạo. Việc tiếp cận này đòi hỏi chúng phải giải quyết một số lượng lớn thông tin (bùng nổ tổ hợp), đôi khi đòi hỏi một thời gian tìm kiếm không thể chấp nhận được (có khi lên đến hàng vạn năm). Do đó, việc tìm ra một giãi thuật tìm kiếm nhanh, hiệu quả là công việc cần thiết. Trong phần này, chúng ta sẽ lần lượt tìm hiểu hai giải thuật cổ điển cũng như đánh giá khả năng của nó.Sau đó, chúng ta sẽ demo 1 chương trình được viết trong ngôn ngữ C# (trong bộ.net của Microsoft). 1.Khái niệm: •Tìm kiếm theo chiều sâu luôn luôn mở rộng một trong các nút ở mức sâu nhất của cây. Chỉ khi phép tìm kiếm đi tới một điểm cụt (một nút không phải đích mà không có phần mở rộng), việc tìm kiếm sẽ quay lại và mở rộng đối với những nút nông hơn. 2.Đánh giá: •Đủ? Không đủ (không gian vô hạn hoặc loop) oNếu sửa để tránh trùng lặp đủ trong không gian hữu hạn. •Thời gian? O(bm) oRất xấu nếu m lớn hơn nhiều so với d oNhưng nếu mật độ lời giải trong không gian lớn thì có thể nhanh hơn BFS •Không gian? O(bm), i.e., độ phức tạp tuyến tính. •Tối ưu? không 3.Cài đặt thuật toán tìm kiếm theo chiều sâu: •Giải thuật: -Đưa điểm bắt đầu vào Stack -Trong khi Stack chưa rỗng: + Ta sẽ bỏ 1 đỉnh của Stack ra: nếu đây là đích kết thúc + Nếu không: ứng với các đỉnh kề với đỉnh vừa bỏ ra, ta lại cho vào Stack. Depth First Search: Procedure Depth_First_Search; begin 1. Khởi tạo danh sách L chỉ chứa trạng thái ban đầu u0; 2. loop do 2.1. if L rỗng then {thông báo thất bại; stop}; 2.2. Loại trạng thái u ở đầu danh sách L; 2.3. if u là trạng thái kết thúc then {thông báo thành công; stop}; 2.4. for mỗi trạng thái v kề u do {Đặt v vào đầu danh sách L;}; end;
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
MÔN HỌC: TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI: GIẢI THUẬT TÌM KIẾM THEO
CHIỀU SÂU (DEPTH FIRST SEARCH)
Giảng viên : Thầy NGÔ HỮU PHÚC
SV thực hiện : ĐÀO NGỌC ANH Lớp : TIN HỌC 5A
HÀ NỘI, THÁNG 3 NĂM 2010
Trang 2A Thuật toán tìm kiếm theo chiều sâu (Depth First Search)
Việc tìm kiếm tối ưu trong không gian trạng thái là công việc đã sớm được nghiên cứu trong ngành Trí Tuệ Nhân Tạo Việc tiếp cận này đòi hỏi chúng phải giải quyết một số lượng lớn thông tin (bùng nổ tổ hợp), đôi khi đòi hỏi một thời gian tìm kiếm không thể chấp nhận được (có khi lên đến hàng vạn năm) Do đó, việc tìm ra một giãi thuật tìm kiếm nhanh, hiệu quả là công việc cần thiết Trong phần này, chúng ta sẽ lần lượt tìm hiểu hai giải thuật cổ điển cũng như đánh giá khả năng của nó.Sau đó, chúng ta sẽ demo 1 chương trình được viết trong ngôn ngữ C# (trong bộ.net của Microsoft)
1 Khái niệm:
Tìm kiếm theo chiều sâu luôn luôn mở rộng một trong các nút ở mức sâu nhất của cây Chỉ khi phép tìm kiếm đi tới một điểm cụt (một nút không phải đích mà không có phần mở rộng), việc tìm kiếm sẽ quay lại và mở rộng đối với những nút nông hơn
2 Đánh giá:
Đủ? Không đủ (không gian vô hạn hoặc loop)
o Nếu sửa để tránh trùng lặp đủ trong không gian hữu hạn
Thời gian? O(bm)
o Rất xấu nếu m lớn hơn nhiều so với d
o Nhưng nếu mật độ lời giải trong không gian lớn thì có thể nhanh hơn BFS
Không gian? O(bm), i.e., độ phức tạp tuyến tính.
Tối ưu? không
3 Cài đặt thuật toán tìm kiếm theo chiều sâu:
Giải thuật:
- Đưa điểm bắt đầu vào Stack
- Trong khi Stack chưa rỗng:
+ Ta sẽ bỏ 1 đỉnh của Stack ra: nếu đây là đích kết thúc
+ Nếu không: ứng với các đỉnh kề với đỉnh vừa bỏ ra, ta lại cho vào Stack
Depth First Search:
Procedure Depth_First_Search;
begin
1 Khởi tạo danh sách L chỉ chứa trạng thái ban đầu u0;
2 loop do
2.1 if L rỗng then
{thông báo thất bại; stop};
2.2 Loại trạng thái u ở đầu danh sách L;
2.3 if u là trạng thái kết thúc then
{thông báo thành công; stop};
2.4 for mỗi trạng thái v kề u do
{Đặt v vào đầu danh sách L;};
end;
Phân tích thời gian của giải thuật DFS:
Trang 3Thời gian thực hiện giải thuật DFS trên một ma trận 2 chiều luôn tỉ lệ với n2 vì mỗi thành phần trên ma trận đều phải được kiểm tra qua một lần Do đó với ma trận vuông nxn thì chi phí để duyệt qua n dòng
và n cột tương ứng nxn = n2
So sánh giữa DFS và BrFS :
Khi DFS thực hiện thì nó luôn chiếm dụng nhiều cùng nhớ hơn (do đặc thù của Stack) và nó luôn tìm kiếm trên những vùng không cần thiết Trong khi, BrFS lại luôn tìm thấy lời giải trong một kết quả tối ưu
Demo việc tìm kiếm DFS:
Mô tả bài toán: Không gian trạng thái được mô tả là ma trận có kích thước mxn Trên khôn gian trạng
thái, có nơi được phép đến, có nơi không được phép đến Hãy xây dựng chương trình tạo ngẫu nhiên không gian trạng thái này, vị trí bắt đầu, vị trí cần tìm và sử dụng giải thuật tìm kiếm theo chiều sâu Đánh giá giải thuật thông qua không gian trạng thái thực tế
Ta sẽ tạo ra một ma trận bất kỳ với 2 giá trị 0 và 1 tương ứng với:
o 0 = đi được
o 1 = không đi được
o Từ ma trận này ta sẽ nhập vào vị trí của điểm bắt đầu và điểm kết thúc để chương trình kiểm tra xem có đường đi hay không có đường đi từ điểm bắt đầu đến điểm kết thúc
o Sau đó sẽ thể hiện kết quả trên phần ”Mô phỏng” bằng hình vẽ để người xem dễ dàng nhận ra kết quả của bài toán
Mô hình của bài toán bao gồm:
o Class ”banco”
o Form
Class ”banco”
class banco
{
int dong,cot;
int[,] a;
int step = 25;
public banco(int d, int c,int[,] ain)
{
dong = d; cot = c;
a = ain;
}
Image kodi = Image.FromFile(Application.StartupPath + "\\kodi.jpg");
Image di = Image.FromFile(Application.StartupPath + "\\di.jpg");
public void Show(PaintEventArgs e)
{
for (int i = 0; i < dong; i++)
for (int j = 0; j < cot; j++)
if (a[i, j] == 1)
e.Graphics.DrawImage(kodi, j * step, i * step);
else
e.Graphics.DrawImage(di, j * step, i * step);
Trang 4- Thể hiện trên pictureBox1 ma trận mxn được biểu diễn dưới dạng hình ảnh ”kodi.jpg” và
”di.jpg”
public void ShowWay(PaintEventArgs e,Point[,] father,Point sp, Point ep)
{
Point wp = new Point();
wp = ep;
e.Graphics.FillEllipse(new SolidBrush(Color.Blue), wp.Y * step + 10, wp.X * step + 10, 5, 5); while (wp != sp)
{
wp = father[wp.X, wp.Y];
e.Graphics.FillEllipse(new SolidBrush(Color.Blue), wp.Y * step + 10, wp.X * step + 10, 5, 5);
}
}
- Đánh dấu những ô đi được để tới đích bằng cách vẽ vào giữa ô đó một vòng tròn nhỏ có màu xanh da trời
Form:
- Ma trận xác lập đường đi:
+ arrX = { 0, 1,0, -1 }
+ arrY = { -1, 0, 1, 0 }
- Ma trận arrCheck để đánh dấu điểm nào đã duyệt qua (có cùng kích cỡ với ma trận được tạo ra)
- pC: là điểm (đỉnh) được “pop” ra ngoài để kiểm tra
- Điều kiện: if (i >= 0 && i <= cot-1 && j >= 0 && j <= dong-1) để tránh xét ra ngoài ma trận
Trang 6 Hàng: nhập số hàng của ma trận
Cột: nhập số cột của ma trận
khi click vào button ” Tạo ma trận” thì ma trận sẽ được thể hiện trên ô Richtextbox ngay bên cạnh
Trang 7 Điểm đầu: nhập vị trí (x,y) của điểm bắt đầu Ví dụ: 0,0
Điểm cuối: nhập vị trí đích đến (x,y) của điểm kết thúc Ví dụ: 5,5
Khi click vào button “Tìm đường” sẽ có 2 trường hợp xảy ra:
- Nếu tìm được tới đích sẽ xuất hiện messagebox “
Trang 8- Ngược lại nếu ko tìm được đường đi sẽ xuất hiện message box “khong co duong di” như sau:
Trang 9 Mô phỏng:
- Khi chương trình tìm ra được đường đi, nó sẽ mô phỏng trên ô picturesBox như sau:
Trang 10- Những ô có chấm tròn màu xanh da trời thể hiện đường đi từ điểm bắt đầu đến điểm kết thúc Ở đây nó sẽ đi theo các vị trí như sau:
2,1<-2,2<-3,2<-3,3<-2,3<-1,3<-1,4<-0,4<-0,3<-0,2<-0,1<-0,0<-1,0
Trang 11B Đánh giá giải thuật:
- Thời gian thực hiện giải thuật DFS trên một ma trận 2 chiều luôn tỉ lệ với n2 vì mỗi thành phần trên ma trận đều phải được kiểm tra qua một lần Do đó với ma trận vuông nxn thì chi phí để duyệt qua n dòng và n cột tương ứng nxn = n2
- Khi DFS thực hiện thì nó luôn chiếm dụng nhiều bộ nhớ hơn (do đặc thù của Stack cứ lớn dần khi không gian trạng thái cần xét càng lớn) và nó luôn tìm kiếm trên những vùng không cần thiết Do đó dễ dẫn đến tình tràng tràn bộ nhớ gây lỗi
Tài liệu tham khảo:
1 Slide bài giảng môn AI của thầy Ngô Hữu Phúc biên soạn
2 “Practical Artificial Intelligence Programming in Java”, Mark Watson
3 Các website về Artificial Intelligence