1. Trang chủ
  2. » Giáo án - Bài giảng

SLIDE TOÁN RỜI RẠC Chương 3 6 tìm đường đi ngắn nhất TRƯỜNG MỎ ĐỊA CHẤT

61 28 0

Đ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 61
Dung lượng 1,86 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

TIẾP NỐI CHƯƠNG 2 CỦA SLISE MÔN TOÁN RỜI RẠC MÌNH XIN GỬI ĐẾN CÁC BẠN CHƯƠNG 3 MÌNH MONG RẰNG VỚI NHỮNG MẪU SLIDE NÀY SẼ GIÚP MỌI NGƯỜI DỄ DÀNG HƠN KHI HỌC TẬP VÀ THỰC HÀNH MÔN NÀY ..... ,,,,,, .....

Trang 1

CHƯƠNG 3: LÝ THUYẾT ĐỒ THỊ

GV: Đặng Hữu Nghị

Trang 2

NỘI DUNG

3.1 •Các khái niệm cơ bản của lý thuyết đồ thị

3.2 •Biểu diễn đồ thị trên máy tính

3.3 •Các thuật toán tìm kiếm trên đồ thị

3.4 •Đồ thị Euler và đồ thị Hamilton

3.5 •Cây và cây khung của đồ thị

3.6 •Bài toán đường đi ngắn nhất

3.7 •Bài toán luồng cực đại trong mạng 2

Trang 3

3.6 BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT

 Bài toán tìm đường đi ngắn nhất giữa hai đỉnh của một

đồ thị liên thông có một ý nghĩa to lớn Có thể dẫn về bài

toán như vậy nhiều bài toán thực tế quan trọng

 Ví dụ:

 Bài toán chọn một hành trình tiết kiệm nhất

 Bài toán chọn một phương pháp tiết kiệm nhất để đưa một hệ

động lực lực từ trạng thái xuất phát đến một trạng thái đích

 Bài loán lựa chọn đường truyền tin với chi phí nhỏ nhất trong

mạng thông tin

 V.v….

Trang 4

3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU

 Xét đồ thị G =< V, E > với |V| = n, |E| = m

 Với mỗi cạnh u, v ∈ E, có một giá trị trọng số A[u, v]

 Đặt A[u, v] = ∞ nếu (u, v) ∉ E

 Nếu dãy v0, v1 , , vk là một đường đi trên G

thì 𝑖=1𝑘 𝐴[𝑣𝑖−1, 𝑣𝑖] được gọi là độ dài của đường đi

 Bài toán: Tìm đường đi ngắn nhất từ đỉnh s đến

đỉnh t của đồ thị G

Đường đi như vậy ta sẽ gọi là đường đi ngắn nhất từ s

đến t còn độ dài của nó ta sẽ ký hiệu là d(s, t)

Nếu như không tồn tại đưòmg đi từ s đến t thì ta sẽ đặt

Trang 5

3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU

 Một tính chất của đường đi ngắn nhất nữa có thể phát

biểu một cách không hình thức như sau:

 Mọi đoạn đường con của đường đi ngắn nhất cũng là đường

đi ngắn nhất.

Nếu biết khoảng cách từ s đến t, thì đường đi ngắn nhất

từ s đến t, ta có thể tìm được một cách dễ dàng.

Để tìm đường đi, chỉ cần để ý là đối với cặp đỉnh s, t ϵ

V tuỳ ý (s≠ t) luôn tìm được đỉnh v sao cho:

d(s, t) = d(s, v) + a(v, t)

đỉnh v như vậy chính là đỉnh đi trước đỉnh t trong đường

đi ngắn nhất từ s đến t.

Trang 6

3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU

Thuật toán sau đây để tìm đường đi ngắn nhất từ s đến t

khi biết độ dài của nó

Trang 7

3.6.1 CÁC KHÁI NIỆM MỞ ĐẦU

procedure Find_Path;

begin

STACK := ; STACK  t; v := t ;while v ≠ s do

Trang 8

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

Thuật toán được mô tả như sau:

 Từ ma trận trọng số A[u,v], u, v ∈ V, tìm cận trên d[v]

