Tài liu hướng dn thc hành
1
CÀI ĐẶT THUT TOÁN AKT CHO BÀI TOÁN THÁP HÀ NI
1. Thut toán AKT
Bước 1
Mởđnh đầu tiên S, gán g(S) = 0
Sdng tri thc bsung để ước tính hàm h(S)
Tính f(S) = g(S) + h(S)
Bước 2
Chnđỉnh m f là nhnht và giđỉnh đólàN
Nếu N là đích: đường đi t đỉnh ban đầuđếnđỉnh N là ngn nht và bng g(N). Dng
(Success).
Nếu không tn tiđỉnh mnào: cây biu din vnđề không tn tiđường đi ti mc tiêu.
Dng (Fail).
Nếu có 2 đỉnh mtrlên có cùng giá trf nhnht: ta phi kim tra xem nhng đỉnh đó
đỉnh nào là đích hay không.
Nếu có: Đường đi từđnh ban đầuđếnđỉnh N là ngn nht và bng g(N). Dng.
Nếu không có: chn ngu nhiên mt trong các đỉnh đóvàgiđólàđỉnh N.
Bước 3
Đóng đỉnh N, mmiđỉnh sau N. Vi miđỉnh sau N, tính:
g(S) = g(N) + gt(S->N)
Sdng tri thc bsung để tính h(S).
f(S) = g(S) + h(S).
Bước 4
Quay li Bước 2.
2. Cu trúc d liu
typedef struct {
char Dia[MAXDIA];
int SoDia;
}COT;
typedef struct {
COT Cot[MAXCOT];
int SoCot;
int TrangThai;
int DinhTruoc;
int g, h;
}DINH;
DINH O[MAX];
int nO;
Ý nghĩa:
¾O: Là tp các đỉnh trên cây tìm kiếm.
¾nO: S lượng đỉnh trên cây tìm kiếm.
¾DINH. Cot: S phân phi các đĩa trên tháp.
¾DINH. SoCot: S tháp ban đầu.
¾DINH. TrangThai:
Tài liu hướng dn thc hành
2
= 0 : Nếu là đỉnh m.
= 1 : Nếu là đỉnh đóng.
¾DINH. DinhTruoc: Tr v th t ca đỉnh trước đó.
¾DINH. g, h: Lượng giá 1 đỉnh.
3. Hướng dn cài đặt
3.1 Hàm lượng giá
D liu vào: 1 đỉnh P trên cây tìm kiếm.
D liu ra: Giá trHca đỉnh P.
int TinhH(DINH P)
{
Tr v giá tr h ca 1 đỉnh.
}
3.2 Hàm tìm kiếm
void Solve()
{
DINH O[MAXDINH];
int nO;
int Thoat;
// Thoat = 1: Tìm thành công.
// Thoat = 2: Tìm tht bi.
// Thoat = 3: Không có li gii.
// Thoat = 0: Đang trong quá trình tìm kiếm
Khi to mng đỉnh O
O[0].Cot
O[0].SoCot
O[0].DinhTruoc = -1
O[0].TrangThai = 0
O[0]. g = 0
O[0]. h = TinhH(O[0])
nO = 1
Thoat = 0;
while (Thoat == 0)
{
t = ch s đỉnh m trong O có f (ly g + h) nh nht.
Nếu không tìm được t thì
Thoat = 3
Thut gii dng, không có li gii cho bài toán
Đóng đỉnh O[t]. (O[t].TrangThai = 1)
Gi S1[0..k] là tp đỉnh sau O[t] không nm trong O.
Vi mi S1[i]: i=0..k
Nếu nO>MAX
Thoat = 2
Thut gii dng, không đủ không gian để tìm li gii.
Đưa S1[i] vào O
nO++
Tài liu hướng dn thc hành
3
O[nO-1]
S1[i]
O[nO-1].TrangThai = 0
O[nO-1].DinhTruoc = t
Nếu S1[i] là đích thì
Nho = nO-1
Thoat = 1
Thut gii dng, thành công
}
Nếu Thoat = 1
Da vào thông tin đỉnh trước in ra các cách biến đổi
Ngược li
Không tìm được li gii
}
4. M rng
¾Dùng cu trúc d liu động (danh sách liên kết).
Xây dng 1 template vdanh sách liên kết, gi là List
Định nghĩa li cu trúc dliu:
typedef struct {
char Dia[MAXDIA];
int SoDia;
}COT;
typedef struct {
List <DINH> DinhSau;
DINH *DinhTruoc;
}CANH;
typedef struct {
COT Cot[MAXCOT];
int SoCot;
int TrangThai;
List <CANH> Canh;
}DINH;
List <DINH> O
¾Tiưu cách lưu 1 đỉnh.