BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ TỔNG QUÁT

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế (Trang 49)

2.4.1 Các khái niệm

Xét đồ thị G = (V, E), một bộ ghép trên đồ thị G là một tập các cạnh đôi một không có đỉnh chung.

Bài toán tìm bộ ghép cực đại trên đồ thị tổng quát phát biểu như sau: Cho một đồ thị G, phải tìm một bộ ghép cực đại trên G (bộ ghép có nhiều cạnh nhất).

Với một bộ ghép M của đồ thị ta gọi:

+ Những cạnh thuộc M được gọi là cạnh đã ghép hay cạnhđậm. + Những cạnh không thuộc M được gọi là cạnh chưa ghép hay cạnh nhạt.

+ Những đỉnh đầu mút của các cạnh đậm được gọi là đỉnh đã

ghép, những đỉnh còn lại gọi là đỉnh chưa ghép.

+ Một đường đi cơ bản (đường đi không có đỉnh lặp lại) được gọi là đường pha nếu nó bắt đầu bằng một cạnh nhạt và tiếp theo là các cạnh đậm, nhạt nằm nối tiếp xen kẽ nhau.

+ Một chu trình cơ bản (chu trình không có đỉnh trong lặp lại) được gọi là một Blossom nếu nó đi qua ít nhất 3 đỉnh, bắt đầu và kết thúc bằng cạnh nhạt và dọc trên chu trình, các cạnh đậm, nhạt nằm nối tiếp xen kẽ nhau. Đỉnh xuất phát của chu trình (cũng là đỉnh kết thúc) được gọi là đỉnh cơ sở của Blossom.

+ Đường mở là một đường pha bắt đầu một đỉnh chưa ghép và kết thúc ở một đỉnh chưa ghép.

Ví dụ:

Đường ( 8, 1, 2, 5, 6, 4 ) là một đường pha Chu trình (2, 3 , 4 , 6 , 5, 2) là một Blossom Đường (8, 1, 2, 3, 4, 6, 5, 7) là một đường mở

Đường (8 1, 2, 3, 4, 6, 5, 2, 1, 9) tuy có các cạnh đậm/nhạt xen kẽ nhưng không phải đường pha (và tất nhiên không phải đường mở) vì đây không phải là đường đi cơ bản.

Hình 17: Ví dụ bài toán tìm bộ ghép cực đại trên đồ thị

Ta dễ dàng suy ra được các tính chất sau:

+ Đường mở cũng như Blossom đều là đường đi độ dài lẻ với số cạnh nhạt nhiều hơn số cạnh đậm đúng 1 cạnh.

+ Trong mỗi Blossom, những đỉnh không phải là đỉnh cơ sở đều là đỉnh đã ghép và đỉnh ghép với đỉnh đó cũng phải thuộc Blossom.

+ Vì Blossom là một chu trình nên trong mỗi Blossom, những đỉnh không phải đỉnh cơ sở đều tồn tại hai đường pha từ đỉnh cơ sở đi đến nó, một đường kết thúc bằng cạnh đậm và một đường kết thúc bằng cạnh nhạt, hai đường pha này được hình thành bằng cách đi dọc theo chu trình theo hai hướng ngược nhau. Như ví dụ trên, đỉnh 4 có hai đường pha từ đỉnh cở sỏ 2

8 1 9 2 3 4 5 6 7

đi tới: (2, 3, 4) là đường pha kết thúc bằng cạnh đậm và (2, 5, 6, 4) là đường pha kết thúc bằng cạnh nhạt.

2.4.2 Thuật toán Edmonds (1965)

Cơ sở của thuật toán là định lý (C.Berge): Một bộ ghép M của đồ thị G là cực đại khi và chỉ khi không tồn tại đường mở đối với M.

Thuật toán Edmonds:

M:= ;

For ( đỉnh u chưa ghép) do

If (Tìm đường mở xuất phát từ u) then

<Dọc trên đường mở: Loại bỏ những cạnh đậm khỏi M; Thêm vào M những cạnh nhạt>;

<Trả về M là bộ ghép cực đại trên G>;

Điều khó nhất trong thuật toán Edmonds là phải xây dựng thuật toán tìm đường mở xuất phát từ một đỉnh chưa ghép. Thuật toán đó được xây dựng bằng cách kết hợp một thuật toán tìm kiếm trên đồ thị với phép chập Blossom.

