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
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

Đ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

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

Mục lục

  • MỤC LỤC

  • LỜI NÓI ĐẦU

  • CHƯƠNG I: THIẾT KẾ GIAO DIỆN

    • 1 . Màn hình :

      • 1.2 Màn hình chí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 của nhà khoa học máy tính người Hà Lan Edsger Dijkstra, là một thuật toán giải quyết bài toán đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng không có cạnh mang trọng số âm.

          • 1/Bài toán:

          • Ta có thể giải bài toán bằng cách xác định một tập hợp S chứa các đỉnh mà khoảng cách ngắn nhất từ nó đến đỉnh nguồn v đã biết. Khởi đầu S = { V }. Sau đó tại mỗi bước ta sẽ thêm vào S các đỉnh mà khoảng cách từ nó đến v là ngắn nhất. Với giả thiết rằng mỗi cung có một giá trị không âm thì ta luôn luôn tìm được một đường đi ngắn nhất như vậy mà chỉ đi qua các đỉnh đã tồn tại trong S. Ðể dễ dàng chi tiết hóa giải thuật, giả sử G có n đỉnh và nhãn trên mỗi cung được lưu trong mảng C, tức là C[i, j] bằng giá trị(có thể xem là độ dài) của cung (i, j). Nếu i và j không có cung nối thì ta cho C[i, j] =Ġ. Ta sẽ dùng một mảng D có n phần tử để lưu độ dài của đường đi ngắn nhất từ v đến mỗi đỉnh của đồ thị. Khởi đầu thì giá trị này chính là độ dài cạnh (v, i), tức D[i] = C[v, i]. Tại mỗi bước của giải thuật thì D[i] sẽ lưu độ dài đường đi ngắn nhất từ đỉnh v đến đỉnh i, đường đi này chỉ đi qua các đỉnh đã có trong S. 2/Cài đặt:

          • Ðể cài đặt giải thuật dễ dàng, ta giả sử các đỉnh của đồ thị được đánh số từ 1 đến n và đỉnh nguồn là đỉnh

          • procedure Dijkstra; begin S := [1] ; { S chỉ chứa đỉnh nguồn } for i:=2 to n do D[i] := C[1, i] ; { Khởi đầu các giá trị cho D } for i:=1 to n - 1 do begin Lấy đỉnh w trong V - S sao cho D[w] là nhỏ nhất ; Thêm w vào S ; for mỗi đỉnh u thuộc V - S do D[u] := Min (D[u], D[w] + C[w, u]) ; end; end; <!--[if !supportLineBreakNewLine]--> <!--[endif]-->

          • Nếu muốn lưu trữ lại các đỉnh trên đường đi ngắn nhất để có thể xây dựng lại đường đi này từ đỉnh nguồn đến các đỉnh khác, ta dùng một mảng P. Mảng này sẽ lưu P[u] = w với đỉnh u là đỉnh trước của đỉnh w trên đường đi ngắn nhất. Lúc khởi đầu ta cho P[u] = 1, với mọi u khác 1. Giải thuật Dijkstra ở trên sẽ được viết lại như sau : <!--[if !supportLineBreakNewLine]--> <!--[endif]-->

          • procedure Dijkstra ; begin S := [1] ; { S chỉ chứa đỉnh nguồn } for i:=2 to n do begin D[i] := C[1, i] ; { Khởi đầu các giá trị cho D } P[i] := 1 ; { Khởi đầu các giá trị cho P } end ; for i:=1 to n - 1 do begin Lấy đỉnh w trong V - S sao cho D[w] là nhỏ nhất ; Thêm w vào S ; for mỗi đỉnh u thuộc V - S do 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ụ :

          • Áp dụng giải thuật Dijkstra cho đồ thị hình sau: <!--[if !supportLineBreakNewLine]-->

          • 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 1 dinh}

          • while kdo

          • begin

          • {Tim min}

          • min:=i’;

Tài liệu cùng người dùng

Tài liệu liên quan