1. Trang chủ >
  2. Luận Văn - Báo Cáo >
  3. Công nghệ thông tin >

CHƯƠNG II: THUẬT TOÁN TÌM KIẾM A*

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 result)

{

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 result = new 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



Xem Thêm
Tải bản đầy đủ (.doc) (13 trang)

×