Xét những đường pha xuất phát từ một đỉnh X chưa ghép. Những đỉnh có thể đến được từ X bằng một đường pha kết thúc là cạnh nhạt được gán nhãn “nhạt” (gọi tắt là đỉnh nhạt), những đỉnh có thể đến được từ X bằng một đườngpha kết thúc là cạnh đậm được gán nhãn “đậm” (gọi tắt là đỉnh đậm).

Với một Blossom, ta định nghĩa phép chập (shrink) là phép thay thế các đỉnh trong Blossom bằng một đỉnh duy nhất. Những cạnh nối giữa một đỉnh thuộc Biossom tới một đỉnh v nào đó không thuộc Blossom được thay thế bằng cạnh nối giữa đỉnh chập này với vvà giữ nguyên tính đậm/nhạt. Có thể kiểm chứng được nhận xét: sau mỗi phép chập, các cạnh đậm vẫn được

đảm bảo là bộ ghép trên đồ thị mới.

= đỉnh cơ sở của Blossom = đỉnh chập từ Blossom

Hình 18: Phép chập Blossom

Thuật toán tìm đường mở xuất phát từ đỉnh X có thể phát biểu như sau: Trước hết đỉnh xuất phát X được gán nhãn đậm.

Tiếp theo là thuật toán tìm kiếm trên đồ thị bắt đầu từ X, theo nguyên tắc: từ đỉnh đậm chỉ được phép đi tiếp theo cạnh nhạt và từ đỉnh nhạt chỉ được đi tiếp theo cạnh đậm. Mỗi khi thăm tối một đỉnh, ta gán nhãn đậm/nhạt cho đỉnh đó và tiếp tục thao tác tìm kiếm trên đồ thị như bình thường. Cũng trong quá trình tìm kiếm mỗi khi phát hiện thấy một cạnh nhạt nối hai đỉnh đậm, ta dừng lại ngay vì nếu gán nhãn tiếp sẽ gặp tình trạng một đỉnh có cả hai nhãn đậm/nhạt, trong trường hợp này, Blossom được phát hiện và bị chập thành một đỉnh, thuật toán được bắt đầu lại với đồ thị mới cho tới khi trả lời được câu hỏi: “có tồn tại đường mở xuất phát từ X hay không?”.

Blossom

Shrink

Blossom

Nếu đường mở không đi qua đỉnh chập nào thì ta chỉ việc tăng cặp dọc theo đường mở. Nếu đường mở có đi qua một đỉnh chập thì ta lại nở đỉnh chập đó ra thành Blossom để thay đỉnh chập này trên đường mở bằng một đoạn đường xuyên qua Blossom.

Hình 19: Nở Blossom để dò đường xuyên qua Blossom

Lưu ý rằng không phải Blossom nào cũng bị chập, chi những Blossom ảnh hưởng tới quá trình tìm đường mở mới phải chập để đảm bảo rằng đường mở tìm được là đường đi cơ bản.

2.4.3 Thuật toán Lawler (1973)

Trong thuật toán Edmonds, sau khi chập mỗi Blossom thành một đỉnh thì đỉnh đó hoàn toàn lại có thể nằm trên một Blossom mới và bị chập tiếp. Thuật toán Lavvler chỉ quan tâm tới đỉnh chập cuối cùng, đại diện cho Blossom ngoài nhất đỉnh chập cuối cùng này được định danh bằng đỉnh cơ sở của Blossom ngoài nhất.

Cũng chính vì thao tác chập/nở nói trên mà ta cần mở rộng khái niệm Blossom, có thể coi một Blossom là một tập đỉnh nở ra từ một đỉnh chập chứ không đơn thuần là một chu trình pha cơ bản nữa.

Expan

Xét một Blossom B có đỉnh cơ sở là đỉnh r. Với v B, v  r, ta lưu lại hai đường pha từ r tới V, một đường kết thúc bằng cạnh đậm và một đường kết thúc bằng cạnh nhạt, như vậy có hai loại vết gán cho mỗi đỉnh v(hai vết này được cập nhật trong quá trình tìm đường):

