Tải bản đầy đủ (.docx) (18 trang)

Phương pháp tìm kiếm có kinh nghiệm A cho bài toán tìm đường đi trên 1 bản đồ.

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 (244.18 KB, 18 trang )



Đ N TRÍ TUỆ NHÂN TẠO


GVHD: Thầy TS. NGÔ HỮU PHÚC
Sinh viên thực hiện: HÀ ANH VŨ
MSSV: 11870277
Lớp: CHKHMT – TPHCM23A11
 !" #$%&'%
() *+,  / ,01
MỤC LỤC
!"#$%""&'()*+ #
 ,-!
234 !5$6-*789:8:;< = >?@:AB$C7D$,61:7E-*F !GH107IJ
K !>?L !>7:M:7<+:N1
 #./!
012341235123
!O-PQ7<+>R>D -
O-PQH?@ !!7,S->D >+:
TO-PQUV:W?@ !,X !!7>D >+:Y-N-
 6789:;)<=!
>?2:!
 *0 !,7>Z-
 *0 !,7>+:
 :!7,*[!7,*\ :0 W5>F357>?L !>7]
 :8^:0 ::>_ W5!7,*[5$
@2?2!`$>?L !>7 !a  ;,,S>D Ib !c
d !!7N ,*0 !,7eV75$> !7
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 2


() *+,  / ,01
"Af
 ,,*7R >_ 87 *N::>_ :1 ghi
!OPQjOPQ'k G TOPQjA'kQ%l
!OgPQ"OgPQm G TOgPQ"AmQ'n
!OhPQ'nOhPQo G TOhPQ'nAoQ%'
!OiPQ%&OiPQ" G TOiPQ%&A"Q%"
G?e=p>_ g>?@::q >R<,,*7R OTOgPQ'nP
 ,,*7R g = >?@:::>_ :1 e5hO$V7P*1 !>Mf
!OPQ!OgPA>F357:- !OgPQ"AoQ'k
OPQ'&
GTOPQ!OPAOPQ'kA'&Q%k
!OhPQ!OgPA>F357:- !OghPQ"AlQ''
OhPQo
GTOhPQ!OhPAOhPQ''AoQ'j
 ?e=p>_ h8r>?@:3s !>R<,,*7R 9D<
 ?t !,u8r:q >?@:::>_ O>+:P
 V7!OPQ'jOPQ&
(?L !>7fGgGhGG
 B2C!
<82<c]
D<
' v7,013N 8:E:_:wN,*0 !,7>Z-
% E8
%'0E*x !<y,d !I1,;,I07]8,1<]z
%%H107,*0 !,72v>Z-3N 8:E]
%n02W5,*0 !,7>+:<y,d !I1,5 :d !]8,1<z
%l0$x7,*0 !,7:CE28
y 1:3F123512G:3H
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 3


() *+,  / ,01
01:3F1:351:3H
>B::8=IEH z
%ka<{D<E,61,w,u!7|$3Z :}N5$08N1:1,*0 !,7:M!7,*[:}N5$0
J ;,v>Z-3N 8:]
n*8]
 JKL2M=
• ~7|82,-=,,1 3S !v~eV7>F357>?L !>7W5!O~Pe5,N:MO~PQ& \ 
TO~PQ!O~P
• ~7|82 !7.$,^7?-Cd !<|7W5~,^7?-W5~
'
eV7>F357>?L !>7W5
• ?e=p>?L !>7 5pI[,:*Nve[,*+ 51>M7>M:M%C| # !f
N ,*s !~
'
1•:
I Cd !,*s !~
'

• D-€~
'
f
~>?@::q ,*?V:~
'
 \ TO~P•TO~
'
Pe`!O~P•!O~
'
PQ

• D-‚~'f
g1O-PW5> !7,;<GTOPQ!OPAOP•
g1~>?@::q ,*?V:GTO~P•TOP•
=p~W5>?L !>7,^7?-
 (CNO:;
• D-5$O-P> !7,;< ;,,`,-=,,1 cW5,^7?-
• D-:::- !Cd ! Jt $F,8^P 51>M,`cW5>Zp>}
• D-O-PQ&eV7$q7-,-=,,1 c:+ W5,-=,,1 B$C7D$,^, ;,>Z-9\ 
eV75$> !7!O-P
 QK
• >MR
MO*S<7:Med0  136eV7T≤ f(G) P
• >SJT=R
5$$ƒ
• UV=R
H?-,*K,;,:|:: 136
• "L2RM
W!HIỆN THỰC CHƯƠNG TRÌNH
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 4

() *+,  / ,01
 "XJ.2YCZ!
(RW?-,*K>),[,*\ ,=<9 ,NW;pe+34:4,R ?e+34:?t !'
V7>),[ 5p,NW?-,*K ?8N-f
'&
'l&'kgmhoi"~'%'&%l
l%jn"l'nk%&
&
'"m
%ll"o

%oljn
%mljm
&
'ok
''m
%'koj
*1 !>Mf
„ g… !'f:1I7D,8^>_ ,*1 !>),[O,*1 !e+34,*\ >),[:M'&>_ P
„ g… !%f
'l&'kgmhoi"~'%'&%l
+34f>_ :MW?@ !!7'l>_ :MW?@ !!7N&†
„ g… !,wn>D D,f3… !nW?-,d !9 :1>_ &3… !lW?-,d !9 :1>_ 
'3… !kW?-,d !9 :1>_ %†d !9 W?-,*K:1,S !3… ! ?8N-f
l%jn"l'nk%&
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 5

H?@ !
!7
\
>_ 
*q !
8^j
^7>D
>_ %
O>_ P
^>_ 
$5>_ 
5p>7
>D
() *+,  / ,01

 8<[!
' E\(8<!W?-,*K'136:}N3N 8:W7\ CD,>t
class Node
{
public LuuVet Value { get; set; }
public Node Next { get; set; }
public Node()
{
Value = null;
Next = null;
}
public Node(LuuVet V)
{
Value = V;
Next = null;
}
}
% E\E226<!W5es !,d !9 :}N1363s !>RW?-eD,C7B$>?L !
class LuuVet
{
private CDinh m_v;
private int m_gv, m_fv;
private Node m_nodecha;
public CDinh v
{
get { return m_v; }
set { m_v = value; }
}
public int fv
{

get { return m_fv; }
set { m_fv = value; }
}
public int gv
{
get { return m_gv; }
set { m_gv = value; }
}
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 6

() *+,  / ,01
public Node nodecha
{
get { return m_nodecha; }
set { m_nodecha = value; }
}
public LuuVet()
{
v = null;
m_nodecha = null;
gv = 0;
fv = 0;
}
public LuuVet(CDinh dinh, int GV, int FV,Node dc)
{
v = dinh;
gv = GV;
fv = FV;
m_nodecha = dc;
}

public LuuVet(LuuVet l)
{
v = l.v;
gv = l.gv;
fv = l.fv;
m_nodecha = l.m_nodecha;
}
}
n E\8=I.!
class SingleLinkedList
{
public Node Head { get; set; } //con trỏ Head
//hàm khởi tạo mặc định
public SingleLinkedList()
{
Head = null; //khởi tạo danh sách rỗng
}
//Hàm thêm vào đầu ds
//Trả về true nếu thành công
public bool AddHead(Node p)
{
if (p == null) return false;
if (Head == null)
Head = p;
else
{
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 7

() *+,  / ,01
p.Next = Head;

Head = p;
}
return true;
}
//hàm thêm node vào DSLK để DSLK vẫn tăng dần theo fv
public bool InsertASC(Node n)
{
if (n == null) return false;
if (Head != null)
{
Node p = Head;
Node q=null;
while ( p != null && n.Value.fv > p.Value.fv)
{
q = p;
p = p.Next;
}
if (q == null)
AddHead(n);
else
{
q.Next = n;
n.Next = p;
}
}
else
AddHead(n);
return true;
}
//Hàm lấy và xóa phần tử đầu trong DSLK

public Node GetAndRemoveHead()
{
if (Head == null) return null;
Node p = new Node();
p = Head;
Head = Head.Next;
return p;
}
//Hàm thêm node vào cuối DSLK
public bool AddLast(Node n)
{
if (n == null) return false;
Node p = Head;
if (Head == null)
{
Head = n;
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 8

() *+,  / ,01
return true;
}
while (p.Next != null) p = p.Next;
n.Next = null;
p.Next = n;
return true;
}
}
l E\ ]!W?-,*K,d !9 :1'>_ 
class CDinh
{

protected string m_tendinh;
protected CDinhKe[] m_tapdinhke;
protected int m_luonggia;//gia tri uoc luong:dung ham
danh gia h(u)
protected int m_index;
public CDinh()
{
m_tendinh = "";
m_luonggia = 0;
}
public CDinh(string tendinh)
{
m_tendinh = tendinh;
m_tapdinhke = null;
m_luonggia = 0;
}
public CDinh(string tendinh,int luonggia)
{
m_tendinh = tendinh;
m_luonggia = luonggia;
m_tapdinhke = null;
}
public string tendinh
{
get { return m_tendinh; }
set { m_tendinh = value; }
}
public int index
{
get { return m_index; }

set { m_index = value; }
}
public CDinhKe[] tapdinhke
{
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 9

() *+,  / ,01
get { return m_tapdinhke; }
set { m_tapdinhke = value; }
}
public int luonggia
{
get { return m_luonggia; }
set { m_luonggia = value; }
}
//ham tra ve so luong dinh ke
public int sodinhke()
{
if (m_tapdinhke != null)
return m_tapdinhke.GetLength(0);
else
return 0;
}
//hàm lượng giá đỉnh
public void h()
{
int t=0;
foreach (CDinhKe dk in m_tapdinhke)
{
if (t > dk.trongso) t = dk.trongso;

}
m_luonggia = t;
}
}
k E\ ]U<!W?-,*K,d !9 $5'>_ :M ^7>D
class CDinhKe
{
protected CDinh m_dinhke;
protected int m_trongso;
public CDinh dinhke
{
get { return m_dinhke; }
set { m_dinhke = value; }
}
public int trongso
{
get { return m_trongso; }
set { m_trongso = value; }
}
public CDinhKe()
{
m_dinhke = null;
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 10

() *+,  / ,01
m_trongso = 0;
}
public CDinhKe(CDinh dinh)
{
m_dinhke = dinh;

m_trongso = 0;
}
public CDinhKe(CDinh dinhke, int trongso)
{
m_dinhke = dinhke;
m_trongso = trongso;
}
}
m E\)=)<=!HV<7. ,u::}N,-=,,1 c
class AStarSearch
{
protected CDinh[] m_tapdinh;
protected int m_sodinh;
public CDinh[] tapdinh
{
get { return m_tapdinh; }
}
public int sodinh
{
get { return m_sodinh; }
set { m_sodinh = value; }
}
public AStarSearch()
{
m_tapdinh = null;
m_sodinh = 0;
}
public bool docDothi(string tenfile)
{
try

{
int i, j,n;
string text = File.ReadAllText(tenfile);
StringReader sr = new StringReader(text);

//lay so dinh tu file
string s = sr.ReadLine();
m_sodinh = int.Parse(s);
//lay tap dinh tu file
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 11

() *+,  / ,01
s = sr.ReadLine();
string[] ms = s.Split('\t', ' ');
m_tapdinh = new CDinh[m_sodinh];
for (i = 0; i < m_sodinh; i++)
{
m_tapdinh[i] = new CDinh(ms[i*2]);
m_tapdinh[i].index = i;
m_tapdinh[i].luonggia = int.Parse(ms[i*2+1]);
}
//lay tap dinh ke cho moi dinh
for (i = 0; i < m_sodinh; i++)
{
s = sr.ReadLine();
ms = s.Split('\t', ' ');

//lay so dinh ke cua dinh i
n = int.Parse(ms[0]);
if (n >= 1)

{
//lay dinh ke, trong so, luong gia cua
dinh i
m_tapdinh[i].tapdinhke = new
CDinhKe[n];//khoi tao so dinh ke cho dinh i
int k = 0;
for (j = 1; j <= n * 2; j++)
{
CDinhKe dk = new CDinhKe();
dk.dinhke =
m_tapdinh[int.Parse(ms[j])];
dk.trongso = int.Parse(ms[++j]);
m_tapdinh[i].tapdinhke[k] = dk;
k++;
}
}
}
return true;
}
catch (FileNotFoundException)
{
return false;
}
}
public bool ghiDothi(string tenfile)
{
try
{
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 12


() *+,  / ,01
StringWriter f = new StringWriter();
f.WriteLine(m_sodinh);//ghi so dinh
int i, j;
//ghi ten dinh, luong gia cua moi dinh
for (i = 0; i < m_sodinh; i++)
{
f.Write("{0} {1} ",
m_tapdinh[i].tendinh,m_tapdinh[i].luonggia);
}
//ghi so dinh ke, dinh ke, trong so cho moi dinh
for (i = 0; i < m_sodinh; i++)
{
f.WriteLine();
int sodk = m_tapdinh[i].sodinhke();
f.Write("{0}", sodk);
for(j=0;j<sodk;j++)
{
f.Write(" {0} {1}",
m_tapdinh[i].tapdinhke[j].dinhke.index,
m_tapdinh[i].tapdinhke[j].trongso);
}
}
File.WriteAllText(tenfile, f.ToString());
return true;
}
catch (IOException)
{
return false;
}

}
public SingleLinkedList TimDuongAStar(CDinh bdau, CDinh
kthuc)
{
if (bdau == null || kthuc == null) return null;
LuuVet vbd = new LuuVet(bdau, 0, bdau.luonggia,
null);
//Khởi tạo danh sách L rỗng chỉ chứa trạng thái đầu
SingleLinkedList L = new SingleLinkedList();
//Khởi tạo danh sách T rỗng (T là DSLK chứa các đỉnh
trên đường đi tìm thấy
SingleLinkedList T = new SingleLinkedList();
L.Head = new Node(vbd);
Console.WriteLine("BAT DAU TIM A STAR ");
while (true)
{
//Nếu L rỗng => thông báo thất bại, stop
if (L.Head == null)
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 13

() *+,  / ,01
{
Console.WriteLine("Tim kiem that bai, ket
thuc tim kiem!");
return null;
}
//Loại trạng thái u ở đầu danh sách L
Node u = L.GetAndRemoveHead();
//Thêm u vào cuối danh sách T
T.AddLast(u);

//Nếu u là trạng thái đích then {thông báo thành
công,stop}
if (u.Value.v == kthuc)
{
Console.WriteLine("Da tim thay dinh dich, ket
thuc tim kiem!");
return T;
}
//Hiển thị u ra màn hình
Console.WriteLine("Phat trien {0} sinh ra cac
dinh con : ", u.Value.v.tendinh);
//for mỗi trạng thái v kề u
if (u.Value.v.tapdinhke != null)
{
foreach (CDinhKe v in u.Value.v.tapdinhke)
{
LuuVet lv = new LuuVet();
lv.nodecha = u;
lv.v = v.dinhke;
//g(v) <- g(u) + k(u,v)
lv.gv = u.Value.gv + v.trongso;
//u.Value.v.tapdinhke[v.dinhke.index].trongso;
//f(v) <- g(v) + h(v)
lv.fv = lv.gv + v.dinhke.luonggia;
//Đặt v vào danh sách L
Node n = new Node(lv);
//Hiển thị u ra màn hình
Console.WriteLine("g({0})={1}, h({2})={3}
=> f({4})={5}", lv.v.tendinh,
lv.gv, lv.v.tendinh,

v.dinhke.luonggia, lv.v.tendinh, lv.fv);
//Thêm Node n vào L theo thứ tự tăng dần
theo hàm f
L.InsertASC(n);
}
}
//khi thêm v vào L thì L đã có thứ tự luôn rồi
nên ko cần phải làm
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 14

() *+,  / ,01
//thao tác sắp xếp L nữa
}
}
}
" [7!
namespace AStarSearchDemo
{
class Program
{
static void Main(string[] args)
{
AStarSearch ass = new AStarSearch();
ass.docDothi("dothi_in.txt");
Console.WriteLine("So dinh cua Do thi : {0}",
ass.sodinh);
Console.WriteLine("Luong gia cua cac dinh :");
for (int i = 0; i < ass.sodinh; i++)
{
Console.Write("{0} {1} ", ass.tapdinh[i].tendinh,

ass.tapdinh[i].luonggia);
}

Console.WriteLine("==================================");
for (int i = 0; i < ass.sodinh; i++)
{
CDinh cur=ass.tapdinh[i];
Console.WriteLine("Dinh thu {0}) Dinh {1} co {2}
dinh ke la :", i, cur.tendinh,cur.sodinhke());
for (int j = 0; j < cur.sodinhke(); j++)
{
Console.WriteLine("{0} {1} {2}({3})",
cur.tendinh,
cur.tapdinhke[j].trongso,
cur.tapdinhke[j].dinhke.tendinh,
cur.tapdinhke[j].dinhke.luonggia);
}
}

Console.WriteLine("==================================");
Console.WriteLine("TIM DUONG BANG GIAI THUAT ASTAR");
string bd, kt;
Console.Write("Nhap dinh bat dau : ");
bd = Console.ReadLine();
Console.Write("Nhap dinh ket thuc : ");
kt = Console.ReadLine();
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 15

() *+,  / ,01
CDinh dbd = new CDinh();

CDinh dkt = new CDinh();
foreach (CDinh d in ass.tapdinh)
{
if (d.tendinh == bd)
dbd = d;
if (d.tendinh == kt)
dkt = d;
}
if (dbd.tendinh == "" || dkt.tendinh == "")
{
Console.WriteLine("Khong tim thay dinh bat dau
hoac dinh ket thuc!");
Console.Read();
return;
}
SingleLinkedList T= ass.TimDuongAStar(dbd, dkt);
//Xuất đường đi thấy
if (T != null)
{
Node p = T.Head;
while (p.Next != null) p = p.Next;

Console.WriteLine("==================================");
Console.WriteLine("Chi phi duong di tim thay =
{0}",p.Value.fv);
Console.WriteLine("Duong di tim thay : ");
while (p != null && p.Value.v!=dbd)
{
Console.Write("{0} <- ", p.Value.v.tendinh);


p = p.Value.nodecha;
}
//Xuất đỉnh xuất phát
if(p!=null)
Console.Write("{0}", p.Value.v.tendinh);
}
ass.ghiDothi("dothi_out.txt");
Console.Read();
}
}
}
Kết quả thực hiện chương trình :
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 16

() *+,  / ,01
 #\^!
g16$ =<e7. >7E-,*[e5IN:}N6$$;, \ ,L7!7N W5$I57*;,0 :D31>M:?t !
,*` :?NC[<7. ,u:,*\ 'I| >):4,Re55$W?@ !!7:… :?N,^,?t !WN7
:?t !,*` :M,R<34 !>RB$>?L !,*\ 'I| >):4,ReV7'5$W?@ !!7,^,
t 
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 17

() *+,  / ,01
*/ ,*q !:$t ,Zp
SVTH: Hà Anh Vũ GVHD: TS.Ngô Hữu Phúc Trang 18

×