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
Giáo viên hướng dẫn: Ngô Hữu Phúc
HÀ NỘI 3/2010
Báo cáo môn học Nhập môn trí tuệ nhân tạo
Đề bài:
!"
#"$%&'()*+, /+.*
/0&)*+122$"3245462
Tên học viên:
Khuất Đình Đăng
Giảng viên:
TS. Ngô Hữu Phúc
Yêu cầu:
780&' 9:4;$<=>?? 92@>A 9BC
I. Phương pháp %m kiếm Greedy Best First Search
D&)*+122$"3245462$@E&)*+
122$"3245462 FG"HIJK)*+2LJ*+MN
.)*+*
O !
E
C)*+4;$<*E#"$%PQ =NRJ
JM*4STUV U1VJ
T4WPJQUWVJX*Y,J+Z
C)*+4;$<*EM[G\J] 9+J#"$%
WME)*+4SG 9MNME)*+
.ENM)*+*(EJ\J &J.#"$%
^\J] =E#"$%_"JMMGL`\J"+
74WMZ$<ML
C)*+/.#"$%a
b",W"4W*@
6;$<*%/:W@
6;$<*M4W]4W*INME)*+PM
[Y$J".:WQ
c(d4W.#"$%4Ja
!!OaMNJ!OPJQ4W\J#I4MTZ ee!OPJQfg
Trạng thái đích
Trạng thái đích u
!!ha!hPJQ^*:MTZ\J#IJMNMTZI
Z ee!hPJQfi
h D&122$"3245462
jI
C'*+122$"3245462f)*+2LJ?
!4;$<&)*+"N,J
+Z CXT*Y,J+Z 9$2
%]..IN*+k+$2UV+ZUWGV2"/J`J
CX]$2UV`MNZG..
Ví dụa)*+/h(n)f2",n+
WZ
Tìm kiếm đường đi với giá 6nh theo Kma
lMZ$</JG,Wm$+ZW3J24
>@
6;$<Jk/ 6n+$22X%Y$`
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á;
End;
bJK1356
• Tính đủa >.MM[@\JoP*M
M$J"EM*E*0/
Q
• Độ phức tạp thời gian: pPQ 9+J2J4kG-W%+'"
4SGLJ
• Độ phức tạp không gian: pPQ FJ:G9$24
• Tính tối ưu: $*q/JK"r*qWJ
II. Các kết quả đạt được
O 78
3&'TMN 7R
-T./ 7R-4WX% 7R
Wh-/TW:h./ C]4WnMNR
Wh-T*%+:h./
1T /R
T * %+:h
. / 1 T
$NR- TT
q -
h c#" $% PQ
1T PQ
R - J J *
T 0 ^ *
2 " ,
J+ Z M *
%+, N
2$J+
h(u) = d
cb
(u, e) + d(father(u),u)
C$
PJ2Q*q2",J+Zst2PJQ
UVJN2$Js$Pt2PJQJQ*%+,t2PJQ+
J
u +\J
>N#"$%M)/
>*M*J$.-
>*M-M/J+-*.W4JK$
W
9K-n`JM-*+v
9GC'.n`J)*+
C*+\J\J724423MwC23
>GJv&'
>N&'a
FNdinh-T&XMN./ FN"
*Jq4Ja
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;
- 44;$<..T'$-
- "TMTZ#-
- xyT4WX%-
- wa*Z-P-.E'[*ZQ
- !T-
- 6222$T-]0J"*
>&XZNa
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.
FNcanhT&XMN/ >J
qNcanh
private int xdau, ydau, xcuoi, ycuoi;
// tọa độ 2 đỉnh của cạnh.
private 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
>&XNa
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
FN$%GK*.T FN"-hJqh
LJJz{$J$sZK*LTM4WJ"/J
4Js.E4WLJK FN"hJqT
K*L$%M-MT
FNGBFS T|JK1356 >JqN*4Ja
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ị
>&XNa
public double birdFly(dinh p)
// 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;Z4%*E
6%*EDDJ23a
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
// hiển thị các cạnh, các đỉnh của đồ thị
6%*EGJa
private void pictureBox1_MouseDown(object sender,
MouseEventArgs e)
{
//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;
// 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();
}
6%*E$J".Ja
private void pictureBox1_MouseMove(object sender,
MouseEventArgs e)
{
// 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();
}
6%*EJa
private void pictureBox1_MouseUp(object sender,
MouseEventArgs e)
{
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();
}
9GvC'a
private 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ế
>v*2"/J`J