Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa

Bà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.

Số cạnh trong M - kích thớc,

Tổng trọng số của các cạnh trong M - trọng lợng của cặp ghép.

Cặp ghép với kích thớc lớn nhất đợc gọi là cặp ghép cực đại.

Cặp ghép với trọng lợng lớn nhất đợc gọi là cặp ghép lớn nhất.

 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 ghép.

 

ppt 43 trang phuongnguyen 4740
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa

Bài giảng Toán rời rạc - Phần 2: Lý thuyết đồ thị - Bài toán ghép cặp - Nguyễn Đức Nghĩa
Bài toỏn ghộp cặp 
Graph Matching 
1 
Graph Matching 
Bà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 . 
Số cạnh trong M - kích thước , 
Tổng trọng số của các cạnh trong M - trọng lượng của cặp ghép . 
Cặp ghép với kích thước lớn nhất đư ợc gọi là cặp ghép cực đại. 
Cặp ghép với trọng lượng lớn nhất đư ợc gọi là cặp ghép lớn nhất . 
 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 ghép . 
2 
Graph Matching 
Hai 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 ) . 
3 
Graph Matching 
Vớ 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 
4 
Graph Matching 
Vớ dụ 
Cặp ghộp lớn nhất : 
 M = {( x 1 , y 1 ), ( x 2 , y 3 ), ( x 3 , y 2 ), ( x 4 , y 4 )} 
Cú trọng lượng 29. 
y 4 
y 3 
y 2 
y 1 
x 4 
x 3 
x 2 
x 1 
12 
3 
4 
8 
3 
2 
4 
6 
5 
Graph Matching 
Bài toán cặp ghép cực đại  trên đ ồ thị hai phía 
Xét đ ồ thị hai phía  G = ( X  Y, E ) . 
Cặp ghép là tập cạnh mà không có hai cạnh nào có chung đ ỉnh 
Bài toán : Tìm cặp ghép kích thước lớn nhất 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
6 
Graph Matching 
Qui về Bài toán luồng cực đại 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
s 
t 
Mỗi cung (s, i) cú kntq 1. 
Mỗi cung (j, t) cú kntq 1. 
Mỗi cạnh được thay thế bởi cung cú kntq 1. 
7 
Graph Matching 
Tỡm luồng cực đại 
Luồng cực đại từ s->t cú giỏ trị 4. 
Cặp ghộp cực đại cú kớch thước 4. 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
s 
t 
8 
Graph Matching 
Bà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). 
9 
Graph Matching 
Đườ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 . 
10 
Graph Matching 
Định lý Berge 
Đ ịnh lý 1 (Berge C). Cặp ghép M là cực đại khi và chỉ khi không tìm đư ợc đư ờng tăng cặp ghép . 
CM : 
Đ iều kiện cần . Bằng phản chứng . Gi ả sử M là cặp ghép cực đại nhưng vẫn tìm đư ợc đư ờng tăng cặp ghép 
	P  x 0 , y 1 , x 1 , y 2 , ..., x k , y 0 
 trong đ ó x 0 và y 0 là các đ ỉnh tự do. 
 Gọi E P là tập các cạnh của đ ồ thị nằm trên đư ờng đi P 
	 E P = { ( x 0 ,y 1 ) , ( y 1 , x 1 ) , ..., ( x k , y 0 ) } . 
 Dễ thấy số lượng cạnh nhạt trong E P 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 E P 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 | + 1 . Mâu thuẫn thu đư ợc đã chứng minh đ iều kiện cần . 
11 
Graph Matching 
Định lý Berge 
Đ iều kiện đủ. Gi ả sử cặp ghép M chưa là cặp ghép cực đại. Gọi M * là cặp ghép cực đại. Xét đ ồ thị G ’ = ( V , M  M *). Rõ ràng hai cạnh liên tiếp trong mỗi đư ờng đi cũng nh ư mỗi chu trình trong G’ không thể thuộc cùng một cặp ghép M 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à đ úng với đ ồ thị vô hướng bất kỳ . 
12 
Graph Matching 
Thuậ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 trong đ ồ thị G ( có thể bắt đ ầu từ M =  ). 
Bước lặp . 
Kiểm tra tiêu chuẩn tối ưu: Nếu đ ồ thị G không chứa đư ờng tăng cặp ghép th ì M là cặp ghép 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 x 0 X , kết thúc ở đ ỉnh tự do y 0 Y . Tăng cặp ghép theo qui tắc 
 M := ( M  P ) \ ( M  P ), 
 rồi lặp lại bước lặp . 
