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
For mỗi v kề u do
Begin
g(v) = g(u) + k(v,u);
f(v) = g(v) + h(u);
Đặt v vào ds L sao cho L tăng
dần theo hàm f;
father(v) <-u;
end;
end;
end;
2. ÁP DỤNG MÔ HÌNH VÀO BÀI TOÁN
Trạng thái ban đầu:
-->
Trạng thái đích
1
2
3
4
1
2
3
4
5
6
7
0
5
6
7
8
9
A
B
8
9
A
B
C
D
E
F
C
D
E
F
0
Đặt trạng thái đầu vào danh sách L:
Xét u <-
# đích
1
2
3
4
5
6
7
0
9
A
B
8
D
E
F
C
Ta liệt kê các trạng thái v là trạng thái con của trạng thái đang xét ở
trên:
Trang
5
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
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
Hình 8
3.3. THUẬT TOÁN IDS-A*
- Trong chương trình, thuật toán được xây dựng trên một hàm:
bool dfs_search(ref State state, int maxScore, ref Stack
{
const string digits = "0123456789ABCDEF";
if (state.score > maxScore)
return false;
if (state.board == 0x0FEDCBA987654321L)
{
result.Push('\0');
return true;
}
State newState = new State();
if ((state.emptyPos & 0x3) != 0) //co the dich trai
{
if (makeMove(ref newState, ref state, maxScore,
state.emptyPos - 1))
{
result.Push(digits[newState.lastMoved]);
if (dfs_search(ref newState, maxScore, ref result))
return true;
result.Pop();
}
}
if ((state.emptyPos & 0x3) != 3) // co the dich phai
{
if (makeMove(ref newState, ref state, maxScore,
state.emptyPos + 1))
{
result.Push(digits[newState.lastMoved]);
if (dfs_search(ref newState, maxScore, ref result))
return true;
Trang 11
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
result.Pop();
}
}
if ((state.emptyPos >> 2) != 0) // co the dich len
{
if (makeMove(ref newState, ref state, maxScore,
state.emptyPos - 4))
{
result.Push(digits[newState.lastMoved]);
if (dfs_search(ref newState, maxScore, ref result))
return true;
result.Pop();
}
}
if ((state.emptyPos >> 2) != 3) //co the dich xuong
{
if (makeMove(ref newState, ref state, maxScore,
state.emptyPos + 4))
{
result.Push(digits[newState.lastMoved]);
if (dfs_search(ref newState, maxScore, ref result))
return true;
result.Pop();
}
}
return false;
}
// Hàm đánh giá
if (Math.Abs((toMove & 0x3) - targetCol) +
Math.Abs((toMove >> 2) - targetRow) <
Math.Abs((lastState.emptyPos & 0x3) - targetCol) +
Math.Abs((lastState.emptyPos >> 2) - targetRow))
{
++newState.score;
}
Trang 12
Công nghệ phần mềm
GVHD: Ts. Lê Văn Hưng
public String idas_search(string initialBoard)
{
//khoi tao ban co
State initialState;
initialState.board = 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);
}
initialState.emptyPos = (char)initialBoard.IndexOf('0');
initialState.score = 0;
initialState.lastMoved = (char)0;
// Sau mỗi trạng thái kết quả được lưu vào stack mang tên result
Stack
int maxScore = 0;
while (!dfs_search(ref initialState, maxScore, ref result))
++maxScore;
return getContent(result);
}
- Trong thuật toán trên các bước khi thực hiện sẽ gọi tới những hàm
liên quan khác trong chương trình gồm có các hàm dịch bít, hàm kiểm tra
các trạng thái của bài toán…
4. CHƯƠNG TRÌNH
Trang 13