1. Trang chủ
  2. » Mẫu Slide

LY THUYET DO THI BAI 14

9 3 0

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

THÔNG TIN TÀI LIỆU

Nội dung

xét trong dòng lệnh 5 đúng một lần, do vậy độ phức tạp của thuật toán là O(m). Ta cũng có thể áp dụng thuật toán trên để tìm đường đi dài nhất từ đỉnh nguồn tới các đỉnh khác của đồ[r]

(1)

BÀI 14

Chương

Bài toán đường ngắn

Trước chuyến xuất hành, thường phải suy nghĩ chọn cho hành trình “tiết kiệm” theo nghĩa tốn thời gian, tốn nhiên liệu tốn tiền … Lý thuyết Đồ thị giúp tìm giải pháp 8.1 Bài toán Đường ngắn

Bài toán: Cho đồ thị G = (V, E) hai đỉnh a, b Tìm đường ngắn (nếu có)

đi từ đỉnh a đến đỉnh b đồ thị G

ý nghĩa thực tế: Bài toán giúp chọn hành trình tiết kiệm (quãng đường, thời gian, chi phí ) giao thơng, lập lịch thi cơng cơng trình cách tối ưu, xử lý truyền tin

Thuật toán duyệt đồ thị theo chiều rộng cho ta lời giải toán Song ta có thêm thuật tốn sau

Thuật toán 8.1:

1 Lần lượt gán nhãn cho đỉnh đồ thị, đỉnh không lần, sau: - Đỉnh a gán nhãn số

- Những đỉnh kề với đỉnh a gán số

- Những đỉnh kề với đỉnh gán nhãn số 1, gán số ………

- Tương tự, đỉnh kề với đỉnh gán số i gán nhãn số

i+1

………

Thực gán nhãn cho đỉnh b không gán nhãn

2 Nếu đỉnh b gán nhãn k kết luận có đường ngắn từ đỉnh a tới đỉnh b với độ dài k, ngược lại trả lời khơng có

3 Khơi phục đường đi: Nếu bước b gán nhãn k ta ngược lại theo quy tắc sau đây: Nếu đỉnh y gán nhãn j với j ≥ có đỉnh x gãn nhãn j-1 cho có cạnh từ x tới y Đi ngược lại gặp đỉnh a, ta nhận đường ngắn cần tìm

(2)

Ví dụ 8.1 (Bài tốn sói, dê bắp cải):

Một sói, dê bắp cải bờ sông Người lái đị phải đưa chúng sang sơng Nhưng thuyền q bé nên chuyến chở

“hành khách” thơi Vì lý mà biết, khơng thể bỏ mặc sói với dê

hoặc dê với bắp cải mà khơng có người trơng Vậy người lái đị phải xử trí mà đưa sói, dê bắp cải sang bên sơng

Xây dựng đồ thị vô hướng với đỉnh thể hành khách lại bên phía xuất phát thời điểm khác Cạnh nối hai đỉnh thể chuyến đị qua sơng

Hình 8.1 Hành trình qua sơng sói, dê bắp cải

Bài toán đưa việc tìm đường ngắn từ đỉnh a đến đỉnh b đồ thị Đường mũi tên hình

8.2 Bài tốn Đường có trọng số bé

Với toán đường tổng quát, ta xét đồ thị có trọng số định nghĩa sau

Định nghĩa 8.2:

Đồ thị G gọi đồ thị có trọng số cạnh (i, j) đồ thị gán số nguyên không âm c(i,j)

Nhãn c(i,j) cạnh (i,j) đồ thị thường biểu diễn “chi phí” thực tế để qua cạnh

Ta thường ký hiệu đồ thị có trọng số (G, c)

Độ dài đường đồ thị có trọng số tổng trọng số cạnh đường

Bài tốn: Cho đồ thị có trọng số (G, c) hai đỉnh a, b thuộc G Hãy tìm đường

(3)

Độ dài đường ngắn từ đỉnh a đến đỉnh b gọi khoảng

cách từ đỉnh a đến đỉnh b đồ thị Nếu khơng có đường từ a đến b

đặt khoảng cách ∞

8.3 Thuật tốn Dijkstra tìm đường ngắn

Năm 1959 E W Dijkstra đưa thuật toán hiệu để giải toán đường ngắn

Thuật toán thực việc gán giảm giá trị nhãn l(i) đỉnh i đồ thị G sau:

Thuật tốn 8.2 (Tìm đường ngắn nhất):

