Thuật toán ghép cặp của Edmonds (còn gọi là thuật toán bông hoa) là một thuật toán trong lý thuyết đồ thị để tìm cặp ghép cực đại trong đồ thị. Thuật toán được tìm ra bởi Jack Edmonds năm 1961,1 và xuất bản năm 1965.2 Cho trước một đồ thị vô hướng G = (V, E), thuật toán tìm ra cặp ghép M sao cho mỗi đỉnh trong V kề với tối đa một cạnh trong M và |M| là lớn nhất có thể. Cặp ghép được xây dựng bằng cách khởi đầu từ cặp ghép rỗng và tăng dần lên bằng các đường tăng. Không như cặp ghép cho đồ thị hai phía, ý tưởng mới quan trọng nhất ở đây là có thể thu gọn một chu trình lẻ (bông hoa) thành một đỉnh, và việc tìm kiếm được thực hiện trên đồ thị đã thu gọn. Thuật toán này là chứng minh đầu tiên cho việc có thể tìm cặp ghép cực đại trong thời gian đa thức. Một đóng góp quan trọng nữa là nó giúp mô tả đa diện quy hoạch tuyến tính của bài toán cặp ghép, từ đó xây dựng thuật toán tìm cặp ghép trọng số nhỏ nhất.3 Theo Alexander Schrijver, một điểm nổi bật nữa là đa diện này là đa diện đầu tiên được chứng minh là nguyên không suy ra trực tiếp từ đơn môđula hoàn toàn, và mô tả của nó là một bước đột phá trong tổ hợp đa diện.4
Trang 1Bài toán ghép cặp
Graph Matching
Trang 2Bài toỏn ghộp cặp trờn
đồ thị
Giả sử G=(V,E) là đồ thị vô h ớng, trong đó mỗi cạnh (v,w) đ ợc gán với một số thực c(v,w) gọi là trọng số của nó
Định nghĩa Cặp ghép M trên đồ thị G là tập các cạnh của đồ thị trong đó không có hai cạnh nào có đỉnh chung
Cặp ghép đ ợc gọi là đầy đủ (hoàn hảo) nếu mỗi đỉnh
của đồ thị là đầu mút của ít nhất một cạnh trong cặp
Trang 3Hai bài toỏn
Bài toán cặp ghép cực đại: Tìm cặp ghép với kích th ớc lớn nhất trong đồ thị G
Bài toán cặp ghép lớn nhất: Tìm cặp ghép với trọng l ợng lớn
nhất trong đồ thị G
Ta hạn chế xét các bài toán đặt ra trên đồ thị hai phía G = (X ∪
Y, E).
Trang 4Ví dụ
Cặp ghép cực đại Cặp ghép không là cặp ghép
Cặp ghép Cặp ghép hoàn hảo
Trang 58 3
24 6
Trang 66 7 8 9 10
Trang 7Qui về Bài toán luồng
cực đại
1 2 3 4 5
6 7 8 9 10
Mỗi cung (s, i) cú kntq 1.
Mỗi cạnh được thay thế bởi
cung cú kntq 1.
Trang 8Tìm luồng cực đại
Luồng cực đại từ s->t có giá trị 4.
1 2 3 4 5
6 7 8 9 10
Trang 9Bài toán cặp ghép cực
đại
trên đồ thị hai phía Giả sử M là một cặp ghép trên G
Nếu cạnh e = (x, y) ∈ M, ta nói e là cạnh của cặp ghép (hay cạnh
đậm) và các đỉnh x, y là các đỉnh đậm (hay không tự do)
Nếu cạnh e = (x, y) ∉ M, thì ta nói e là cạnh nhạt còn các đỉnh x,
y là các đỉnh nhạt (hay tự do).
Trang 10Đường tăng cặp ghộp
Một đ ờng đi trên đồ thị G mà trong đó hai cạnh liên tiếp là
không cùng đậm hay nhạt sẽ đ ợc gọi là đ ờng đi luân phiên
đậm/nhạt (hay gọi ngắn gọn là đ ờng đi luân phiên)
Đ ờng đi luân phiên bắt đầu từ một đỉnh tự do thuộc tập X và kết thúc ở một đỉnh tự do thuộc tập Y đ ợc gọi là đ ờng tăng cặp ghép.
Trang 11Dễ thấy số l ợng cạnh nhạt trong EP là bằng số l ợng cạnh
đậm của nó cộng với 1 Để đơn giản trong phần d ới
đây ta đồng nhất ký hiệu đ ờng đi P với tập cạnh EP
của nó Xây dựng cặp ghép M’ theo qui tắc:
M’ = (M ∪ P) \ (M ∩ P).
Dễ thấy M’ cũng là cặp ghép và rõ ràng |M’| = |M|
Trang 12M hoặc M* Vì vậy, mỗi đ ờng đi cũng nh mỗi chu trình trong G’ đều là đ ờng luân phiên
M/M* Do |M*| > |M|, nên rõ ràng là luôn tìm đ
ợc ít nhất một đ ờng đi luân phiên M/M* mà trong đó số l ợng cạnh thuộc M* là lớn hơn số l ợng cạnh thuộc M Đ ờng đi đó chính là đ ờng tăng cặp ghép trên đồ thị G.
Định lý đ ợc chứng minh.
Chú ý: Trong chứng minh định lý ta không sử dụng tính hai phía của G Do đó, Định lý 1 là
Trang 13Thuật toán tìm cặp ghép cực đại
Đầu vào: Đồ thị vô h ớng G = (V, E).
B ớc khởi tạo Xây dựng cặp ghép M
cực đại, thuật toán kết thúc.
Ng ợc lại, gọi P là một đ ờng tăng cặp ghép xuất phát từ đỉnh tự do x0∈ X, kết thúc ở đỉnh tự
do y0 ∈ Y Tăng cặp ghép theo qui tắc
rồi lặp lại b ớc lặp.
Trang 14Tỡm đường tăng
Từ đồ thị G ta xây dựng đồ thị có h ớng GM = (X ∪ Y,
EM) với tập cung EM đ ợc bằng cách định h ớng lại các cạnh của G theo quy tắc sau:
i) Nếu (x,y) ∈ M ∩ E, thì (y,x) ∈ EM;
ii) Nếu (x,y) ∈ E \ M, thì (x,y) ∈ EM.
Ng ợc lại, một đ ờng đi trên đồ thị G M xuất phát từ một đỉnh tự do
x0 ∈ X kết thúc tại một đỉnh tự do y0 ∈ Y sẽ t ơng ứng với một đ ờng
tăng cặp ghép trên đồ thị G
Vì vậy, để xét xem đồ thị G có chứa đ ờng tăng
cặp ghép hay không, có thể thực hiện thuật toán
từ các đỉnh tự do thuộc tập X.
Trang 15Thuật toỏn
Sử dụng cách tìm đ ờng tăng cặp ghép theo nhận xét vừa nêu,
từ sơ đồ tổng quát dễ dàng xây dựng thuật toán để giải bài toán tìm cặp ghép cực đại trên đồ thị hai phía với thời gian tính O(n 3 ), trong đó n = max (|X|, |Y|).
Trang 16Chong : Array[1 100] of Byte; (* Chong[y]-điủ nh được ghép với y ∈ Y *)
Trang 17begin Fillchar(Truoc,Sizeof(Truoc),0); y0:=0;
For x0:=1 to N do begin
If Vo[x0]=0 then Tim(x0);
If y0<>0 then exit;
end;
Stop:=true;
end;
Trang 18Fillchar(Vo,Sizeof(Vo),0);
Fillchar(Chong,Sizeof(Chong),0); Cnt:=0;
While not Stop do begin
Tim_duong_tang;
If not Stop then Tang;
end;
end;
Trang 20Qui về bài toỏn cặp ghộp
Khi đó trong ngôn ngữ đồ thị, bài toán phân công có thể phát biểu
nh sau: Tìm trong đồ thị G cặp ghép đầy đủ có tổng trọng số
là lớn nhất Cặp ghép nh vậy đ ợc gọi là cặp ghép tối u.
Trang 21Cơ sở thuật toán
Ta gọi một phép gán nhãn chấp nhận đ ợc cho các đỉnh của đồ thị G=(X ∪ Y,E) là
Trang 22Đồ thị cõn bằng
Giả sử có f là một phép gán nhãn chấp nhận đ ợc, ký hiệu
E f = {(x,y)∈E: f(x) + f(y) = w(x,y)}.
Ký hiệu G f là đồ thị con của G sinh bởi tập đỉnh X∪Y và tập cạnh E f Ta sẽ gọi G f là đồ thị cân bằng.
Trang 23Tiờu chuẩn tối ưu
Định lý 2 Giả sử f là phép gán nhãn chấp nhận đ ợc Nếu Gf chứa cặp ghép đầy đủ M*, thì M* là
cặp ghép tối u.
Chứng minh
Giả sử Gf chứa cặp ghép đầy đủ M* Khi đó từ định
nghĩa Gf suy ra M* cũng là cặp ghép đầy đủ của đồ thị
G Gọi w(M*) là trọng l ợng của M*:
Do mỗi cạnh e ∈ M* đều là cạnh của Gf và mỗi đỉnh của G
kề với đúng một cạnh của M*, nên
Giả sử M là một cặp ghép đầy đủ tuỳ ý của G, khi đó
Suy ra w(M*) ≥ w(M) Vậy M* là cặp ghép tối u.
Trang 24Sơ đồ thuật toỏn
Ta sẽ bắt đầu từ một phép gán nhãn chấp nhận đ ợc f Xây dựng đồ thị Gf Bắt đầu
Trang 25Điều chỉnh nhón
Giả sử M là cặp ghép cực đại trong đồ thị Gf và M ch a là cặp ghép đầy đủ của
G Ta cần tìm cách điều chỉnh phép gán nhãn f thoả mãn các yêu cầu đặt ra.
Thực hiện tìm kiếm theo chiều rộng từ các đỉnh tự do trong X Gọi S là các
Trang 26Điều chỉnh nhãn
Tõ tÝnh chÊt cña thuËt to¸n
t×m kiÕm theo chiÒu réng,
Trang 27Điều chỉnh nhón
Khi các nhãn trong S bị giảm, các cạnh trong G từ S sang T* sẽ có khả năng gia nhập vào đồ thị cân bằng Gf Ta sẽ tăng λ đến khi có thêm ít nhất một cạnh mới gia nhập đồ thị cân bằng Có hai khả
năng:
ứng, và nh vậy việc tìm kiếm đ ờng tăng sẽ đ ợc tiếp tục mở rộng
ờng tăng cặp ghép, và kết thúc một pha điều chỉnh nhãn.
Trang 28Điều chỉnh nhón
Ta gọi một pha điều chỉnh là tất cả các lần sửa nhãn cần thiết để tăng đ ợc kích th ớc của cặp
ghép M
Vì sau mỗi pha điều chỉnh kích th ớc của cặp
ghép tăng lên 1, nên ta phải thực hiện nhiều nhất
n pha điều chỉnh
Trong mỗi pha điều chỉnh, do sau mỗi lần sửa
nhãn có ít nhất hai đỉnh mới đ ợc bổ sung vào
danh sách các đỉnh đ ợc thăm, nên ta phải thực
hiện việc sửa nhãn không quá n lần Mặt khác,
trong thời gian O(n2) ta có thể xác định đ ợc cạnh nào từ S sang T* là cạnh gia nhập đồ thị cân
bằng (bằng việc duyệt hết các cạnh) Từ đó suy
ra đánh giá thời gian tính của thuật toán là
O(n )
Trang 29B ớc 4: Gọi S là tập các đỉnh tự do trong X Thực hiện tìm kiếm từ các đỉnh trong S Gọi T là tập các đỉnh của Y đ ợc thăm trong quá trình tìm
kiếm Bổ sung các đỉnh trong X đ ợc thăm trong quá trình tìm kiếm vào S.
B ớc 5: Tiến hành điều chỉnh nhãn f ta sẽ bổ sung
đ ợc các cạnh vào Gf cho đến khi tìm đ ợc đ ờng
tăng, bổ sung các đỉnh mới đ ợc thăm vào S và T t
ơng ứng nh đã mô tả ở trên Tăng cặp ghép M và quay lại b ớc 3.
Trang 30Tăng hiệu quả
Để có đ ợc thuật toán với đánh giá thời gian tính tốt hơn, vấn đề
đặt ra là làm thế nào có thể tính đ ợc giá trị λ tại mỗi lần sửa nhãn của pha điều chỉnh một cách nhanh chóng
Ta xác định độ lệch của các cạnh theo công thức
slack(x, y) = f(x) + f(y) – c(x, y).
Trang 31Tăng hiệu quả
Trang 32Tăng hiệu quả
Việc tính giá trị độ lệch slack(yj) đòi hỏi thời gian O(n2) ở đầu pha điều chỉnh Khi tiến
hành pha điều chỉnh ta có thể sửa lại tất cả
các độ lệch trong thời gian O(n) do chúng bị
thay đổi cùng một giá trị (do nhãn của các
đỉnh trong S giảm đồng loạt đi cùng một giá
trị λ ) Khi một đỉnh x đ ợc chuyển từ S* sang S
ta cần tính lại các độ lệch của các đỉnh trong
T*, việc đó đòi hỏi thời gian O(n) Tuy nhiên sự kiện một đỉnh đ ợc chuyển từ S* sang S chỉ
xảy ra nhiều nhất n lần.
Nh vậy, mỗi pha điều chỉnh có thể cài đặt với thời gian O(n2) Do có không quá n pha điều
chỉnh trong thuật toán, nên cách cài đặt này cho ta thuật toán với thời gian tính O(n3).
Trang 33Ví dụ
Xét bài toán với ma trận hiệu quaủ
Trang 34tù do x ta cã
Trang 36w(M) = 4 + 2 + 5 + 2 = 13.
Trang 37Cài đặt trên Pascal
Trang 39function FoundIncPath: boolean;
FoundIncPath:=false;
Tìm đường tăng
Trang 41for i:=1 to n do
if q[i]>0 then for j:=n+1 to n2 do
if q[j]=0 then
if d>longint(f[i]+f[j]-c(i,j-n)) then
d:=longint(f[i]+f[j]-c(i,j-n)); for i:=1 to n do
if q[i]>0 then dec(f[i],d);
for j:=n+1 to n2 do
if q[j]>0 then inc(f[j],d);