+ S[v] là đỉnh liền trước V trên đường pha kết thúc bằng cạnh đậm, nếu không tồn tại đường pha loại này thì S[v] = 0.

+ T[v] là đỉnh liền trước V trên đường pha kết thúc bằng cạnh nhạt, nếu không tồn tại đường pha loại này thì T[v] = 0.

Bên cạnh hai nhãn S và T, mỗi đỉnh v còn có thêm:

+ Nhãn b[v] là đỉnh cơ sở của Blossom chứa v. Hai đỉnh u và v thuộc cùng một Blossom b[u] = b[v].

+ Nhãn match[v] là đỉnh ghép với đỉnh v. Nếu v chưa ghép thì match[v] = 0.

Khi đó, thuật toán tìm đường mở bắt đầu từ đỉnh x chưa ghép có thể phát biểu như sau:

Bước 1: (Init)

+ Hàng đợi Queue dùng để chứa những đỉnh đậm chờ duyệt, ban đầu chỉ gồm một đỉnh đậm x.

+ Với mọi đỉnh u khởi gán b[u] = u và match[u] = 0 với u. + Gán S[x] 0; với u = x, gán S[u] =0

+ Với v: gán T[v] = 0.

Bước 2: (BFS)

Lặp lại các bước sau cho tới khi hàng đợi rỗng:

+ Nếu V chưa thăm: Nếu:

V là đỉnh chưa ghép  tìm thấy đường mở kết thúc ở v, dừng. V là đỉnh đã ghép  thăm V thăm luôn match[v] và đẩy match[v] vào Queue.

Lưu vết: Cập nhật hai nhãn S và T. + Nếu V đã thăm:

Nếu V là đỉnh nhạt hoặc b[v] = b[u] => bỏ qua

Nếu V là đỉnh đậm và b[v]  b[u] ta phát hiện được Blossom mới chứa u và v khi đó:

Phát hiện đỉnh cơ sở: Truy vết đường đi ngược từ hai đỉnh đậm u và V theo hai đường pha về nút gốc, chọn lấy đỉnh a là đỉnh đậm chung gặp đầu tiên trong quá trình truy vết ngược. Khi đó Blossom mới phát hiện sẽ có đỉnh cơ sở là a.

Gán lại vết: Gọi (a = i[l], i[2],.., i[p] = u) và (a = j[l], j[2], ..., j[q] = v) lần lượt là hai đường pha dẫn từ a tới u và v. Khi đó (a = i[l], i[2],.., i[p] = u, j[q] =v, j[q-l]v, ... j[l] = a) là một chu trình pha đi từ a tới u và V rồi quay trở về a. Bằng cách đi dọc theo chu trình này theo hai hướng ngược nhau, ta có thể gán lại tất cả các nhãn S và T của những đỉnh trên chu trình. Lưu ý rằng không được gán lại các nhãn S và T cho những đỉnh k mà b[k] = a, và với những đỉnh k có b[k] = a thì bắt buộc phải gán lại nhãn S và T theo chu trình này bất kể S[k] và T[k] trước đó đã có hay chưa.

Chập Blossom: Xét những đỉnh v mà b[v]  {b[i[l]], b[i[2]], ... , b[i[p]], b[j[l]], b[j[2]], ... , b[j[q]]}, gán lại b[v] = a. Nếu v là đỉnh đậm (có nhãn S[v]  0) mà chưa được duyệt tới (chưa bao giờ được đẩy vào Queue)

thì đẩy v vào Queue chờ duyệt tiếp tại những bước sau. Bước 3:

Nếu bước 2 tìm được đường mở thì trả về đường mở, nếu bước 2 không tìm thấy đường mở và thoát ra do hàng đợi rỗng thì kết luận không tìm thấy đường mở.

Tư tưởng chính của phương pháp Lawler là dùng các nhãn b[v] thay cho thao tác chập trực tiếp Blossom, dùng các nhãn S và T để truy vết tìm đường tránh thao tác nở Blossom. Phương pháp này dựa trên một nhận xét: Mỗi khi tìm ra đường mở, nếu đưòng mở đó xuyên qua một Blossom ngoài nhất thì chắc chắn nó phải di vào Blossom này từ nút cơ sở và thoát ra ngoài bằng một cạnh nhạt.