1 Với đỉnh xuất phát a, gán nhãn l(a) :=

2 Nếu có cạnh (i,j) mà đỉnh i gán nhãn đỉnh j chưa gán nhãn đỉnh j gán nhãn l(i) + c(i,j) < l(j) giảm nhãn

l(j) := l(i) + c(i,j)

3 Lặp lại bước không gán giảm nhãn

Định lý 8.3: Tại đỉnh b giá trị nhãn l(b) cuối (nếu có) độ dài

của đường ngắn từ đỉnh a đến đỉnh b Chứng minh:

Sau thực xong thuật toán trên, giá trị nhãn l(b) xác định ta có đường từ đỉnh a tới đỉnh b

Ta khôi phục đường từ a đến b sau:

Xuất phát từ đỉnh b, tìm cạnh có đỉnh cuối b đỉnh đầu i cho:

l(i) + c(i,b) = l(b)

Đỉnh i chắn phải tồn xảy đẳng thức lần gán giảm giá trị nhãn l(j) cuối Cứ tiếp tục gặp đỉnh a

Giả sử ta nhận dãy cạnh:

(a, a1) , (a1, a2) , , (ak-1, b)

mà đó: l(a) + c(a,a1) = l(a1) l(a1) + c(a1,a2) = l(a2)

l(ak-1) + c(ak-1, b) = l(b)

Cộng vế khử giá trị chung hai vế ta có:

c(a,a1) + c(a1,a2) + + c(ak-1,b) = l(b)

(4)

Bất kỳ đường khác từ đỉnh a đến đỉnh b có hệ thức tương tự có dấu ≥

Vậy nhãn l(b) độ dài đường ngắn Ví dụ 8.3: Xét đồ thị có trọng số sau đây:

Hình 8.2 Đồ thị có trọng số Độ dài đường ngắn từ đỉnh a đến đỉnh b Để đơn giản việc tính tốn, ta xây dựng ma trận trọng số C :

c(i,j) , (i, j) ∈ E

C[i,j] = ∞ , (i, j) ∉ E , i = j

Khi đó, thuật tốn Dijkstra trình bày chi tiết sau: 1 procedure DIJKSTRA(a) ;

2 begin

3 for j ∈ V begin

5 L[j] := C[a, j] ; Truoc[j] := a end ;

7 T := V \ {a} ; while T ≠ ∅ begin

10 chọn đỉnh i ∈ T mà L[i] = {L[j] ⏐ j ∈T } ; 11 T := T \ {i} ;

12 for j ∈ T

13 if L[j] > L[i] + C[i, j] then

14 begin

15 L[j] := L[i] + C[i, j] ;

(5)

17 end ; 18 end ;

19 end ;

Biến mảng Truoc dùng để khôi phục đường 8.4 Đường đồ thị phi chu trình

Sử dụng Thuật toán 4.5 (Chương 4) để đánh số đỉnh đồ thị định hướng phi chu trình, ta xây dựng thuật tốn ngắn gọn để tìm khoảng cách từ đỉnh nguồn tới tất đỉnh đồ thị phi chu trình

Thuật tốn 8.4:

Dữ liệu: Biểu diễn mảng DK_V danh sách kề đồ thị định hướng phi chu

trình G = (V, E) với tập đỉnh V = {v1, v2, , vn} đánh số mà danh sách

DK_V[vj] chứa đỉnh nhận vj đỉnh kề ma trận trọng số C đồ thị G

Kết quả: Mảng D số nguyên với D[vi] chứa khoảng cách d(v1,vi) , i = 2, 3, , n

1 Begin

2 D[v1] := ;

3 for j := to n D[vj] := ∞ ; 4 for j := to n