của khoảng cách từ s đến tất cả các đỉnh v ∈ V

 Nếu thấy d[u] + A[u,v] < d[v] thì d[v] = d[u] + A[u, v]

(làm tốt lên giá trị của d[v])

 Quá trình sẽ kết thúc khi không thể làm “tốt lên” được

Trang 9

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

 Khi thể hiện kỹ thuật tính toán này trên máy tính, cận

trên d[v] sẽ được gọi là nhãn của đỉnh v, còn việc tính lại

các cận trên này sẽ gọi là phép gán nhãn cho đồ thị và

toàn bộ thủ tục thường gọi là thủ tục gán nhãn

Để tính khoảng cách từ s đến t, ở đây, ta phải tính

khoảng cách từ s đến tất cả các đỉnh còn lại của đồ thị

 Hiện nay vẫn chưa biết thuật toán nào cho phép tìm

đường đi ngắn nhất giữa hai đỉnh làm việc thực sự hiệu

quả hơn những thuật toán tìm đường đi ngắn nhất từ một

đỉnh đến tất cả các đỉnh còn lại

Trang 10

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

10

Trang 11

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

Trang 12

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

12

Trang 13

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

Trang 14

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

Trang 15

 Ví dụ: Xét đồ thị cho trong hình Các kết quả tính toán

theo thuật toán được mô tả trong bảng dưới đây

Trang 16

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

 Bài tập: sử dụng thuật toán Ford-Bellman để tìm

đường đi ngắn nhất xuất phát từ đỉnh 1

16

Trang 17

3.6.2 ĐƯỜNG ĐI NGẮN NHẤT XUẤT PHÁT TỪ

MỘT ĐỈNH

 Bài tập: sử dụng thuật toán Ford-Bellman để tìm

đường đi ngắn nhất xuất phát từ đỉnh 1

Trang 18

3.6.3 THUẬT TOÁN DIJKSTRA

 Thuật toán này do E.Dijkstra, nhà toán học người Hà

Lan, đề xuất năm 1959

 Thuật toán tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh

còn lại được Dijkstra đề nghị áp dụng cho trường hợp đồ

thị có hướng với trọng số không âm

 Thuật toán được thực hiện trên cơ sở gán tạm thời cho

các đỉnh

 Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi

ngắn nhất tới đỉnh đó

 Các nhãn này sẽ được biến đổi (tính lại) nhờ một thủ tục

lặp mà ở mỗi bước lặp một số đỉnh sẽ có nhãn không

thay đổi, nhãn đó chính là độ dài đường đi ngắn nhất từ s

Trang 19

3.6.3 THUẬT TOÁN DIJKSTRA

Thuật toán Dijkstra

Trang 20

3.6.3 THUẬT TOÁN DIJKSTRA

procedure Dijkstra;

begin

for v ϵ V do begin

d[v] := a[s,v] ; Truoc[v]:=s;

end;

d[s] := 0; T := V \ {s}; (* T là tập các đỉnh có nhãn tạm thời *) while T ≠  do

begin

Tìm đỉnh u ϵ T thoả mãn d[u] = min{d[z] : z ϵ T};

T := T \ {u} ; (* Cố định nhãn của đỉnh u *) for v ϵ T do (* Gán nhãn lại cho các đỉnh trong T *)

if d[v] > d[u] + a[u, v] then begin

d[v] :=d[u] + a[u,v]; Truoc[v] := u ; end;

end;

Trang 21

3.6.3 THUẬT TOÁN DIJKSTRA

 Ví dụ: Tim đường đi ngắn nhất từ đỉnh 1 đến các đỉnh

còn lại của đồ thị ở hình

Trang 22

3.6.3 THUẬT TOÁN DIJKSTRA

 Kết quả tính toán theo thuật toán được trình bày trong bảng

dưới đây.

Qui ước viết hai thành phần của nhãn theo thứ tự: d[v],

Truoc[v].

 Đỉnh được đánh dấu “*” là đinh được chọn để cố định nhãn ở

bước lặp dang xét, nhãn của nó không biến đổi ở các bước

Trang 24

3.6.3 THUẬT TOÁN DIJKSTRA

