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 (173.84 KB, 13 trang )
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
v:
1
2
3
0
1
2
3
4
5
6
7
4
5
6
7
8
9
A
B
8
9
A
B
0
D
E
F
C
D
E
F
C
1
1
2
3
4
5
6
0
7
9
A
B
8
D
E
F
0
1
C
Các giá trị 0 và 1 ở trên chính là các hàm đánh giá f(v) được tính
bằng cách đếm số ô lệch so với vị trí đích của ô vừa mới di chuyển
Tiếp theo ta đặt v vào danh sách L sao cho danh sách L tăng dần theo
f(v) đã được tính ở trên
L:
1
2
3
4
1
2
3
0
5
6
7
8
5
6
7
4
9
A
B
0
9
A
B
8
D
E
F
C
D
E
F
C
0
1
2
3
4
5
6
0
7
9
A
B
8
D
E
F
1
1
C
Tiếp đến ta xét trạng thái đầu tiên có f(v) nhỏ nhất trong danh sách L
Trang
6
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
Xét u <-
# đích
1
2
3
4
5
6
7
8
9
A
B
0
D
E
F
C
Tiếp tục liệt kê các trạng thái con của trạng thái vừa xét ở trên
v:
1
2
3
4
5
6
7
9
A
D
E
0
1
2
3
4
8
5
6
7
8
B
C
9
A
0
B
F
0
D
E
F
1
C
Các giá trị f(v) được tính như trên hình vẽ, tiếp theo đưa các v vào
danh sách L và lại sắp xếp theo thứ tự tăng dần của hàm f(v)
L:
1
2
3
4
5
6
7
9
A
D
E
0
1
2
3
4
8
5
6
7
8
B
C
9
A
0
B
F
0
D
E
F
C
Xét u <-
1
≡ Đích
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
-> Tìm kiếm thành công với đường đi 8C.
Trang
7
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
Cứ như vậy, áp dụng thuật toán tìm kiếm IDS-A* mô hình bài toán
15-Puzzle bắt đầu từ trạng thái đầu sẽ tìm ra trạng thái đích như hình dưới:
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
Trang
8
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
CHƯƠNG III: CHƯƠNG TRÌNH
1. 15-PUZZLE CHƠI VỚI SỐ
2. 15-PUZZLE CHƠI VỚI ẢNH
3. 15-PUZZLE ÁP DỤNG THUẬT TOÁN
3.1. MÃ HÓA BÀN CỜ THÀNH SỐ KIỂU INT64 BIT
- Bàn cờ 16 ô sẽ được mã hóa thành một dãy số có độ dài 64bít. Khởi
tạo:
public Int64 board;
3.2. BIỂU DIỄN TRẠNG THÁI
- Trạng thái ban đầu của chương trình sẽ được sinh ra dưới dạng các
chữ số từ 0-9 và từ A-F sử dụng hệ hex:
Hình 7
- Tương ứng với mỗi kí tự trong ô text mà bàn cờ sẽ mã hóa thành
các vị trí có giá trị tương ứng trên bàn cờ bằng thuật toán sau:
public void setValue(ref Int64 board, int index, int value)
{
board |= (Int64)value << index * 4;
}
Trang
9
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
State initialState; // Khởi tạo trạng thái ban đầu
initialState.board = 0; // trạng thái ban đầu =0
for (int i=0; i < 16; ++i)
{
if (initialBoard[i] <= '9')
setValue(ref initialState.board, i, initialBoard[i] - '0');
else
setValue(ref initialState.board, i, initialBoard[i] - 'A' + 10);
}
- Tương ứng với trạng thái bắt đầu ở hình 7 ta hiển thị trạng thái bắt
đầu trên chương trình như sau:
Trang 10