Tải bản đầy đủ (.docx) (11 trang)

CÀI ĐẶT THUẬT TOÁN A TRONG MAPLE

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 (221.97 KB, 11 trang )

ĐẠ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:
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
GV: Đỗ Văn Nhơn Trang
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ó 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:
 /> /> />Lập trình tính toán hình thức

×