CHƯƠNG 3

MỘT SỐ BÀI TOÁN ỨNG DỤNG TRONG THỰC TẾ 3.1 BÀI TOÁN ĐIỀU HÀNH TAXI

3.1.1 Phát biểu bài toán

Trong thành phố có N nút giao thông mà khách hàng thường yêu cầu hãng Taxi TN cho tới. Khoảng cách giữa hai nút giao thông là C[i,j].

Hãng Taxi TN có k chiếc Taxi hiện đang đỗ tại k nút giao thông trong N nút kể trên. Giả sử có k yêu cầu của khách hàng tới k nút giao thông trong thành phố.

Hãy tìm cách di chuyển k Taxi đến k địa điểm khách đứng sao cho tổng khoảng cách di chuyển của các xe là ngắn nhất.

3.1.2 Phân tích bài toán và xây dựng thuật toán

Bài toán điều hành Taxi được đặt ra là do khi có nhiều khách hàng cùng yêu cầu hãng Taxi cho xe tới đón thì việc các xe di chuyển từ noi đỗ đến địa điểm đón khách sẽ hao tốn một lượng nhiên liệu xác định và chi phí đó sẽ do hãng phải chi trả, điều đó làm ảnh hưởng đến doanh thu của hãng. Do đó, để hạn chế tối đa những chi phí đó nhà điều hành phải lựa chọn và điều động các xe sao cho chi phí trên đường đến đón khách là ít nhất.

Trước yêu cầu thực tế đó em đã chọn cách ứng dụng tin học giải quyết bài toán đó, giúp nhân viên điều động Taxi trong một thời gian rất ngắn đã có thể chọn cách di chuyển cho các xe Taxi của hãng để đạt được hiệu quả kinh tế cao nhất.

Bài toán điều hành Taxi sử dụng thuật toán Tìm cặp ghép có tổng trọng số trên các cung là nhỏ nhất.

Bài toán được biểu diễn bằng mô hình đồ thị như sau: Xây dựng đồ thị G = (V, E), trong đó:

trong thành phố.

Mỗi cạnh ei  E nối hai đỉnh của đồ thị đại diện cho đường đi giữa hai nút giao thông. Cạnh ei mang một trọng số biểu diễn khoảng cách giữa hai nút giao thông được nối bởi nó.

Tại mỗi nút giao thông có Taxi đỗ được thể hiện bởi một lá cờ có chữ Start, tại mỗi nút giao thông có khách hàng đứng được thể hiện bằng chữ Finish.

Khi thực hiện thuật toán, đường di chuyển của các Taxi được tô đậm từ điểm đỗ đến điểm đón khách.

Kết quả của bài toán chính là bộ ghép có tổng trọng số nhỏ nhất tìm được.

* Mô tả thuật toán: Bước 1:

+ Xây dựng ma trận chi phí C, với C[i,j] là trọng số nhỏ nhất để đi từ nút giao thông i đến nút giao thông j.

+ Ma trận T là ma trận chứa chỉ số của nút giao thông trung gian, với T[i,j] <>0 T[i,j] chứa đỉnh trung gian trên quãng đường đi từ nút giao thông i đến nút giao thông j.

+ Tạo đồ thị hai phía biểu diễn bởi ma trận A (Old là phía các đỉnh có Taxi đỗ có k đỉnh, New là phía đỉnh có khách hàng đứng, có k đỉnh). Có A[i,j] là giá trị âm của trọng số quãng đường đi từ nút giao thông Old[i] đến nút giao thông New[j].

+ Tạo nhãn ban đầu chấp nhận được Fx và Fy theo quy tắc: Fx[i] = Max( A[i,j], j: 1 <= j <= k)

Fy[j] = 0 , j : 1 < = j < = k

(FX, FY gọi là chấp nhận được nếu thoả mãn bất đẳng thức Fx[i] + Fy[j] <= A[ij])

Nếu Fx[i] + Fy[j] = C[i,j] thì ta coi cạnh (Old[i], New[j]) là cạnh đậm (là đã chọn đường cho Taxi đỗ tại nút giao thông O1d[i] đến đón khách tại nút giao thông New[j]), các cạnh còn lại là cạnh nhạt.

