Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
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ẬTTOÁNDIJKSTRAThuậttoán Dijkstra, mang tên nhà khoa học máy tính người Hà Lan Edsger Dijkstra, thuậttoán giải toánđườngngắ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đườngngắ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 đườngngắ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 đườngngắ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 đườngngắn để xâydự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 đườngngắn Lúc khởi đầu ta cho P[u] = 1, với u khác Giải thuậtDijkstra 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ậtDijkstra cho đồ thị hình sau: procedure DijksTra; 10 begin 10 t:=false; 10 Tìmđườngngắn t[u0]:=true; 10 d[i]:=c[u0,i];{Neu khong co duongdi 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: Mô tả chung code: .11 KẾT LUẬN 13 Tìmđườngngắ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 đườngngắ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đườngngắ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đườngngắ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đườngngắn CHƯƠNG 2.THUẬT TOÁN GIẢI QUYẾT BÀI TOÁN - THUẬTTOÁNDIJKSTRAThuậttoán Dijkstra, mang tên nhà khoa học máy tính người Hà Lan Edsger Dijkstra, thuậttoán giải toánđườngngắ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đườngngắ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 đườngngắ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 đườngngắ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đườngngắ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 đườngngắn để xâydự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 đườngngắn Lúc khởi đầu ta cho P[u] = 1, với u khác Giải thuậtDijkstra viết lại sau : Tìmđườngngắ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đườngngắn Áp dụng giải thuậtDijkstra cho đồ thị hình sau: Tìmđườngngắn procedure DijksTra; begin t:=false; t[u0]:=true; d[i]:=c[u0,i];{Neu khong co duongdi 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đườngngắn end end; if d[v0]=i’ then KhongCoDuongDi else QuayLaiMangTruocDeTimDuong end; Chương 3: Mô tả chung code: 1.1 Mơ tả chung kí hiệu: Ký hiệu dùng giải thuậtDijkstra 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đườngngắn Ta xâydự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ắnDừ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đườngngắ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 đườngngắ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áocáo em cố gắng tổng hợp đầy đủ nội dung liên quan đến đề tài ” Tìmđườngngắ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đườngngắ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