Tải bản đầy đủ (.pdf) (3 trang)

CÀI ĐẶT THUẬT TOÁN AKT CHO BÀI TOÁN THÁP HÀ NỘI pptx

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 (139.85 KB, 3 trang )

Tài liệu hướng dẫn thực hành
1
CÀI ĐẶT THUẬT TOÁN A
KT
CHO BÀI TOÁN THÁP HÀ NỘI
1. Thuật toán A
KT
Bước 1
Mởđỉnh đầu tiên S, gán g(S) = 0
Sử dụng tri thức bổ sung để ước tính hàm h(S)
Tính f(S) = g(S) + h(S)
Bước 2
Chọn đỉnh mở có f là nhỏ nhất và gọi đỉnh đólàN
Nếu N là đích: đường đi từđỉnh ban đầu đến đỉnh N là ngắn nhất 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: ta phải kiểm tra xem những đỉnh đó
có đỉnh nào là đích hay không.
Nếu có: Đường đi từđỉnh ban đầu đến đỉnh N là ngắn nhất và bằng g(N). Dừng.
Nếu không có: chọn ngẫu nhiên một trong các đỉnh đóvàgọi đólàđỉnh N.
Bước 3
Đóng đỉnh N, mở mọi đỉnh sau N. Với mỗi đỉnh sau N, tính:
g(S) = g(N) + gt(S->N)
Sử dụng tri thức bổ sung để tính h(S).
f(S) = g(S) + h(S).
Bước 4
Quay lại Bước 2.
2. Cấu trúc dữ liệu
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à tập 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 phối các đĩa trên tháp.
¾ DINH. SoCot: Số tháp ban đầu.
¾ DINH. TrangThai:
Tài liệu hướng dẫn thực hành
2
= 0 : Nếu là đỉnh mở.
= 1 : Nếu là đỉnh đóng.
¾ DINH. DinhTruoc: Trả về thứ tự của đỉnh trước đó.
¾ DINH. g, h: Lượng giá 1 đỉnh.
3. Hướng dẫn cài đặt
3.1 Hàm lượng giá
Dữ liệu vào: 1 đỉnh P trên cây tìm kiếm.
Dữ liệu ra: Giá trị Hcủa đỉnh P.
int TinhH(DINH P)
{
Trả về giá trị h của 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 thất bại.
// Thoat = 3: Không có lời giải.
// Thoat = 0: Đang trong quá trình tìm kiếm
Khởi tạo mảng đỉ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 (lấy g + h) nhỏ nhất.
Nếu không tìm được t thì
Thoat = 3
Thuật giải dừng, không có lời giải cho bài toán
Đóng đỉnh O[t]. (O[t].TrangThai = 1)
Gọi S1[0 k] là tập đỉnh sau O[t] không nằm trong O.
Với mỗi S1[i]: i=0 k
Nếu nO>MAX

Thoat = 2
Thuật giải dừng, không đủ không gian để tìm lời giải.
Đưa S1[i] vào O
nO++
Tài liệu hướng dẫn thực 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
Thuật giải dừng, thành công
}
Nếu Thoat = 1
Dựa vào thông tin đỉnh trước in ra các cách biến đổi
Ngược lại
Không tìm được lời giải
}
4. Mở rộng
¾ Dùng cấu trúc dữ liệu động (danh sách liên kết).
Xây dựng 1 template về danh sách liên kết, gọi là List
Định nghĩa lại cấu trúc dữ liệu:
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
¾ Tối ưu cách lưu 1 đỉnh.

×