Chú ý:

Nếu chỉ cần tìm đường đi ngắn nhất từ v đến một đỉnh t

nào đó thì có thể kết thúc thuật toán khi đỉnh t trở thành

có nhãn cố định

24

Trang 25

3.6.3 THUẬT TOÁN DIJKSTRA

 Ví dụ: Netwark → CapeMay

Trang 26

3.6.3 THUẬT TOÁN DIJKSTRA

26

Trang 27

3.6.3 THUẬT TOÁN DIJKSTRA

Trang 28

3.6.3 THUẬT TOÁN DIJKSTRA

28

Trang 29

3.6.3 THUẬT TOÁN DIJKSTRA

Trang 30

3.6.3 THUẬT TOÁN DIJKSTRA

30

Trang 31

3.6.3 THUẬT TOÁN DIJKSTRA

Trang 32

3.6.3 THUẬT TOÁN DIJKSTRA

32

Trang 33

3.6.3 THUẬT TOÁN DIJKSTRA

33

Trang 34

3.6.3 THUẬT TOÁN DIJKSTRA

 Bài tập tìm đường từ 1  6

34

Trang 35

3.6.4 ĐƯỜNG ĐI NGẮN NHẤT GIỮA TẤT CẢ

 Rõ ràng, khi đó ta thu được thuật toán với độ phức tạp là

O(n4) (nếu sử dụng thuật toán Ford - Bellman) hoặc

O(n3) đối với trường hợp trọng số không âm hoặc đồ thị

không có chu trình

 Trong trường hợp tổng quát, sử dụng thuật toán Ford

- Bellman n lẩn không phải là cách làm tốt nhất, ở đây ta

Trang 36

T HUẬT TOÁN F LOYD

 Đường đi ngắn nhất giữa tất cả các cặp đỉnh?

 Thuật toán Floyd dựa trên ý tưởng:

 Tất cả các đường đi con của đường đi ngắn nhất là

ngắn nhất

 Giả sử ma trận D = [dij](k) là đường đi ngắn nhất từ i

đến j chỉ đi qua các đỉnh trung gian 1, 2, …, k

=> Kết quả của bài toán sẽ là [dij](n)

36

Trang 37

T HUẬT TOÁN F LOYD

 Xác định dij(k):

 dij(0) = a[i, j]

 k > 0:

Trang 38

T HUẬT TOÁN F LOYD

Xác định đường đi bằng ma trân đỉnh trước cuối của đường

đi

 p[i, j] = Đỉnh cuối cùng trên đường đi ngắn nhất từ i đến

j

 Khởi tạo: p[i, j] = i

 Tại mỗi bước lặp: xác định xem dùng đỉnh k có làm rút

ngắn đường đi từ i đến j không?

 Nếu có:

 Lưu lại trọng số của đường đi mới – ngắn hơn – từ i đến j

 Lưu lại thông tin về việc thay đổi đường đi để đi qua k

38

Trang 39

T HUẬT TOÁN F LOYD

 Lưu lại thông tin về việc thay đổi đường đi để đi qua k

=> p[i, j] = p[k, j]

Thay đổi thông tin:

If (d[i, j] > d[i, k] + d[k, j]) then

Begin

d[i, j]:= d[i, k] + d[k, j];

p[i, j]:= p[k, j];

Trang 40

T HUẬT TOÁN F LOYD

Thuật toán Floyd: Tim đường đi ngắn nhất giữa tất

cả các cặp đỉnh

 Đầu vào:

 Đồ thị cho bởi ma trận trọng số a[i, j], ị, j = 1, 2, …, n

 Đầu ra :

 Ma trận đường đi ngắn nhất giữa các cặp đỉnh d[i, j], i, j =

1,2,…,n trong đó d[i, j] cho độ dài đườug đi ngắn nhất từ i

đến j.

 Ma trận ghi nhận đường đi p[i, j], i, j = 1, 2…, n trong đó

p[i, j] ghi nhận đỉnh đi trước đỉnh j trong đường đi

ngắn nhất từ i đến j

40

Trang 41

T HUẬT TOÁN F LOYD

procedure Floyd;

begin

