LỜI MỞ ĐẦUSự phát triển công nghệ thông tin hiện nay, ngày càng đáp ứng nhu cầu con người trong việc khai phá, tìm hiểu tri thức ngoài ra còn có vai trò là phương tiện để hỗ trợ các tiện
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
-ỨNG DỤNG LẬP TRÌNH TÍNH TOÁN HÌNH THỨC
ĐỀ TÀI:
CÀI ĐẶT THUẬT TOÁN A*
TRONG MAPLE
GVHD : TS Đỗ Văn Nhơn Học viên : Ngô Thanh Tuấn (CH1101054)
Email: ngothanhtuan@live.com
Thành phố Hồ Chí Minh Tháng 1/2013
Trang 2LỜI MỞ ĐẦU
Sự phát triển công nghệ thông tin hiện nay, ngày càng đáp ứng nhu cầu con người trong việc khai phá, tìm hiểu tri thức ngoài ra còn có vai trò là phương tiện để
hỗ trợ các tiện ích, tính toán cho con người thoải mái hơn trong tính toán Lập trình tính toán hình thức là một tiện ích như vậy, nó đáp ứng được các phương pháp biễu diễn dưới dạng hình thức của con người trong việc tính toán (dấu căn, mũ, biến, hàm, đa thức …) đồng thời còn hỗ trợ việc tính toán chính xác cao thông qua công
cụ như Maple
Trong thu hoạch, em giới thiệu lại phương pháp tìm đường đi trên đồ thị A* (A sao) Thông qua những kiến thức về ngôn ngữ lập trình hình thức, trong bài báo cáo giới thiệu về các bước cài đặt ứng dụng trên phần mềm Maple Em xin chân thành cảm ơn thầy Nhơn đã hướng dẫn, giúp em tiếp cận và làm quen với các phương pháp tiếp cận phương pháp tính toán hình thức Tuy nhiên, với kiến thức còn hạn chế và thời gian có hạn nên ứng dụng nhỏ này khó tránh khỏi các thiếu sót Em mong thầy cho em đóng góp ý kiến cho em có thể hoàn thiện ứng dụng của mình hơn
Trang 3NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Trang 4
NỘI DUNG
Trang 51 Giới thiệu A*
1.1 Tổng quan thuật toán A*
Trong khoa học máy tính, A* là một phương pháp tìm kiếm đường đi trong
đồ thị Thuật toán này tìm một đường đi từ một nút khởi đầu tới một nút đích cho trước (hoặc tới một nút thỏa mãn một điều kiện đích) Thuật toán này sử dụng một
"đánh giá heuristics" để xếp loại từng nút theo ước lượng về đường đi tốt nhất đi qua nút đó Thuật toán này duyệt các nút theo thứ tự của đánh giá heuristics đó
Peter Hart, Nils Nilsson and Bertram Raphael của Học Viện Nghiên Cứu Stanford giới thiệu thuật toán này 1968 Nó là mở rộng của thuật toán Edsger Dijkstra's 1959 A* đạt được thời gian tốt hơn do sử dụng phương pháp heuristics
Ý tưởng ban đầu: Xét bài toán tìm đường - bài toán mà A* thường được dùng
để giải A* xây dựng tăng dần tất cả các tuyến đường từ điểm xuất phát cho tới khi
nó tìm thấy một đường đi chạm tới đích Tuy nhiên, cũng như tất cả các thuật toán tìm kiếm có thông tin thường chỉ xây dựng các tuyến đường "có vẻ" dẫn về phía đích
Để biết những tuyến đường nào có khả năng sẽ dẫn tới đích, A* sử dụng một
"đánh giá heuristic" về khoảng cách từ điểm bất kỳ cho trước tới đích Trong trường hợp tìm đường đi, đánh giá này có thể là khoảng cách đường chim bay - một đánh giá xấp xỉ thường dùng cho khoảng cách của đường giao thông
Điểm khác biệt của A* đối với tìm kiếm theo lựa chọn tốt nhất là nó còn tính đến khoảng cách đã đi qua Điều đó làm cho A* "đầy đủ" và "tối ưu", nghĩa là, A*
sẽ luôn luôn tìm thấy đường đi ngắn nhất nếu tồn tại một đường đi như thế A* không đảm bảo sẽ chạy nhanh hơn các thuật toán tìm kiếm đơn giản hơn Trong một môi trường dạng mê cung, cách duy nhất để đến đích có thể là trước hết phải đi về phía xa đích và cuối cùng mới quay lại Trong trường hợp đó, việc thử các nút theo thứ tự "gần đích hơn thì được thử trước" có thể gây tốn thời gian
1.2 Hoạt động
Trang 6Giống như tất cả các thuật toán tìm kiếm thông tin, đầu tiên nó tìm kiếm các tuyến đường có vẻ như là có khả năng dẫn hướng về mục tiêu Trong đó g(x) là một phần của heurictics là chi phí từ đỉnh bắt đầu, không phải là chi phí của điểm cục bộ với nút mở rộng kề nó; h(x) hàm ước lượng khoảng cách heurictics; f(x) tổng khoảng cách của g(x) và h(x)
Bắt đầu với nút đầu tiên, nó duy trì một hàng đợi ưu tiên của các nút được đi qua, được biết đến như một tập mở (open set) Với f(x) thấp với một nút x cho trước
ưu tiên cao hơn Tại mỗi bước của thuật toán, các nút với giá trị f(x) thấp nhất được loại bỏ khỏi hàng đợi, và giá trị f, g của các nút kề của nó được cập nhật cho phù hợp, và những nút kề được thêm vào hàng đợi Thuật toán tiếp tục cho đến khi một nút mục tiêu có giá trị f thấp hơn bất kỳ nút trong hàng đợi (hoặc cho đến khi hàng đợi rỗng) (Các nút mục tiêu có thể được thông qua trên nhiều lần nếu còn các nút khác với giá trị f thấp hơn, vì chúng có thể dẫn đến một con đường ngắn hơn để một mục tiêu.) Giá trị f của mục tiêu sau đó chiều dài của con đường ngắn nhất, bởi vì h tại mục tiêu là không (0) trong một heurictics chấp nhận được
Thuật toán được mô tả cho đến nay chỉ cung cấp độ dài của đường đi ngắn nhất Để tìm trình tự đường đi thực tế, thuật toán có thể được sửa đổi để mỗi nút trên con duyệt dựa theo nút tiền nhiệm của nó Sau khi thuật toán này được chạy, các nút bắt đầu sẽ chỉ với nút tiền nhiệm của nó, và như vậy, cho đến khi nút tiền nhiệm của một số nút là nút mục tiêu
1.3 Độ phức tạp
Độ phức tạp thời gian của A* phụ thuộc vào đánh giá heuristic Trong trường hợp xấu nhất, số nút được mở rộng theo hàm mũ của độ dài lời giải, nhưng nó sẽ là hàm đa thức khi hàm heuristic h thỏa mãn điều kiện sau:
Trong đó là heuristic tối ưu, nghĩa là hàm cho kết quả là chi phí chính xác để
đi từ x tới đích
Trang 72 Ứng dụng
2.1 Bài toán
Để tìm đường đi ngắn nhất cho một bài toán đồ thị, hay bài toán tìm đường trên bản đồ Cho trước đồ thị G (bản đồ), điểm xuất phát s, điểm đích d Đồ thị cho trước bao gồm các trọng số, và mỗi đỉnh của đồ thị có tọa độ cùng nằm trên một mặt phẳng Tìm đường đi ngắn nhất từ s đến d
2.2 Cấu trúc dữ liệu và hàm
− G: đồ thị có trọng số (vô hướng)
− V là danh sách các đỉnh của đồ thị
− Location: danh sách tọa độ của các đỉnh, thứ tự tương ứng đôi một với tập đỉnh
− hscore(): hàm tính giá trị heurictics, trong phần cài đặt của chương
trình dùng thuật toán đo khoảng cách Mahattan
− Các hàm get/set F/Gscore dùng để gán giá trị, lấy chi phí của hàm g(x), hay f(x)
− reconstructpath(): xây dựng lại đường đi từ điểm bắt đầu cho đến kết thúc
− ShortestPathAStar(): hàm mô phỏng thuật toán A*
− Ứng dụng đã tận dụng bộ thư viện GraphTheory của Maple để dùng làm các phép truy vấn trên đồ thị: tìm đỉnh kề, lấy trọng số, …
Trang 82.3 Thuật toán
Bên dưới là đoạn mã giả cho thuật toán A*:
Hàm A * ( start,goal )
closedset : = []
openset : = [ start]
came_from : = []
g_score [ start ] : = 0 //g(x)
f_score [ start ] : = g_score [ start ] +
heuristic_cost_estimate ( start, goal ) // f(x) = g(x) + h(x)
while openset khác rỗng {
current : = là nút có f_score thấp nhất từ tập
openset
if current = goal
return reconstruct_path ( came_from, goal )
bỏ current ra khỏi openset
thêm current vào closedset
for mỗi nútkề với current {
if nútkề trong closedset
continue
Hình 1: Hình vẽ đồ thị G
Trang 9if (nútkề không có trong openset) hoặc
(tentative_g_score <= g_score [ nútkề ] ){
came_from [ nútkề ] : = current
g_score [ nútkề ] : = tentative_g_score
f_score [ nútkề ] : = g_score [ nútkề ] +
heuristic_cost_estimate ( nútkề, goal )
if nútkề chưa có trong in openset
thêm nútkề vào to openset
} }
}
return failure
Hàm reconstruct_path ( came_from, current_node )
if came_from [ current_node ] in set
p : = reconstruct_path ( came_from,
came_from [ current_node ])
return ( p + current_node )
else
return current_node
Hàm reconstruct_path(): xây dựng đường đi từ nút xuất phát đến nút mục tiêu dựa trên các thông tin trong tập came_from
2.4 Dữ liệu thử nghiệm
Cho đồ thị G vô hướng có trọng số, gồm 5 đỉnh Mỗi đỉnh có một tọa độ trên một hệ mặt phẳng
• G:={V,E}
• V:={a,b,c,d,s}
• Ma trận trọng số W
• Tọa độ các đỉnh a(1,1), b(3,1), c(2,3), d(0,1), s(2,1)
Trang 10[> ShortestPathAStar(s, d);
Chi phi den a tu s is 2
Chi phi den b tu s is 5
Chi phi den c tu s is 7
Chi phi den d tu b is 7
Chi phi den d tu c is 6
Duong di tot nhat [s, c, d] voi chi phi la =6
Trang 113 Kết luận
Qua quá trình tìm hiểu, và hoàn thành ứng dụng này, giúp em thêm các kiến thức về lập trình hình thức Sử dụng công cụ Maple để lập trình, sử dụng thư viện, ứng dụng các phương pháp biễu diễn dạng hình thức cho các tập hợp, tính toán trên các đối tượng danh sách, tập hợp … Công cụ này hỗ trợ tính toán nhanh chóng, ngoài ra còn hỗ trợ lập trình cho nên chúng ta có thể xây dựng những chương trình tùy biến cao theo nhu cầu sử dụng
Tuy nhiên chương trình chưa có giao diện để người dùng có thể giao diện người dùng để có thể tương tác dễ dàng
4 Tài liệu tham khảo
Danh sách trang thông tin tham khảo:
http://en.wikipedia.org/wiki/A*_search_algorithm
http://www.policyalmanac.org/games/aStarTutorial.htm
http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html