13 
Graph Matching 
Tỡm đường tăng 
Từ đ ồ thị G ta xây dựng đ ồ thị có hướng G M = ( X  Y , E M ) với tập cung E M đư ợ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 ) E M ; 
	ii) Nếu ( x,y ) E \ M , th ì ( x,y ) E M . 
 Đ ồ thị G M sẽ đư ợc gọi là đ ồ thị tăng cặp ghép . 
Dễ thấy : 
Đường tăng cặp ghép tương ứng với một đư ờng đi xuất phát từ một đ ỉnh tự do x 0 X kết thúc tại một đ ỉnh tự do y 0 Y trên đ ồ thị G M . 
Ngược lại, một đư ờng đi trên đ ồ thị G M xuất phát từ một đ ỉnh tự do x 0 X kết thúc tại một đ ỉnh tự do y 0 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ìm kiếm theo chiều rộng trên đ ồ thị G M bắt đ ầu từ các đ ỉnh tự do thuộc tập X . 
14 
Graph Matching 
Thuậ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 |). 
15 
Graph Matching 
Cài đặt 
Cấu trỳc dữ liệu 
Var 
 A : Array[1..100,1..100] of Byte; (* Ma trận kề của đồ thi hai phớa G *) 
 Truoc ,	 (* Ghi nhận đường đi *) 
 Vo, (* Vo[x ]- đỉnh được ghộp với x X *) 
 Chong : Array[1..100] of Byte; (* Chong[y]-đỉnh được ghộp với y Y *) 
 N, x0, y0, Cnt : Byte; 
 Stop : Boolean; 
(* Nếu (x, y) M thỡ Vo[x ]=y; Chong[y ]=x. 
 Vo[x ]=0 => x là đỉnh nhạt ; Chong[y ]=0 => y là đỉnh nhạt *) 
16 
Graph Matching 
Tỡm đường tăng 
Procedure Tim(x:Byte ); 
 var y: Byte; 
 begin 
 For y:=1 to N do 
 If ( A[x,y ]=1)and(Truoc[y]=0)and(y0=0) then 
 begin 
 Truoc[y ]:=x; 
 If Chong[y ]0 then Tim(Chong[y ]) 
 else 
 begin 
 y0:=y; 
 Exit; 
 end; 
 end; 
 end; 
Procedure Tim_Duong_Tang ; 
begin 
 Fillchar(Truoc,Sizeof(Truoc),0); 
 y0:=0; 
 For x0:=1 to N do 
 begin 
 If Vo[x0]=0 then Tim(x0); 
 If y00 then exit; 
 end; 
 Stop:=true; 
end; 
17 
Graph Matching 
Thủ tục MaxMatching 
Procedure Tang; 
var temp: Byte; 
begin 
 Inc(Cnt ); 
 While Truoc[y0]x0 do 
 begin 
 Chong[y0]:=Truoc[y0]; 
 Temp:=Vo[Truoc[y0]]; 
 Vo[Truoc[y0]]:=y0; 
 y0:=Temp; 
 end; 
 Chong[y0]:=x0; 
 Vo[x0]:=y0; 