(* Khởi tạo *) for i :=1 to n do

for j := 1 to n do begin

d[i,j] := a[i,j];

p[i, j] := i;

end;

(* Bước lặp *) for k:= 1 to n do

Trang 42

T HUẬT TOÁN F LOYD

 Ta xét đồ thị vô hướng sau:

 Ma trận trọng số chứa đường đi ngắn nhất ban đầu sẽ

được khởi tạo như sau:

42

Trang 43

T HUẬT TOÁN F LOYD

Quá trình thực hiện thuật toán Floyd sẽ diễn ra như sau:

 Chọn lần lượt từng đỉnh của đồ thị làm đỉnh trung gian (taquy ước là k)

 Chọn một cặp 2 đỉnh phân biệt và không trùng với đỉnh trung gian (ta quy ước lần lượt là i và j)

 Thực hiện so sánh như ở trên: đường đi ngắn nhất giữa i và j sẽ bằng giá trị nhỏ nhất của:

 Giá trị đường đi ngắn nhất hiện thời giữa i và j.

 Tổng của giá trị đường đi ngắn nhất hiện thời giữa i và k, và đường

đi ngắn nhất hiện thời giữa k và j.

Trang 44

T HUẬT TOÁN F LOYD

Ta sẽ phân tích tuần tự theo nền tảng ý tưởng này:

 Đầu tiên, k = 1 Nhờ đỉnh 1 làm trung gian, ta thấy xuất hiện

đường đi từ đỉnh 2 tới đỉnh 4 (độ dài 14), và từ đỉnh 2 tới đỉnh

5 (độ dài 6).

 Đường đi trung gian qua đỉnh 1 để đi từ đỉnh 4 tới đỉnh 5

không tối ưu về chiều dài (9 + 1 > 2) nên ta không cập nhật lại

đường đi ngắn nhất giữa 2 đỉnh 4 và 5.

44

Trang 45

T HUẬT TOÁN F LOYD

 Tiếp theo, ta duyệt tới k = 2

 Đường đi từ 3 tới 1 (độ dài 7), từ 3 tới 5 (độ dài 8) được

hình thành

 Đường đi từ 3 tới 4 không cập nhật độ dài (7 < 2 + 5 +

9)

Trang 46

T HUẬT TOÁN F LOYD

 Cứ tiếp tục lựa chọn k như vậy cho tới hết, ta sẽ thu

được ma trận trong số hoàn chỉnh:

 Giả sử, qua ma trận này, ta thấy đường đi ngắn nhất từ

đỉnh 2 tới đỉnh 4 có độ dài 8 Dựa theo đồ thị thì nó là

đoạn đường sau:

46

Trang 47

T HUẬT TOÁN F LOYD

 Chi tiết

Trang 48

T HUẬT TOÁN F LOYD

48

Trang 49

THUẬT TOÁN FLOYD

Trang 50

T HUẬT TOÁN F LOYD

50

Trang 51

THUẬT TOÁN FLOYD

Trang 52

T HUẬT TOÁN F LOYD

Ma trận ghi nhận đường đi p[i, j], i, j = 1, 2…, n trong đó p[i, j]

ghi nhận đỉnh đi trước đỉnh j trong đường đi ngắn nhất từ i

đến j

52

Trang 53

Code Thuật toán Floyd

Trang 54

int Nhap(int &n,int **&a,int **&Pi,char *fn)

Trang 55

void buocthuan(int n,int **c,int **Pi)

Trang 56

void inkq(int s,int f,int **pi)

Trang 57

int intep(int n,int **a,int **pi)

Trang 58

printf("\nNhap xuat phat s ="); scanf("%d",&s);

printf("\nNhap ket thuc f ="); scanf("%d",&f);

if(a[s][f] == -1) printf("\nKhong co duong di");

Trang 59

THUẬT TOÁN FLOYD

Trang 60

THUẬT TOÁN FLOYD

Trang 61

BÀI TẬP

Áp dụng thuật toán Floyd để tim đường đi ngắn

nhất giữa tất cả các cặp đỉnh trong đồ thị sau:

Ngày đăng: 18/01/2022, 07:27

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w