Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
132,51 KB
Nội dung
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜ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 GV: Đỗ Văn Nhơn Trang LỜ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. Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang NỘI DUNG Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang 1 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 Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang Giố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. Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang 2 Ứ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ố, … Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang 2.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 tentative_g_score := g_score[current] + dist_between(current, nútkề) Lập trình tính toán hình thức Hình 1: Hình vẽ đồ thị G GV: Đỗ Văn Nhơn Trang if (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) Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang [> 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 Lập trình tính toán hình thức [...]... 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 Lập trình tính toán hình...Trang GV: Đỗ Văn Nhơn 3 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ó . 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. DUNG Lập trình tính toán hình thức GV: Đỗ Văn Nhơn Trang 1 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. Văn Nhơn Trang 2.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] :=