end; 
Procedure MaxMatching ; 
begin 
 Stop:=false; 
 Fillchar(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; 
18 
Graph Matching 
Bài toán phân công 
 Có n công việc và n thợ . Mỗi thợ đ ều có kh ả năng thực hiện tất cả các công việc . Biết 
	 w ij - hiệu qu ả phân công thợ i làm việc j , 
 ( i, j = 1, 2,..., n ). 
 Cần tìm cách phân công thợ thực hiện các công việc sao cho mỗi thợ chỉ thực hiện một việc và mỗi việc chỉ do một thợ thực hiện , đ ồng thời tổng hiệu qu ả thực hiện các công việc là lớn nhất . 
19 
Graph Matching 
Qui về bài toỏn cặp ghộp lớn nhất 
Xây dựng đ ồ thị hai phía đ ầy đủ G = ( X  Y , E ) 
X ={ x 1 , x 2 ,..., x n } tương ứng với các thợ , 
Y = { y 1 , y 2 ,..., y n }- tương ứng với các công việc . 
Mỗi cạnh ( x i , y j ) đư ợc gán cho trọng số w ( x i , y j ) = w ij . 
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. 
20 
Graph Matching 
Cơ 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à một hàm số f xác đ ịnh trên tập đ ỉnh X  Y: f: X  Y R, tho ả mãn 
	 f ( x ) + f ( y ) w ( x,y ) ,  x X,  y Y. 
 Một phép gán nhãn chấp nhận đư ợc nh ư vậy dễ dàng có thể tìm đư ợc , chẳng hạn phép gán nhãn sau đây là chấp nhận đư ợc 
	 f ( x ) = max { w ( x,y ): y Y },	 x X , 
 	 f ( y ) = 0 , y Y . 
21 
Graph Matching 
Đồ 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 . 
22 
Graph Matching 
Tiờ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 G f chứa cặp ghép đ ầy đủ M*, th ì M* là cặp ghép tối ưu. 
Chứng minh . 
 Gi ả sử G f chứa cặp ghép đ ầy đủ M *. Khi đ ó từ đ ịnh nghĩa G f 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 G f 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. 
23 
Graph Matching 
Sơ đồ 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ị G f . Bắt đ ầu từ một cặp ghép M nào đ ó trong G f ta xây dựng cặp ghép đ ầy đủ trong G f . Nếu tìm đư ợc cặp ghép đ ầy đủ M *, th ì nó chính là cặp ghép tối ưu. Ngược lại, ta sẽ tìm đư ợc cặp ghép cực đại không đ ầy đủ M '. Từ M ' ta sẽ tìm cách sửa phép gán nhãn thành f ' sao cho M ' vẫn là cặp ghép của G f ' và có thể tiếp tục phát triển M ' trong G f '., v.v ... 
Qu á trình đư ợc tiếp tục cho đ ến khi thu đư ợc cặp ghép đ ầy đủ trong đ ồ thị cân bằng . 
24 
Graph Matching 
Điều chỉnh nhón 
Gi ả sử M là cặp ghép cực đại trong đ ồ thị G f 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 đ ỉnh đư ợc thăm trong X , còn T là các đ ỉnh đư ợc thăm trong Y trong qu á trình thực hiện tìm kiếm . Ký hiệu 
| S | > | T | (do mỗi đ ỉnh trong T đạt đư ợc từ một đ ỉnh nào đ ó trong S ). 
. 
25 
Graph Matching 
Đ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 , rõ ràng , không có cạnh nào từ S đ ến T * . Để sửa chữa nhãn , chúng ta sẽ tiến hành giảm đ ồng loạt các nhãn trong S đi cùng một gi á trị  nào đ ó , và đ ồng thời sẽ tăng đ ồng loạt nhãn của các đ ỉnh trong T lên  . Đ iều đ ó đảm bảo các cạnh từ S sang T ( nghĩa là những cạnh mà một đ ầu mút thuộc S còn một đ ầu mút thuộc T ) không bị loại bỏ khỏi đ ồ thị cân bằng 
Các tập S và T trong thực hiện thuật toán . Chỉ vẽ các cạnh trong G f . 
S * T * 
26 
Graph Matching 
Đ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 G f . 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 : 
Nếu cạnh mới gia nhập đ ồ thị cân bằng giúp ta thăm đư ợc một đ ỉnh không tự do y T * th ì từ nó ta sẽ thăm đư ợc một đ ỉnh đư ợc ghép với nó trong cặp ghép x S * , và cả hai đ ỉnh này đư ợc bổ sung vào S và T tương ứng , và nh ư vậy việc tìm kiếm đư ờng tăng sẽ đư ợc tiếp tục mở rộng . 
Nếu cạnh mới gia nhập đ ồ thị cân bằng cho phép thăm đư ợc một đ ỉnh tự do y T * th ì ta tìm đư ợc đư ờng tăng cặp ghép , và kết thúc một pha đ iều chỉnh nhãn . 
27 
Graph Matching 
Đ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 ( n 2 ) 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 4 ). 
28 
Graph Matching 
Thuật toỏn 
Bước 0: Tìm một phép gán nhãn chấp nhận đư ợc f . 
Bước 1: Xây dựng đ ồ thị cân bằng G f . 
Bước 2: Tìm cặp ghép cực đại M trong G f . 
Bước 3: Nếu M là cặp ghép đ ầy đủ th ì nó là cặp ghép lớn nhất cần tìm . Thuật toán kết thúc . 
Bướ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 G f 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. 
29 
Graph Matching 
Tă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 ). 
30 
Graph Matching 
Tăng hiệu quả 
Khi đ ó 
Rõ ràng việc tính trực tiếp  theo công thức đ òi hỏi thời gian O ( n 2 ). Bây giờ , nếu với mỗi đ ỉnh trong T * ta ghi nhận lại cạnh với độ lệch nhỏ nhất 
31 
Graph Matching 
Tăng hiệu quả 
Việc tính gi á trị độ lệch slack ( y j ) đ òi hỏi thời gian O ( n 2 ) ở đ ầ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 ( n 2 ). 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 ( n 3 ). 
32 
Graph Matching 
Vớ dụ 
Xột bài toỏn với ma trận hiệu quả 
33 
Graph Matching 
Vớ dụ 
Bắt đầu từ phộp gỏn nhón 
Đồ thị cõn bằng G f 
Cặp ghép cực đại tìm đư ợc 
	 M = {( x 1 , y 2 ), ( x 2 , y 1 ), ( x 4 , y 4 ) }. 