5 for vi∈ DK_V[vj] D[vj] := min( D[vj] , D[vi] + C[vi,vj]

6 End

Tính đắn thuật tốn suy từ chi tiết sau đây: tất đỉnh trung gian đường ngắn từ v1 tới vj có số nhỏ j Mỗi cạnh (vi,vj)

xét dòng lệnh lần, độ phức tạp thuật toán O(m) Ta áp dụng thuật tốn để tìm đường dài từ đỉnh nguồn tới đỉnh khác đồ thị tìm đường dài đồ thị định hướng phi chu trình có trọng số

(6)

Hình 8.3 Đường dài đồ thị phi chu trình có trọng số 8.5 Đường ngắn tất cặp đỉnh

Bài tốn: Cho đồ thị có trọng số (G, c) Hãy tìm đường ngắn tất

các cặp đỉnh

Bài toán thường gặp việc xây dựng bảng khoảng cách thành phố, bảng giá cước vận chuyển nhà ga

Bài tốn giải cách sử dụng thuật toán Dijkstra với đỉnh đồ thị đỉnh xuất phát Tuy nhiên, ta giải trực tiếp toán nhờ thuật toán Floyd sau:

Ta sử dụng ma trận Dn x n để tính độ dài đường ngắn tất

cặp đỉnh

1 Bắt đầu gán D := C - ma trận trọng số

2 Thực n lần lặp D Sau bước lặp thứ k, D[i,j] chứa độ dài đường đi ngắn từ đỉnh i đến đỉnh j mà qua đỉnh có số khơng vượt q k Vậy bước lặp thứ k ta thực theo công thức sau đây:

D(k)[i,j] := (D(k-1)[i,j] , D(k-1)[i,k] + D(k-1)[k,j]) ,

với k = 1, 2, , n Ví dụ 8.5: Giả sử ta có đồ giao thơng sau đây:

(7)

Các kết tính tốn:

D(0) = L D(1) D(2) D(3) D0 D1 D2 D3

Thuật toán 8.5 (Floyd):

Dữ liệu: Ma trận trọng số C đồ thị

Kết quả: Ma trận D cho biết khoảng cách tất cặp đỉnh

1 BEGIN

2 for i := to n 3 for j := to n

4 begin D[i,j] := C[i,j] ; TRUOC[i,j] := end ; 5 for k := to n

6 for i := to n for j := to n

8 if D[i,k] + D[k,j] < D[i,j] then

9 begin

10 D[i,j] := D[i,k] + D[k,j] ;

11 TRUOC[i,j] := k

12 end ;

13 END

Nếu TRUOC[i,j] = đưịng ngắn từ đỉnh i đến đỉnh j cạnh (i, j)

Để in đỉnh trung gian đường ngắn từ đỉnh i đến đỉnh j ta dùng thủ tục đệ quy sau đây:

1 procedure Duong_di( i, j ) ; begin

3 k := TRUOC[i,j] ;

4 if k = then Exit ;

5 Duong_di( i, k ) ;

6 write( k ) ;

7 Duong_di( k, j ) ; end ;

0 ∞ ∞

0 3

0 5

(8)

Chẳng hạn, ma trận TRUOC ví dụ là:

Để xác định đường ngắn từ đỉnh đến đỉnh ta lấy k = TRUOC[1,2] = Vậy đường ngắn là: < 1, 3, >

8.6 Tâm đồ thị

Giả sử G = (V, E) đồ thị có trọng số khơng âm cạnh Ký hiệu: d(x,y) khoảng cách đỉnh x đỉnh y đồ thị G

Đại lượng d(a) = max { d(x,a)⏐x ∈ V } gọi độ lệch đỉnh a đồ thị G

Các khái niệm bán kính, tâm đường kính đồ thị định nghĩa sau:

Định nghĩa 8.6:

1 Bán kính R đồ thị G độ lệch bé đỉnh: R = { d(a) ⏐ a ∈ V}

2 Tâm đồ thị G đỉnh a có độ lệch bé nhất:

∀x ∈ V, d(a)

d(x)

3 Đường kính đồ thị khoảng cách dài cặp đỉnh đồ thị:

d = max { d(x,y) ⏐ x, y ∈ V }

Ví dụ 8.7: Cho đồ thị G sau:

(9)

Vậy tâm đồ thị đỉnh d

Ý nghĩa tâm đồ thị: Dùng để xác định thủ đô nước, nút giao thông quan trọng thành phố, vị trí đặt máy chủ mạng máy tính

Thuật tốn 8.6 (Tìm tâm đồ thị):

1) Dùng thuật tốn Floyd để tính ma trận D khoảng cách cặp đỉnh 2) Tìm giá trị lớn cột, cho ta độ lệch đỉnh tương ứng

3) Tìm đỉnh với độ lệch bé nhất, tâm đồ thị Ma trận khoảng cách D ví dụ là:

a b c d e

Tâm: d Bán kính: Đường kính: ∞

Nếu vẽ vịng trịn có tâm bán kính định nghĩa tất đỉnh đồ thị nằm vòng tròn

Ngày đăng: 12/04/2021, 19:34

TỪ KHÓA LIÊN QUAN

w