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 (137.24 KB, 2 trang )
Thuật toán Gready Seach và các bài toán biến đổi
Hoàng Anh Vũ
Chào các bạn!
Trong số báo tháng 10/2003, bạn Hoài Nam đã viết về các bài toán biến đổi và một
phương pháp để giải chúng. Trong bài viết này, tôi xin trình bày một phương pháp giải
khác để giải các bài toán đó, và một lớp các bài toán khác nữa.
Như các bạn đã biết, có 2 thuật toán tìm kiếm cơ bản là BFS và DFS. Từ 2 thuật toán đó,
người ta cải tiến để tối ưu chúng và tạo ra các thuật toán tốt hơn, ví dụ: leo đồi, A*, Gready
Search (tham lam- GS) .v.v. Sau đây tôi sẽ trình bày thuật toán GS, một thuật toán mà theo
tôi chạy rất tốt về mặt thời gian.
Khái niệm:
Hueristics là các dấu hiệu đặc trưng của bài toán cho phép nhanh chónh xác định lời giải.
Tôi chí trình bày với các bạn một hàm heuristics tiêu biểu đó là hàm theo giá trị Manhattan.
Khoảng cách Manhattan: hiểu một cách nôm na đó là tổng các khoảng cách theo chiều dọc
+ chiều ngang của mỗi ô số (nằm không đúng vị trí, hoặc đúng vị trí tùy vào quy ước của
người lập trình) so với trạng thái đích.
QUEUE: hàng đợi, hoạt động theo nguyên tắc FIFO(First In First Out).
Tôi trình bày thuật toán theo kiểu khử đệ quy:
Thuật toán:
*Từ thuật toán trên ta thấy, GS chỉ khác BFS ở sắp xếp toàn bộ mà thôi.
Dưới đây là một số ví dụ:
Ví dụ 1: (ví dụ của bạn Hoài Nam)Tôi xin nhắc lại để các bạn dễ theo dõi.
1 lưới đèn N*N bóng, mỗi bóng có 2 trạng thái: sang (1) và tắt (0). Mỗi hàng(cột) có 1
công tắc. Khi ấn sẽ thay đổI trạng thái của các bóng trên hàng (cột) đó. (0->1 và 1-> 0).
Nhiệm vụ là qua một số lần biến đổi, hãy đưa từ trạng thái nguồn về trạng thái đích.
Ví dụ:
Giải: Hàm Manhattan M[2*N] trong bài này là số các ô khác nhau giữa A và B. Hàm này
có 2*N giá trị, bằng tổng số hàng và số cột của ĂB).
For(I=1;I<=n;I++)
For(j=1;j<=n;j++){
If(A[I][j]!=B[I][j]) M[I]++; //theo hàng