Tìm kiếm theo chiều rộng bắt đ ầu từ đ ỉnh tự do x 3 ta có 
	 S = { x 2 , x 3 }, T = { y 1 } 
34 
Graph Matching 
Vớ dụ 
Tính 
  = min { f ( x )+ f ( y )- w ( x,y ): x { x 2 , x 3 }, y { y 2 , y 3 , y 4 } } = 1. 
Tiến hành sửa nhãn , ta đi đ ến phép gán nhãn mới 
35 
Graph Matching 
Vớ dụ 
Theo đư ờng tăng cặp ghép 
 x 3 , y 3 , x 4 , y 4 
 ta tăng cặp ghép M thành cặp ghép đ ầy đủ 
	 M ={( x 1 , y 2 ), ( x 3 , y 1 ), ( x 2 , y 3 ), ( x 4 , y 4 )}, 
 đ ồng thời là cặp ghép tối ưu với trọng lượng 
	 	 w ( M ) = 4 + 2 + 5 + 2 = 13. 
36 
Graph Matching 
Cài đặt trờn Pascal 
const maxn = 170; 
type data1=array [1..maxn,1..maxn] of integer; 
 data2=array [1..2* maxn ] of integer; 
 data3=array [1..2* maxn ] of longint ; 
var c: data1; 
 px , py , q, queue: data2; 
 a, b, f: data3; 
 n, n2, k, u, z: integer; 
37 
Graph Matching 
Khởi tạo 
procedure init; 
var i, j: integer; 
begin 
 n2:= n+n ; fillchar(f,sizeof(f),0); 
 for i:=1 to n do 
 for j:=1 to n do 
 if f[i ]< c(i,j ) then f[i ]:= c(i,j ); 
 k:=0; 
 fillchar(px,sizeof(px),0); fillchar(py,sizeof(py),0); 
 for i:=1 to n do 
 for j:=1 to n do 
 if ( py[j ]=0) and ( f[i]+f[j+n ]= c(i,j )) then 
 begin 
 px[i ]:=j; py[j ]:=i; inc(k ); 
 break; 
 end; 
end; 
38 
Graph Matching 
function FoundIncPath : boolean ; 
var dq , cq , v, w: integer; 
begin 
 fillchar(q,sizeof(q),0); 
 dq :=1; cq :=1; queue[dq ]:=u; q[u ]:=u; 
 while dq <= cq do 
 begin 
 v:= queue[dq ]; inc(dq ); 
 if v<=n then 
 begin 
 for w:=n+1 to n2 do 
 if ( f[v]+f[w ]= c(v,w-n )) and ( q[w ]=0) then 
 begin inc(cq ); queue[cq ]:=w; q[w ]:=v; end; 
 end else 
 if ( py[v-n ]=0) then begin FoundIncPath := true;z := v;exit ; end 
 else begin w:= py[v-n ]; inc(cq ); queue[cq ]:=w; q[w ]:=v; end; 
 end; 
 FoundIncPath :=false; 
end; 
Tỡm đường tăng 
39 
Graph Matching 
Tỡm đỉnh tự do 
function FreeNodeFound : boolean ; 
var i:integer ; 
begin 
 for i:=1 to n do 
 if px[i ]=0 then 
 begin 
 u:=i; 
 FreeNodeFound :=true; 
 exit; 
 end; 
 FreeNodeFound :=false; 
end; 
40 
Graph Matching 
Tăng cặp ghộp và Sửa nhón 
procedure Tangcapghep ; 
var i, j: integer; 
 ok: boolean ; 
begin 
 j:=z; ok:=true; 
 while ju do 
 begin 
 i:= q[j ]; 
 if ok then 
 begin 
 px[i ]:= j-n ; 
 py[j-n ]:=i; 
 end; 
 j:=i; 
 ok:= not ok; 
 end; 
 inc(k ); 
end; 
procedure Suanhan ; 
var i, j: integer; 
 d: longint ; 
begin 
 d:= maxlongint ; 
 for 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 ); 
end; 
41 
Graph Matching 
Main Procedure 
procedure Solve; 
begin 
 init; 
 while FreeNodeFound do 
 begin 
 while not FoundIncPath do suanhan ; 
 Tangcapghep ; 
 end; 
end; 
42 
Graph Matching 
43 
Graph Matching 

File đính kèm:

  • pptbai_giang_toan_roi_rac_phan_2_ly_thuyet_do_thi_bai_toan_ghep.ppt