Professional Documents
Culture Documents
1
LỜI NÓI ĐẦU...........................................................................................................3
Phân tích bài toán.......................................................................................................4
Mục đích bài toán..................................................................................................4
Cách làm................................................................................................................5
Cấu trúc dữ liệu và cách biểu diễn trạng thái của bài toán.........................................7
Lớp khai báo đối tượng..........................................................................................7
Hàm tạo mẫu chuỗi nhập vào.................................................................................8
Hàm xử lý chuỗi nhập vào....................................................................................9
Hàm xác định tọa độ cho các nút vẽ......................................................................11
Hàm vẽ đồ thị......................................................................................................12
Hàm giải thuật AKT.............................................................................................13
Các hàm cho giải thuật.........................................................................................15
Giao diện chương trình.............................................................................................19
Tài liệu tham khảo....................................................................................................20
B C D
E F G H
I J
Ta cần tìm đường đi từ điểm A J. Biết g(n) là chi phí thực từ n0 n.
Thuật giải AKT là mở rộng của thuật giải AT bằng cách sử dụng thêm thông tin ước
lượng h(n).
Thuật giải AT là thuật giải tìm đường đi tối ưu mà nó chỉ xét đến đỉnh và giá của
chúng (g). Tuy nhiên giải thuật này không còn phù hợp khi gặp phải những bài
toán phức tạp do phải tháo một lượng nút lớn(có kích thước bài toán tăng theo hàm
mũ từ đó dẫn đến bùng nổ về tổ hợp) để khắc phục nhược điểm này người ta sử
dụng thêm các thông tin bổ sung xuất phát từ bản thân bài toán để tìm ra các đỉnh
có triển vọng, tức là đường đi tối ưu sẽ tập trung xung quanh đường đi tốt nhất nếu
sử dụng các thông tin đặ tả về bài toán.
Vậy theo định nghĩa các thông tin này được gọi là các Heuristics: h(n) hay chính là
chi phí ước lượng từ n G.
Các kỹ thuật sử dụng h(n) gọi là các mẹo giải, ta có thể đưa ra các mẹo giải sau:
- Chọn toán tử xây dựng cung sao cho có thể loại bớt các đỉnh không liên
quan và tìm ra các đỉnh có triển vọng.
- Sử dụng thêm các thông tin bổ sung nhắm xây dựng tập MO và cách lấy các
đỉnh trong tập MO.
Để làm được việc này, người ta phải đưa ra độ đo, tiêu chuẩn đề tìm ra các điểm
triển vọng. Các hàm sử dụng các kỹ thuật này gọi là hàm đánh giá. Sau đây, ta đưa
ra một số phương pháp xây dựng hàm đánh giá:
- Dựa vào xác suất của đỉnh trên đường đi tối ưu.
- Dựa vào khoảng cách, sự sai khác của trạng thái đang xét với trạng thái đích
hoặc các thông tin liên quan tới trạng thái đích.
Để tìm được phương án tối ưu ta sử dụng đại lượng hàm ước lượng f(n) và
f(n)= g(n)+ h(n) là độ tốt của lời giải.
- Nếu N là đích: đường đi từ đỉnh ban đầu đến đỉnh N là ngắn nhất và
và bằng g(N). Dừng (Success).
- Nếu không tồn tại đỉnh mở nào: cây biểu diễn vấn đề không tồn tại
đường đi tới mục tiêu. Dừng (Fail).
Nếu có 2 đỉnh mở trở lên có cùng giá trị f nhỏ nhất: Chúng ta phải kiểm tra
xem những đỉnh đó có đỉnh nào là đích hay không.
o + Nếu có: đường đi từ đỉnh ban đầu đến đỉnh N là ngắn nhất và bằng
g(N). Dừng (Success).
o + Nếu không có: chọn ngẫu nhiên một trong các đỉnh đó và gọi đỉnh
đó là N.
Bước 3:
- Đóng đỉnh N, mở mọi đỉnh sau N. Với mỗi đỉnh S sau N, tính:
- g(S) = g(N) + cost(SN)
- Sử dụng tri thức bổ sung để tính h(S) và f(S): f(S) = g(S) + h(S)
Bước 4:
- Đường đi p: n0 nk ĐICH.
ư : Sử dụng 2 danh sách M và D NG
While M ≠ do
If B(n) ≠ then
{ MO =MO {m}
Tính f(m)
2. Cấu trúc dữ liệu và cách biểu diễn trạng thái của bài toán
1. Lớp khai báo đối tượng
class Nut
{
protected string _Ten;
private int _G;
private int _H;
protected int _ID;
protected int _IDcha;
public int G
{
get { return _G; }
set { _G = value; }
}
public int H
{
get { return _H; }
set { _H = value; }
}
public int ID
{
get { return _ID; }
set { _ID = value; }
}
}
Giải thích: class này dùng để khai báo các đối tượng của nút
_ID : Mã nút
_G : g
_H : h
if (curNode == null)
{
curNode = new TreeNode(chuoi[2]);
sortnodes.Add(chuoi[0], curNode);
}
curNode.Text = chuoi[2];
//them nut
curNode.Tag = new Nut(int.Parse(chuoi[0]), int.Parse(chuoi[1]),
curNode.Text, int.Parse(chuoi[3]), int.Parse(chuoi[4]));
//
TreeNode parentNode = null;
try { parentNode = sortnodes[chuoi[1]]; }
catch (Exception) { parentNode = null; }
if (parentNode == null)
{
parentNode = new
TreeNode(chuoi[1]);
sortnodes.Add(chuoi[1], parentNode);
}
parentNode.Nodes.Add(curNode);
}
}
}
public Point diemDau
{
get
{
Rectangle rect = vien;
return new Point(rect.Left + (rect.Width / 2), rect.Top);
}
}
public Point diemCuoi
{
get
{
Rectangle rect = vien;
return new Point(rect.Left + (rect.Width / 2), rect.Bottom);
}
}
}
5. Hàm vẽ đồ thị
//Vẽ cây
//
public Bitmap VeCay(TreeNode node)
{
int tangX = ToaDo.TangX, kcachtang = ToaDo.KCgiuaTang, w = ToaDo.TangX, h
= ToaDo.KCgiuaTang;
Font fnt = ToaDo.font;
//Tăng chiều rộng của các nút cha bởi chiều rộng cung cấp
int pbw = pb.sz.Width + pb.delta;
int bw = b.sz.Width + b.delta;
pb.kidsW -= !first ? b.prevW : 0;
pb.delta += ((bw + pb.kidsW - pbw) + Math.Abs(bw + pb.kidsW - pbw)) / 2;
pbw = pb.sz.Width + pb.delta;
pb.kidsW += bw;
b.prevW = bw;
//Điều chỉnh vị trí
if (first)
{
//các nút con được vẽ sau nút cha nên điều chỉnh sẽ chính xác
b.ViTri = new Point(pb.ViTri.X + pb.kidsW - bw, ((tnode.Level - 1)
kcachtang)); *
first = false;
}
//
w = Math.Max(pb.ViTri.X + pbw + ToaDo.TangX / 2, w);
h = Math.Max((((tnode.Level - 1) * kcachtang)) + kcachtang, h);
//
tnode = p;
}
if (first && w > tangX)
{
cb.ViTri.Offset(w, 0);
w = Math.Max(cb.ViTri.X + cb.sz.Width + cb.delta, w);
}
};
NutLap(node, laynut);//lặp lại các nút để lấy tọa độ các nút
gr.Dispose();
bmp.Dispose();
Nut mpttNode =
(Nut)tnode.Tag; int level =
tnode.Level;
ToaDo b = (ToaDo)((Nut)tnode.Tag).Tag;
Rectangle rect = b.vien;
//Vẽ nhánh
if (tnode.Parent.Tag != null)
{
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
Pen pen = new Pen(new SolidBrush(Color.Red), 1.0F);
gr.DrawLine(pen, ((ToaDo)((Nut)tnode.Parent.Tag).Tag).diemCuoi,
b.diemDau);
}
//Vẽ nút
LinearGradientBrush brush = new LinearGradientBrush(rect, Color.White,
Color.DodgerBlue, LinearGradientMode.ForwardDiagonal);
gr.FillEllipse(brush, rect);
gr.DrawEllipse(new Pen(new SolidBrush(Color.Brown)), rect);
//viết tên nút, g,h
using (StringFormat sf = new StringFormat())
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
gr.DrawString(b.Text, fnt, mau_chu, rect, sf);
}
};
NutLap(node, draw);//lặp lại các nút trong cây
gr.Dispose();
return bmp;
}
themBn(root);
themMO();
themDONG(root);
}
else
{
themDONG(root);
itemlv = new ListViewItem(root);
lv.Items.Add(itemlv);
itemlv.SubItems.Add("Đích");
itemlv.SubItems.Add("");
itemlv.SubItems.Add(layDONG());
}
}
}
else
MessageBox.Show("Không tồn tại nút này!");
}
7. Các hàm cho giải thuật
//lấy nút gốc
public ArrayList laygoc()
{
ArrayList goc = null;
for (int i = 0; i < ALLNut.Count; i++)
{
ArrayList node = ALLNut[i];
if ((int)node[1] == 0)
return node;
}
return goc;
}
ArrayList az = ALLNut[j];
if ((int)az[0] == (int)nuts[1])
{
if ((int)az[1] == 0)
{
st = String.Concat(az[2].ToString(), s1, nuts[2].ToString(),
st);
}
else
{
st = String.Concat(s1, nuts[2].ToString(), st);
}
s = (string)az[2];
duongdi_chiphi(s);
}
}
}
}
return st;
}
3. sGiao diện chương trình
Tài liệu tham khảo
1. Trần Hùng Cường_Giáo trình – slide TRÍ TUỆ NHÂN TẠO(Artificial
Intellegence – AI)
2. Geogre F. Luger, William A. Stubblefield – Albuquerque – Artifical
Intelligence – Wesley Pubblishing Conpany, Inc – 1997 (Chapter 1)
3. Bùi Xuân Toại – Trương Gia Việt (Biên dịch) – Trí tuệ nhân tạo – Các cấu
trúc và chiện lược giải quyết vấn đề - NXB Thống kê, 2000 (Phần 1)
4. PTS. Nguyễn Thanh Thủy – Trí tuệ nhân tạo – Các phương pháp giải quyết
vấn đề và kỹ thuật xử lí tri thức – NXB Giáo dục, 1995 (Chương 1)
5. Wikipedia – Bách khoa toàn thư mở - Lịch sử ngành Trí tuệ nhân tạo
6. www.codeproject.com
7. www.congdongcviet.com