Trong bài tiểu luận này, em xin trình bày cách cài đặt thuật toán tìm đường đi ngắn nhất Dijkstra bằng cách sử dụng các công cụ giải toán mạnh mẽ của Maple 16.. Giao diện trực quan của M
Trang 1TIỂU LUẬN MÔN HỌC LẬP TRÌNH SYMBOLIC VÀ TRÍ TUỆ NHÂN TẠO
ĐỀ TÀI:
Ứng dụng Maple cài đặt thuật toán tìm
đường đi ngắn nhất Dijkstra
Người thực hiện: Phạm Vĩnh Thành
Mã số: CH1101035
Lớp: Cao học khóa 6 đợt 2
TP.HCM – 2013
Trang 2MỤC LỤC
MỤC LỤC 1
Phần 1: MAPLE 3
I Giới thiệu 3
II Chức năng 3
III Kiến trúc 4
Phần 2: Cài đặt giải thuật Dijkstra 5
I Phân tích yêu cầu 5
II Cấu trúc dữ liệu 5
III Thuật toán 6
IV Dữ liệu thử nghiệm 7
KẾT LUẬN 9
TÀI LIỆU THAM KHẢO 10
Trang 3LỜI MỞ ĐẦU
Chúng em xin chân thành cảm ơn Thầy Đỗ Văn Nhơn đã truyền đạt
những kiến thức quý báu từ những kinh nghiệm sống đến những vấn đề khoa học mới nhất trong bộ môn Biểu diễn tri thức và ứng dụng
Trong bài tiểu luận này, em xin trình bày cách cài đặt thuật toán tìm đường đi ngắn nhất Dijkstra bằng cách sử dụng các công cụ giải toán mạnh mẽ của Maple 16
Tuy đã có nhiều cố gắng nhưng do hạn chế về kiến thức, thời gian và nguồn tài liệu tham khảo nên các vấn đề nghiên cứu trong tiểu luận chắc chắn còn nhiều thiếu sót
Chân thành cám ơn!
Phạm Vĩnh Thành
Trang 4Phần 1: MAPLE
I Giới thiệu
Maple là một gói phần mềm toán học thương mại phục vụ cho nhiều mục đích Nó phát triển lần đầu tiên vào năm 1980 bởi Nhóm Tính toán Hình thức tại Đại học Waterloo ở Waterloo, Ontario, Canada
Từ năm 1988, nó đã được phát triển và thương mại hóa bởi Waterloo Maple Inc (còn được biết đến với tên gọi Maplesoft), một công ty Canada cũng có trụ
sở tại Waterloo, Ontario Phiên bản hiện tại là Maple 16 được phát hành vào năm
2012 Đối thủ cạnh tranh chính của nó là Mathematica
Maple sẽ giúp bạn phân tích, khám phá, hình dung, và giải quyết các vấn đề toán học Với trên 5000 chức năng, Maple cung cấp độ rộng, chiều sâu, và hiệu suất xử lý tất cả các loại của toán học Giao diện trực quan của Maple hỗ trợ nhiều phong cách tương tác, từ các công cụ Clickable Math tới một ngôn ngữ lập trình tinh vi Sử dụng môi trường tài liệu thông minh được cung cấp bởi Maple, bạn tự động có thể nắm bắt tất cả các kiến thức kỹ thuật của bạn trong một hình thức điện tử kết hợp tính toán, văn bản giải thích và toán học, đồ họa, hình ảnh,
âm thanh, và sơ đồ
II Chức năng
- Thực hiện các tính toán với khối lượng lớn, với thời gian nhanh và độ chính xác cao
- Sử dụng các gói chuyên dụng của Maple để giải quyết các bài toán cụ thể như: vẽ đồ thị (gói plots), hình học giải tích (gói geometry), đại số tuyến tính (gói linalg), Giải tích (gói student), phương trình vi phân(gói DEtools), lý thuyết số (gói numtheory), Dữ liệu rời rạc(gói DiscreteTransforms),
Trang 5- Minh họa hình học thuận tiện gồm: vẽ đồ thị tĩnh và động của các đường và mặt được cho bởi các hàm tùy ý trong nhiều hệ tọa độ khác nhau;
- Tính toán trên các biểu thức đại số;
- Có thể thực hiệc được hầu hết các phép toán cơ bản trong chương trình toán đại học và sau đại học;
- Ngôn ngữ lập trình đơn giản và mạnh mẽ, có khả năng tương tác với các ngôn ngữ lập trình khác;
- Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp học tương tác trực tiếp;
- Một công cụ hữu ích cho học sinh và sinh viên trong việc tự học;
- Tăng thêm 270 chức năng so với phiên bản trước đó
III Kiến trúc
Phần lớn chức năng toán học của Maple được viết bằng ngôn ngữ Maple,
và được thông dịch bởi nhân Maple Nhân Maple được viết bằng C Maple chạy trên tất cả các hệ điều hành chính
Ngôn ngữ lập trình Maple là một ngôn ngữ kiểu động Cũng giống như các hệ thống đại số máy tính, các biểu thức hình thức được lưu trữ trong bộ nhớ theo đồ thị không chu trình có hướng (DAG) Ngôn ngữ cho phép các biến có phạm vi nhất định (lexical scoping) Ngôn ngữ có hình thức lập trình hàm, nhưng cũng có hỗ trợ đầy đủ cho lập trình truyền thống, theo kiểu mệnh lệnh
Một điều lạ đối với chương trình thương mại, đa số mã nguồn đều có thể xem tự do
Trang 6Tiểu luận: Lập trình Symbolic và trí tuệ nhân tạo
Phần 2: Cài đặt giải thuật Dijkstra
I Phân tích yêu cầu
- Đầu vào:
Đồ thị:
o Tập hợp các đỉnh
o Tập hợp các cạnh
o Trọng số của các cạnh
Điều kiện: Đồ thị đơn giản, hữu hạn, vô hướng, có trọng số dương
- Đầu ra: Kết quả trả về đường đi ngắn nhất giữa 2 đỉnh bằng thuật toán
Dijkstra
II Cấu trúc dữ liệu
- G: đồ thị nhập vào
- x: điểm bắt đầu
- weight: là thủ tục để lấy trọng số của cạnh nối hai đỉnh u, v hoặc trả về vô
cực nếu giữa u, v không có cạnh nối giữa chúng
- P: tập hợp các đỉnh gần nhất với đỉnh x
- Q: tập hợp các đỉnh chưa được chọn
- u, v là biến tạm cho các đỉnh được xét
- L(v): là table chứa các khoảng cách tạm ngắn nhất từ x tới v
- K(v): là table chứa các đỉnh xét trước của v trong đường đi ngắn nhất
được tìm thấy từ u đến v
III Thuật toán
- Cài đặt thuật toán Dijkstra
- Lấy đường đi ngắn nhất giữa 2 đỉnh u, v
weight:=proc(G::graph, u, v)
if edges({u,v},G)={} then
return infinity:
else
return eweight(edges({u,v},G)[1],G):
end if:
end proc:
# Khởi tạo các giá trị ban đầu
P:={}:
Q:=vertices(G):
L:=table():
K:=table():
for v in vertices(G) do
L[v]:=infinity:
end do:
L[x]:=0:
u:=x:
while L[u]<infinity do
P:=P union {u}:
Q:=Q minus {u}:
if Q={} then
break:
end if:
for v in Q do
if L[u]+weight(G,u,v) < L[v] then
L[v]:=L[u]+weight(G,u,v):
K[v]:=u:
end if:
end do: #End for
u:=Q[1]:
for v in Q do
if L[v]<L[u] then
u:=v:
end if:
end do: #End for
end do: #End while
return [L,K]:
end proc:
listpath := proc (lk, u, v)
local p;
if lk[1][v] = infinity then
error "Khong co duong giua 2 dinh %1 to %2.", u, v
end if;
if u = v then
return [u]
else
Trang 7IV.Dữ liệu thử nghiệm
- Dữ liệu mẫu ngẫu nhiên 1
> result1 := dijkstra(graph1, 2):
> listpath(result1, 2, 5);
[2, 3, 5]
Trang 8- Dữ liệu mẫu ngẫu nhiên 2
> result2 := dijkstra(graph2, 1):
> listpath(result2, 1, 5);
[1, 3, 5]
Trang 9KẾT LUẬN
Báo cáo này đã làm nổi bật vai trò của Maple trong việc hỗ trợ người dùng lập trình các thuật toán phức tạp như Dijkstra đơn giản hơn bằng các kiểu cấu trúc dữ liệu được định nghĩa sẵn cho đồ thị Với công cụ mô phỏng vẽ đồ thị, người dùng được cái nhìn trực quan hơn về bài toán Điểm hạn chế trong việc vẽ
đồ thị là chưa hiển thị đồ thị có trọng số được
Một lần nữa, em xin cám ơn Thầy Đỗ Văn Nhơn đã giảng dạy cho chúng
em kiến thức nền tảng, những bài giảng bổ ích của Thầy đã giúp em hoàn thành được bài tiểu luận này
Trang 10TÀI LIỆU THAM KHẢO
[1] Bài giảng của Thầy Đỗ Văn Nhơn
[2] http://maplesoft.com
[3] Maple: http://vi.wikipedia.org/wiki/Maple
[4] Dijkstra's algorithm in Maple:
http://www-rohan.sdsu.edu/~ituba/math3134s05/dijkstra/dijkstra.html