1. Trang chủ
  2. » Công Nghệ Thông Tin

Báo cáo thuật toán DIJKSTRA và xây dựng ứng dụng mô phỏng tìm đường đi ngắn nhất

14 1,3K 9

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 686,5 KB

Nội dung

MỤC LỤC MỤC LỤC LỜI NÓI ĐẦU CHƯƠNG I: THIẾT KẾ GIAO DIỆN Màn hình : CHƯƠNG 2.THUẬT TOÁN GIẢI QUYẾT BÀI TOÁN - THUẬT TOÁN DIJKSTRA Thuật toán Dijkstra, mang tên nhà khoa học máy tính người Hà Lan Edsger Dijkstra, thuật toán giải toán đường ngắn nguồn đơn đồ thị có hướng khơng có cạnh mang trọng số âm Ta giải tốn cách xác định tập hợp S chứa đỉnh mà khoảng cách ngắn từ đến đỉnh nguồn v biết Khởi đầu S = { V } Sau bước ta thêm vào S đỉnh mà khoảng cách từ đến v ngắn Với giả thiết cung có giá trị khơng âm ta ln ln tìm đường ngắn mà qua đỉnh tồn S Ðể dễ dàng chi tiết hóa giải thuật, giả sử G có n đỉnh nhãn cung lưu mảng C, tức C[i, j] giá trị(có thể xem độ dài) cung (i, j) Nếu i j khơng có cung nối ta cho C[i, j] =Ġ Ta dùng mảng D có n phần tử để lưu độ dài đường ngắn từ v đến đỉnh đồ thị Khởi đầu giá trị độ dài cạnh (v, i), tức D[i] = C[v, i] Tại bước giải thuật D[i] lưu độ dài đường ngắn từ đỉnh v đến đỉnh i, đường qua đỉnh có S 2/Cài đặt: Ðể cài đặt giải thuật dễ dàng, ta giả sử đỉnh đồ thị đánh số từ đến n đỉnh nguồn đỉnh .6 procedure Dijkstra; begin S := [1] ; { S chứa đỉnh nguồn } for i:=2 to n D[i] := C[1, i] ; { Khởi đầu giá trị cho D } for i:=1 to n - begin Lấy đỉnh w V - S cho D[w] nhỏ ; Thêm w vào S ; for đỉnh u thuộc V - S D[u] := Min (D[u], D[w] + C[w, u]) ; end; end; .7 Nếu muốn lưu trữ lại đỉnh đường ngắn để xây dựng lại đường từ đỉnh nguồn đến đỉnh khác, ta dùng mảng P Mảng lưu P[u] = w với đỉnh u đỉnh trước đỉnh w đường ngắn Lúc khởi đầu ta cho P[u] = 1, với u khác Giải thuật Dijkstra viết lại sau : procedure Dijkstra ; begin S := [1] ; { S chứa đỉnh nguồn } for i:=2 to n begin D[i] := C[1, i] ; { Khởi đầu giá trị cho D } P[i] := ; { Khởi đầu giá trị cho P } end ; for i:=1 to n - begin Lấy đỉnh w V - S cho D[w] nhỏ ; Thêm w vào S ; for đỉnh u thuộc V - S if (D[w] + C[w, u] < D [u]) then begin D[u] := D[w] + C[w, u] ; P[u] := w ; end ; end; end; 3/Ví dụ :.8 Áp dụng giải thuật Dijkstra cho đồ thị hình sau: procedure DijksTra; 10 begin 10 t:=false; 10 Tìm đường ngắn t[u0]:=true; 10 d[i]:=c[u0,i];{Neu khong co duong di thi d[i]=i’} .10 k:=1;{Da ket nap duoc dinh} 10 while kdo .10 begin 10 {Tim min} 10 min:=i’; .10 for i:=1 to n 10 if (d[i]d[u]+c[u,i] then 10 if not((d[i]=i’)and(d[u]=i’)and(c[u,i]=i’)) then 10 begin 10 d[i]:=d[u]+c[u,i]; 10 truoc[i]:=u 10 end .11 end; 11 if d[v0]=i’ then 11 KhongCoDuongDi .11 else 11 QuayLaiMangTruocDeTimDuong .11 end; 11 Chương 3: tả chung code: .11 KẾT LUẬN 13 Tìm đường ngắn LỜI NĨI ĐẦU Trong đời sống, thường gặp tình sau: để từ địa điểm A đến địa điểm B , có nhiều đường đi, nhiều cách đi; có lúc ta chọn đường ngắn (theo nghĩa cự ly), có lúc lại cần chọn đường nhanh (theo nghĩa thời gian) có lúc phải cân nhắc để chọn đường rẻ tiền (theo nghĩa chi phí), v.v Tìm đường ngắn CHƯƠNG I: THIẾT KẾ GIAO DIỆN Màn hình : Màn hình dùng để nhập vào thơng tin : - Load Map - Open -Start -Reset -About, Exit Tìm đường ngắn 1.2 Màn hình Gồm phần hiển thị thành phố,Thơng tin,Kết quả,các chức Tìm đường ngắn CHƯƠNG 2.THUẬT TOÁN GIẢI QUYẾT BÀI TOÁN - THUẬT TOÁN DIJKSTRA Thuật toán Dijkstra, mang tên nhà khoa học máy tính người Hà Lan Edsger Dijkstra, thuật toán giải toán đường ngắn nguồn đơn đồ thị có hướng khơng có cạnh mang trọng số âm 1/Bài tốn: Ta giải toán cách xác định tập hợp S chứa đỉnh mà khoảng cách ngắn từ đến đỉnh nguồn v biết Khởi đầu S = { V } Sau bước ta thêm vào S đỉnh mà khoảng cách từ đến v ngắn Với giả thiết cung có giá trị khơng âm ta ln ln tìm đường ngắn mà qua đỉnh tồn S Ðể dễ dàng chi tiết hóa giải thuật, giả sử G có n đỉnh nhãn cung lưu mảng C, tức C[i, j] giá trị(có thể xem độ dài) cung (i, j) Nếu i j khơng có cung nối ta cho C[i, j] =Ġ Ta dùng mảng D có n phần tử để lưu độ dài đường ngắn từ v đến đỉnh đồ thị Khởi đầu giá trị độ dài cạnh (v, i), tức D[i] = C[v, i] Tại bước giải thuật D[i] lưu độ dài đường ngắn từ đỉnh v đến đỉnh i, đường qua đỉnh có S 2/Cài đặt: Ðể cài đặt giải thuật dễ dàng, ta giả sử đỉnh đồ thị đánh số từ đến n đỉnh nguồn đỉnh Tìm đường ngắn procedure Dijkstra; begin S := [1] ; { S chứa đỉnh nguồn } for i:=2 to n D[i] := C[1, i] ; { Khởi đầu giá trị cho D } for i:=1 to n - begin Lấy đỉnh w V - S cho D[w] nhỏ ; Thêm w vào S ; for đỉnh u thuộc V - S D[u] := Min (D[u], D[w] + C[w, u]) ; end; end; Nếu muốn lưu trữ lại đỉnh đường ngắn để xây dựng lại đường từ đỉnh nguồn đến đỉnh khác, ta dùng mảng P Mảng lưu P[u] = w với đỉnh u đỉnh trước đỉnh w đường ngắn Lúc khởi đầu ta cho P[u] = 1, với u khác Giải thuật Dijkstra viết lại sau : Tìm đường ngắn procedure Dijkstra ; begin S := [1] ; { S chứa đỉnh nguồn } for i:=2 to n begin D[i] := C[1, i] ; { Khởi đầu giá trị cho D } P[i] := ; { Khởi đầu giá trị cho P } end ; for i:=1 to n - begin Lấy đỉnh w V - S cho D[w] nhỏ ; Thêm w vào S ; for đỉnh u thuộc V - S if (D[w] + C[w, u] < D [u]) then begin D[u] := D[w] + C[w, u] ; P[u] := w ; end ; end; end; 3/Ví dụ : Tìm đường ngắn Áp dụng giải thuật Dijkstra cho đồ thị hình sau: Tìm đường ngắn procedure DijksTra; begin t:=false; t[u0]:=true; d[i]:=c[u0,i];{Neu khong co duong di thi d[i]=i’} k:=1;{Da ket nap duoc dinh} while kdo begin {Tim min} min:=i’; for i:=1 to n if (d[i]d[u]+c[u,i] then if not((d[i]=i’)and(d[u]=i’)and(c[u,i]=i’)) then begin d[i]:=d[u]+c[u,i]; truoc[i]:=u 10 Tìm đường ngắn end end; if d[v0]=i’ then KhongCoDuongDi else QuayLaiMangTruocDeTimDuong end; Chương 3: tả chung code: 1.1 tả chung kí hiệu: Ký hiệu dùng giải thuật Dijkstra Tập đỉnh thứ tự 0… n-1 , (có n đỉnh), với s đỉnh gốc giá trị phần tử a[i][j] độ dài từ i-◊Ma trận kề A=[i,j] >j , [Vậy a[i][j]=0, i j khơng có cạnh nối nhau] Mark[i] = : chọn (đỉnh i chọn vào T), Mark[i]=0: ngược lại, [Mark mảng có n phần tử dùng để đánh dấu đỉnh i chọn vào T hay chưa] pr[i]: đỉnh trước đỉnh i (ví dụ: pr[6]=3, đỉnh đỉnh trước tới đỉnh 6), [pr : (previous) mảng có n phần tử dùng để truy tìm ngược lại đỉnh trước(đỉnh cha) đỉnh đó] d[i]: giá trị phần tử d[i] độ dài đường nối từ s->i (s đỉnh gốc), [d mảng có n phần tử, giá trị phần tử thứ i độ dài s->i] Ý tưởng giải Dijkstra 11 Tìm đường ngắn Ta xây dựng phủ tối tiểu T từ đỉnh s đỉnh gốc Ở bước lặp: chọn đỉnh i T, cho đỉnh nối với cây, mà có đường tới gốc s ngắn Dừng lặp T đủ n đỉnh Vậy kết T cuối phủ, có đỉnh gốc s tới đỉnh lại ngắn Thủ tục Khởi tạo: Gốc s; d=vocuc; d[s]=0 Mark=0; Mark[s]=1; [chọn s đỉnh T, (s đỉnh gốc)] d=a[s][i]; [lưu lại độ dài từ s đến tất đỉnh i (lấy từ ma trận kề) vào mảng d] pr[i]=s; [đỉnh s đỉnh trước(đỉnh cha) tất đỉnh lại] Ở bước lặp thuật tốn Dijkstra 1) Tìm k: d[k] = {d[j]: Mark[j] =0 }, [k đỉnh chọn từ tất đỉnh j nằm T (tức Mark[j]=0), cho khoảng cách từ s->k (tức d[k]) nhỏ so với khoảng cách từ s->j (tức d[j]) ] 2) Cập nhật: Mark[k] = 1; Với đỉnh j mà Mark[j]=0 Nếu d[k]+a[k][j] < d[j] 12 Tìm đường ngắn d[j] = d[k]+a[k][j]; pr[j] = k; Giải thích phần cập nhật: Mark[k] = 1, [chọn đỉnh k vào T] Mark[j]=0, [chỉ chọn đỉnh j chưa đánh dấu (còn nằm ngồi T) ] d[k]+a[k][j] < d[j], [nếu khoảng cách từ s->j (tức d[j]) mà lớn khoảng cách từ s->k->j (tức d[k]+a[k][j] ) chọn lại đường ngắn từ s->j qua k (s->j->k)] d[j] = d[k]+a[k][j], [độ dài từ s->j (tức d[j]) với độ dài từ s->k (tức d[k]) từ k->j (tức a[k][j]).] pr[j]=k, [đỉnh k đỉnh trước tới j] KẾT LUẬN Bài báo cáo em cố gắng tổng hợp đầy đủ nội dung liên quan đến đề tài ” Tìm đường ngắn phương pháp Dijikstra” Xin chân thành cảm ơn! TÀI LIỆU THAM KHẢO http://vi.wikipedia.org/wiki/%C4%90%C6%B0%E1%BB%9Dng_%C4%91i_ng%E1%BA%AFn_nh %E1%BA%A5thttp://vi.wikipedia.org/wiki/B%C3%A0i_to%C3%A1n_m %C3%A3_%C4%91i_tu%E1%BA%A7n 13 Tìm đường ngắn 14 ... 2.THUẬT TỐN GIẢI QUYẾT BÀI TỐN - THUẬT TỐN DIJKSTRA Thuật tốn Dijkstra, mang tên nhà khoa học máy tính người Hà Lan Edsger Dijkstra, thuật toán giải toán đường ngắn nguồn đơn đồ thị có hướng khơng... cách đi; có lúc ta chọn đường ngắn (theo nghĩa cự ly), có lúc lại cần chọn đường nhanh (theo nghĩa thời gian) có lúc phải cân nhắc để chọn đường rẻ tiền (theo nghĩa chi phí), v.v Tìm đường ngắn. .. dùng để nhập vào thông tin : - Load Map - Open -Start -Reset -About, Exit Tìm đường ngắn 1.2 Màn hình Gồm phần hiển thị thành phố,Thơng tin,Kết quả,các chức Tìm đường ngắn CHƯƠNG 2.THUẬT TỐN GIẢI

Ngày đăng: 21/12/2017, 19:24

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w