Vậy bằng cách tạo nhãn ban đầu như trên chúng ta có cặp ghép M ban đầu (ghép được một số Taxi với khách hàng để có được tổng khoảng cách di chuyển là nhỏ nhất).

Bước 2:

For (i:=l  k) Begin

Nếu còn Taxi chưa đón khách thì: Tìm dây chuyền.

Nếu không có dây chuyền thì sửa nhãn. Ngược lại tăng cặp ghép trên dây chuyền này.

Cho đến khi tìm được dây chuyền;

End;

Sửa nhãn: Phải thực hện khi không tìm được đường cho 1 Taxi nào đó đi đón khách (ta gọi là dây chuyền “dở dang”). Trên các cung nối một đỉnh bên Old đã nạp vào dây chuyền tới các đỉnh j thuộc New chưa thuộc dây chuyền, chọn giá trị bé nhất trong các giá trị: Fx[i] + Fy[j] - A[i,j]. Giá trị này được chọn làm lượng sửa nhãn (kí hiệu là m). Sửa nhãn theo cách như sau: Nhãn các đỉnh của Old thuộc dây chuyền sẽ giảm đi một lượng là m, nhãn các đỉnh của New thuộc dây chuyền sẽ tăng thêm một lượng là m, để đảm bảo Fx[i] + Fy[j] - A[i,j] >= 0. Sau khi các đỉnh thuộc dây chuyền “dở dang” đã được sửa nhãn thì nó có khả năng mới kết

hợp với các đỉnh j bên New tạo nên một dây chuyền hoàn chỉnh (vì sẽ xuất hiện những cặp (i,j) mới mà Fx[i] + Fy[j] = A[i,j]).

chuyền đổi ngược dần về cung nhạt đầu tiên của dây chuyền.

Tìm dây chuyền: Tìm kiếm theo chiều sâu. Yêu cầu dây chuyền xuất phát từ một đỉnh nhạt của Old, kết thúc bằng một đỉnh nhạt của New, đồng thời các cung nhạt và đậm liên tiếp xen kẽ nhau .

Ví dụ:

Trong thành phố có 10 nút giao thông được đánh số từ 1 đến 10. Khoảng cách giữa các nút giao thông được cho trong ma trận sau:

1 2 3 4 5 6 7 8 9 10 1 0 7 7 1 2 1 1 5 1 3 2 2 0 1 1 1 1 5 4 1 7 3 1 1 0 1 1 1 3 7 2 4 4 5 2 4 0 2 4 10 1 7 1 5 7 1 3 7 0 10 2 4 1 1 6 10 1 1 2 1 0 1 4 2 1 7 1 1 4 1 1 3 0 1 10 1 8 7 1 7 1 1 3 4 0 1 1 9 7 7 1 2 1 1 4 2 0 10 10 1 3 4 1 2 4 1 1 1 0

Có 4 Taxi, với các điểm đỗ của các Taxi đó là: 1.2.3.4 khách hàng đang đứng tại các nút giao thông : 10, 9, 8, 7 Khi đó: thực hiện theo thuật toán ta được kết quả: Taxi 1: Đi từ nút GT 1 —> nút GT 7

Taxi 2: Đi từ nút GT 2 —> nút GT 9

Taxi 3: Đi từ nút GT 3 —> nút GT 4 —> nút GT 8 Taxi 4: Đi từ nút GT 4 —> nút GT 10

Với tổng khoảng cách di chuyển của cả 4 Taxi là: 5 (km)

Chương trình

Dòng đầu ghi hai số N và K

N dòng tiếp theo cho ma trận khoảng cách C: số ở dòng i, cột j là độ dài đường đi một chiều từ nút giao thông i đến nút giao thông j trong thành phố.

Hai dòng cuối cùng:

+ Dòng thứ nhất gồm K số hiệu của nút giao thông mà các Taxi đang đỗ.

+ Dòng thứ hai gồm K số hiệu của nút giao thông mà các khách hàng của hãng Taxi TN đang đứng.

Dữ liệu ra:

Cách di chuyển K Taxi tới K địa điểm khách hàng đứng mà tổng khoảng cách di chuyển là ngắn nhất. Các hàm và thủ tục chính của chương trình:

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế (Trang 49)

Tải bản đầy đủ (PDF)

(80 trang)