Lập trình tính toán mô phỏng thuật toán tìm đường đi ngắn nhất theo thuật toán dijkstra
Mô thuật toán Dijkstra TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KHOA TOÁN TIN ỨNG DỤNG - - TIỂU LUẬN Đề tài: Lập trình tính toán mô thuật toán tìm đường ngắn theo thuật toán dijkstra Giáo viên hướng dẫn: Nguyễn Hữu Điển Sinh viên thực : Lê Văn Cường & Nguyễn Thị Hòa Lớp: toán 2-k51 Hà Nội, tháng 11 năm 2009 -1Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra PHẦN A: LÝ THUYẾT CƠ SỞ Giới thiệu 1.1 Hiện trạng vấn đề đặt Vài thập kỉ trở lại giới chứng kiến phát triển bùng nổ công nghệ thông tin với tốc độ chóng mặt Kèm theo xảy xu hướng tạm gọi “tin học hóa toàn thể”, mà công nghệ thông tin xâm nhập vào tất lĩnh vực: kinh tế, quân sự, khoa học, đời sống… Có thực tế học sinh sinh viên ngày nhàm chán với cách dạy học truyền thống Rõ ràng Toán, Lý, Hóa môn khác dễ vô người học nhìn thấy minh họa sinh động rõ ràng dễ hiểu Đồng thời lặp lặp lại cách thật nhàm chán tính toán hay phép biến đổi nặng nề mà không hiểu chất thật Hiện Việt Nam có phần mềm tiếng hỗ trợ giáo viên, học sinh, sinh viên giảng dạy học tập, Maple, Matlab, Mathematica, Mathcad… Tuy nhiên tiếng nhiều người sử dụng Maple Thậm chí viện đại học giới thay đổi dần cách học toán, hay chí phát triển song hành thêm phương pháp học toán đại học bên cạnh cách học truyền thống: Dạy cho sinh viên học sinh cách giải toán Maple Bản thân nhóm tìm hiểu Maple nhận thấy phần mềm tính toán thuận tiện cho học tập sử dụng 1.2 Maple gì? Maple chương trình tính toán mạnh mẽ Hãy thử làm phép so sánh nhỏ với công cụ tính toán thật quen thuộc với chúng ta: Chiếc máy tính bỏ túi (một phép so sánh khập khiễng) Máy tính bỏ túi tính toán với số cụ thể Maple khác Nó có khả làm -2Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra việc với biểu thức toán học phép tính hình thức Từ rút gọn, khai triển biểu thức, tính giới hạn, đạo hàm, nguyên hàm (chứ tính tích phân) bậc phổ thông Đến khai triển Taylor, tìm nghiệm phương trình vi phân, tính định thức, giải hệ phương trình tuyến tính có tham số… Maple xử lý tích tắc! Không vậy, Maple thể tài khả minh hoạ xuất sắc đồ thị hai chiều lẫn mặt cong không gian ba chiều, đồ thị toạ độ cực, tham số, hàm ẩn Điểm bật hơn, khả cho hình chạy sống động làm cho việc học tập giảng dạy trở nên thú vị Đặc điểm: • Là hệ thống tính toán ký hiệu biểu thức toán học • Có thể thực hầu hết phép toán chương trình toán đại học sau đại học.Tính toán nghiệm xác gần lớp rộng toán lý thuyết ứng dụng • Cung cấp công cụ minh họa hình học thuận tiện bao gồm: đồ thị, hình vẽ tĩnh động đường mặt cho hàm tùy ý nhiều hệ tọa độ khác • Một ngôn ngữ lập trình đơn giản mạnh mẽ có khả chuyển đổi sang ngôn ngữ lập trình khác • Cho phép trích xuất liệu định dạng khác Latex, Word, HTML • Một công cụ biên soạn giáo trình điện tử trình diễn giảng thuận tiện • Hỗ trợ theo nhiều mức độ cho sinh viên việc học tập 1.3 Cấu trúc tập hợp danh sách Maple Tập hợp Maple viết dẫy bao quanh dấu { }, ký hiệu toán học cho tập hợp hữu hạn Cũng đối tượng khác Maple tập hợp gán giá trị biến, làm đối số, kết phép tính hàm.Maple cung cấp số toán tử lấy hợp, lấy giao hiệu tập hợp -3Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra Bảng 1.7: Toán tử tập hợp Maple Tên toán Hợp tử Toán Maple a∪b a∩b Trừ tập hợp a-b a union a intersect a minus tử Ví >set1:={a,b}; set1:={a,b} >set2:={a,d,e}; set2:={a,d,e} >set3:={b,e}; set3:={b,e} dụ >u:=set1 union set2; b u:={b,a,d,e} >i:=set1 intersect set2; b i:={e} >d:=set1 minus set3; b d:={a} Việc xếp thứ tự tập hợp qui tắc đưa ra, cố gắng xếp liệu đưa vào tập hợp nguyên thứ tự Danh sách Maple dẫy phần tử lặp lại (mỗi phần tử nhất) Những phần tử trùng danh sách bị loại bỏ để lại Danh sách toán tử hợp, giao trừ Danh sách Maple tạo dẫy nằm dấu [ ] Phân biệt dẫy danh sách: viết [a,b],[b,c] Maple hiểu hai danh sách , viết (a,b),(b,c) dẫy mà a,b,b,c 1.4 Vẽ đồ thị hàm số 1.4.1 Hàm biến,đồ thị 2D - Lệnh plot > plot(cos(x) + sin(x), x=-Pi Pi); -4Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra ¾ plot(sin(t),t); (Khi không miền xác định, Maple lấy miền mặc định [-10,10]) ¾ plot(tan(x),x=-2*Pi 2*Pi,y=-4 4); -5Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra (Chỉ miền xác định miền giá trị) > plot([sin(x), x-x^3/6], x=0 2, color=[red,blue], style=[point,line]); (Vẽ đồ thị nhiều tham số Danh sách hàm số để cặp ngoặc vuông, tham số color thứ tự màu sắc cho đồ thị, tham số style kiểu nét vẽ theo thứ tự cho đồ thị) -6Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra 1.4.2 Hàm biến,đồ thị 3D - Lệnh plot 3D > plot3d(sin(x*y),x=-Pi Pi,y=-1 1); > c1:= [cos(u)-2*cos(0.4*v),sin(u)-2*sin(0.4*v),v]; > c2:= [cos(u)+2*cos(0.4*v),sin(u)+2*sin(0.4*v),v]; > c3:= [cos(u)+2*sin(0.4*v),sin(u)-2*cos(0.4*v),v]; > plot3d({c1,c2,c3},u=0 2*Pi,v=0 10,grid=[25,15]); -7Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra (Vẽ nhiều mặt cong nhau: {c1, c2, c3}, c1, c2, c3 mô tả dạng tham số {u,v}) 1.4.3 Vẽ tiếp tuyến - Lệnh showtangent > with(student): > showtangent(x^2+5, x = 2); 1.4.4 Vẽ đồ thị kèm biểu đồ - Lệnh rightbox, leftbox, middlebox > with (student): > rightbox(sin(x)*x+sin(x), color=CYAN); -8Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa x=0 2*Pi, 4, Mô thuật toán Dijkstra 1.5 Một số lệnh 1.5.1 Cấu trúc điều khiển a Câu lệnh rẽ nhánh if conditional expression then statement sequence elif conditional expression then statement sequence else statement sequence fi Ví dụ: > a := 3; b := 5; a := b := > if (a > b) then a else b fi; b Lặp xác định for from to od; -9Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra for in od; Ví dụ 1: > sum := 0; > for i from 11 to 100 sum := sum + i > od; > print(sum); Ví d_ 2: > bob:=[1,2,4,5,7]; > sum:=0; > for m in bob > sum:=sum+m > od; > print(sum); Ví d_ 3: > for i from by to 100 print(i) od; c Lặp không xác định while od; 1.5.2 Hàm thủ tục > p:= proc(x,y) if x^2 x*sin(x*y) fi end: > h:= proc(x) x^2 end: > plot3d(p,-2 2,-1 h); < y then cos(x*y) else PHẦN B: MÔ PHỎNG THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT Giới thiệu toán Bài toán tìm đường ngắn tìm đường đồ thị có trọng số (chiều dài) nối đỉnh x y cho trước với đặt tính tổng trọng số tất cạnh nhỏ tất đường từ đỉnh x đến đỉnh y - 10 Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra Nguyên lý tối ưu tồn đường ngắn từ đỉnh I đến đỉnh j đỉnh k nằm đường ta phải có đường từ đỉnh i đến đỉnh k đường từ đỉnh k đến đỉnh j đuờng ngắn Trong giải thuật sau, ta dùng ma trận chiều dài L để chứa chiều dài cung, chiều dài cung số không âm (lớn hay 0) ta có: L[l,j]:=0 với i=1,2 n L[l,j]:>0 tồn cung từ đỉnh i đến đỉnh j L[i,j]= vô cực không tồn cung từ đỉnh i đến đỉnh j Giải thuật Dijstra Gọi Q hợp chứa đỉnh chưa chọn S tập hợp đỉnh chọn Tại thời điểm , tập S chứa tất đỉnh mà khoảng cách nhỏ từ X đến chúng xác định Tập Q chứa đỉnh lại Bắt đầu giải thuật với tập S chứa đỉnh nguồn, giải thuật kết thúc tập S chứa tất đỉnh đồ thị toán giải xong Tại bước, ta chọn đỉnh tập Q mà khoảng cách từ đỉnh nguồn đến đỉnh nhỏ đưa đỉnh vào tập S Đây giải thuật tìm đuờng ngắn đồ thị có trọng số(chiều dài) nối hai đỉnh X Y cho trước với đặt tính tổng trọng số tất cạnh nhỏ tất đường từ đỉnh X đến đỉnh Y Nếu tất toán trở thành toán tìm đường có số cạnh nối hai đỉnh X Y Trong trường hợp tổng quát, đường từ đỉnh X đến đỉnh Y qua tất đỉnh đồ thị, ta thường xét toán tìm đường ngắn nối từ đỉnh X cho trước với tất đỉnh khác đồ thị - 11 Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra Như vậy, đuờng từ đỉnh nguồn đỉnh khác riêng biệt tất đỉnh trung gian đường nằm tập hợp S Tại bước giải thuật, mảng chiều dài K(gồm n phần tử) dùng để chứa chiều dài đường riêng biệt ngắn đến đỉnh đồ thị Mỗi lần ta đưa đỉnh v vào tập hợp S, đường riêng biệt ngắn đến đỉnh v đường ngắn tất đường đến đỉnh v Khi giải thuật kết thúc tất đỉnh nằm đồ thị nằm tập hợp S, tất đường từ đỉnh nguồn đến tất đỉnh khác đường riêng biệt Chương trình hoạt động sau 3.1, Xây dựng hàm dijkstra theo giải thuật CODE: >restart: with(networks): dijkstra:=proc(G::graph, x) local weight,L,K,P,Q,v,u: weight:=proc(G::graph, u, v) if edges({u,v},G)={} then return infinity: else return eweight(edges({u,v},G)[1],G): fi: end; P:={}: Q:=vertices(G): L:=table(): K:=table(): for v in vertices(G) L[v]:=infinity: od: L[x]:=0: u:=x: - 12 Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra while L[u]dothi:=graph({A, B, C, D, E, F, G, H, I, S},{{A,D}, {A,G}, {B,G}, {B,I}, {C,D}, {C,E}, {A,S}, {D,F}, {E,F}, {E,H}, {F,G}, {F,I}, {H,I}, {B,S}}): 3.4, Nhập trọng số đỉnh Sau khai báo đỉnh đồ thị, ta dùng hàm eweight để nhập trọng số đỉnh đồ thị Ví dụ: Đường từ đỉnh A đến D có trọng số e1 = Đường từ đỉnh F đến G có trọng số e10 = CODE: > tso:=eweight(dothi): >tso[e1]:=1:tso[e2]:=2:tso[e3]:=3:tso[e4]:=4:tso[e5]:=5:tso[e6]:=6:tso[e7] :=1:tso[e8]:=2:tso[e9]:=4:tso[e10]:=6:tso[e11]:=1:tso[e12]:=2:tso[e13]:=4 :tso[e14]:=8: 3.5, Hàm vẽ đồ thị - 15 Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra CODE: >draw(Linear([C,E,H], [D,F,I], [A,G,B],[S]), dothi); 3.6, Đỉnh bắt đầu Ta truyền tham số dothi biến S đỉnh xuất phát vào hàm Dijkstra, kết lưu vào mảng ngan1 CODE: >ngan1:=dijkstra(dothi,S); 3.6, Đỉnh kết thúc Vòng lặp thực đỉnh H truyền vào, lúc hàm dijsktra thực đưa đường ngắn CODE: - 16 Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô thuật toán Dijkstra >ngan1[1][H]; 3.7, Lộ trình đường ngắn từ đỉnh S đến đỉnh H CODE: >listpath(ngan1,S,H); PHẦN C: KẾT LUẬN Trên chương trình Nội dung xác mã nguồn Thầy xem tệp Dijkstra_full.mws TÀI LIỆU THAM KHẢO * [1] - "Giáo trình Maple", Nguyễn Hữu Điển (chủ biên) *[2] - Một số tài liệu tham khảo Website: + www.nhdien.wordpress.com + www.google.com.vn - 17 Giảng viên: Thầy giáo Nguyễn Hữu Điển Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa [...].. .Mô phỏng thuật toán Dijkstra Nguyên lý tối ưu là nếu tồn tại một đường đi ngắn nhất từ đỉnh I đến đỉnh j và đỉnh k nằm trên con đường đi này thì ta phải có các đường đi từ đỉnh i đến đỉnh k và đường đi từ đỉnh k đến đỉnh j là những đuờng đi ngắn nhất Trong các giải thuật sau, ta dùng ma trận chiều dài L để chứa chiều dài các cung, chiều... nếu tất cả các đỉnh trung gian trên đường đi này đều nằm trong tập hợp S Tại mỗi bước của giải thuật, một mảng chiều dài K(gồm n phần tử) dùng để chứa chiều dài đường đi riêng biệt ngắn nhất đến mỗi đỉnh của đồ thị Mỗi lần ta đưa đỉnh mới v vào tập hợp S, đường đi riêng biệt ngắn nhất đến đỉnh v cũng là đường đi ngắn nhất trong tất cả các đường đi đến đỉnh v Khi giải thuật kết thúc tất cả các đỉnh nằm... nhỏ nhất và đưa đỉnh này vào tập S Đây là giải thuật tìm đuờng đi ngắn nhất của đồ thị có trọng số(chiều dài) nối hai đỉnh X và Y đã cho trước với đặt tính là tổng các trọng số của tất cả các cạnh là nhỏ nhất trong tất cả các đường đi từ đỉnh X đến đỉnh Y Nếu tất cả đều bằng 1 thì bài toán này trở thành bài toán tìm đường đi có số cạnh ít nhất nối giữa hai đỉnh X và Y Trong trường hợp tổng quát, đường. .. X và Y Trong trường hợp tổng quát, đường đi từ đỉnh X đến đỉnh Y có thể đi qua tất cả các đỉnh trong đồ thị, vì thế ta thường xét bài toán tìm đường đi ngắn nhất nối từ đỉnh X cho trước với tất cả các đỉnh khác trong đồ thị - 11 Giảng viên: Thầy giáo Nguyễn Hữu Đi n Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô phỏng thuật toán Dijkstra Như vậy, đuờng đi từ đỉnh nguồn một đỉnh khác là riêng... Thầy giáo Nguyễn Hữu Đi n Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô phỏng thuật toán Dijkstra >ngan1[1][H]; 3.7, Lộ trình đường đi ngắn nhất từ đỉnh S đến đỉnh H CODE: >listpath(ngan1,S,H); PHẦN C: KẾT LUẬN Trên đây là cơ bản về chương trình Nội dung chính xác mã nguồn Thầy có thể xem ở tệp Dijkstra_ full.mws TÀI LIỆU THAM KHẢO * [1] - "Giáo trình Maple", Nguyễn Hữu Đi n (chủ biên) *[2]... khoang cach tam thoi ngan nhat tu x u:=Q[1]: for v in Q do if L[v]listpath:=proc(lk,u,v) local p: if lk[1][v]=infinity then print("Khong tim... Hòa Mô phỏng thuật toán Dijkstra CODE: >draw(Linear([C,E,H], [D,F,I], [A,G,B],[S]), dothi); 3.6, Đỉnh bắt đầu Ta truyền tham số dothi và biến S là đỉnh xuất phát vào hàm Dijkstra, kết quả sẽ được lưu vào mảng ngan1 CODE: >ngan1: =dijkstra( dothi,S); 3.6, Đỉnh kết thúc Vòng lặp sẽ được thực hiện cho đến khi đỉnh H được truyền vào, lúc đó hàm dijsktra sẽ thực hiện và đưa ra đường đi ngắn nhất CODE: -... đến đỉnh v Khi giải thuật kết thúc tất cả các đỉnh nằm trên đồ thị đều nằm trong tập hợp S, do đó tất cả các đường đi từ đỉnh nguồn đến tất cả các đỉnh khác đều là đường đi riêng biệt 3 Chương trình hoạt động như sau 3.1, Xây dựng hàm dijkstra theo giải thuật trên CODE: >restart: with(networks): dijkstra: =proc(G::graph, x) local weight,L,K,P,Q,v,u: weight:=proc(G::graph, u, v) if edges({u,v},G)={} then... fi: if u=v then return [u]: else return [listpath(lk,u,lk[2][v])[],v]: fi: end; - 14 Giảng viên: Thầy giáo Nguyễn Hữu Đi n Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô phỏng thuật toán Dijkstra 3.3,Các đỉnh trong đồ thị Khai báo các đỉnh trong đồ thị, biến sẽ được truyền lên hàm dijkstra CODE: >dothi:=graph({A, B, C, D, E, F, G, H, I, S},{{A,D}, {A,G}, {B,G}, {B,I}, {C,D}, {C,E}, {A,S}, {D,F},... dụ: Đường đi từ đỉnh A đến D có trọng số e1 = 1 Đường đi từ đỉnh F đến G có trọng số e10 = 6 CODE: > tso:=eweight(dothi): >tso[e1]:=1:tso[e2]:=2:tso[e3]:=3:tso[e4]:=4:tso[e5]:=5:tso[e6]:=6:tso[e7] :=1:tso[e8]:=2:tso[e9]:=4:tso[e10]:=6:tso[e11]:=1:tso[e12]:=2:tso[e13]:=4 :tso[e14]:=8: 3.5, Hàm vẽ đồ thị - 15 Giảng viên: Thầy giáo Nguyễn Hữu Đi n Sinh viên thực hiện: Lê Văn Cường & Nguyễn Thị Hòa Mô phỏng