12
1 VIN TOÁN NG DNG & TIN HC BÁO CÁO Thut toán Hungary vi bài toán tìm cp ghép cực đại giá trcc tiu Nguyn Thanh Tùng - 20093133 06-Nov-12 Tối ưu tổ hp hc k20121

Báo cáo Cặp ghép - TùngNT

Embed Size (px)

Citation preview

Page 1: Báo cáo Cặp ghép - TùngNT

1

VIỆN TOÁN ỨNG DỤNG & TIN HỌC

BÁO CÁO Thuật toán Hungary với bài toán tìm cặp ghép

cực đại giá trị cực tiểu

Nguyễn Thanh Tùng - 20093133

06-Nov-12

Tối ưu tổ hợp – học kỳ 20121

Page 2: Báo cáo Cặp ghép - TùngNT

2

Contents

I. Bài toán thực tế ............................................................................................... 3

II. Một số khái niệm ............................................................................................ 4

1. Đồ thị 2 phía ................................................................................................ 4

2. Đồ thị 2 phía đầy đủ .................................................................................... 4

3. Đồ thị 2 phía đầy đủ cân bằng ..................................................................... 4

4. Cặp ghép ...................................................................................................... 4

5. Cặp ghép cực đại ......................................................................................... 5

6. Giá trị của cặp ghép ..................................................................................... 5

III. Mô hình hóa bài toán thực tế ....................................................................... 6

IV. Thuật toán Hungary ..................................................................................... 7

1. Xây dựng đồ thị 2 phía đầy đủ cân bằng ..................................................... 7

2. Hai định lý nền tảng .................................................................................... 8

3. Ý tưởng thuật toán ....................................................................................... 8

4. Giải thuật ..................................................................................................... 9

V. Ví dụ minh họa ............................................................................................. 10

Page 3: Báo cáo Cặp ghép - TùngNT

3

I. Bài toán thực tế

Cho

• m công việc: x1, x2 ... xm

• n người: y1, y2... yn

• Người i thực hiện công việc j cần chi phí cij 0

Cần tìm:

Cách phân chia người – việc thỏa mãn các yêu cầu

• Mỗi người làm không quá 1 công việc.

• Số công việc được phân chia là nhiều nhất.

• Tổng chi phí cho cả cách phân chia là nhỏ nhất trong các cách phân chia

thỏa mãn 2 yêu cầu trên.

Ví dụ:

Bảng chi phí thực hiện 3 công việc của 4 người A, B, C, D

Đi chợ Nấu cơm Rửa bát

A 7$ - 4$

B - 3$ -

C 8$ - -

D 2$ - 2$

Cách phân chia cần tìm cho ví dụ trên là:

A -

B Nấu cơm

C Đi chợ

D Rửa bát

Page 4: Báo cáo Cặp ghép - TùngNT

4

II. Một số khái niệm

1. Đồ thị 2 phía

Đồ thị 2 phía G = (V, E) được gọi là “đồ thị 2 phía” nếu:

X, Y : 𝑋 𝑌 = 𝑉

𝑒 = 𝑢, 𝑣 𝐸: 𝑢 𝑋, 𝑣 𝑌

tức là có thể chia tập đỉnh V thành 2 tập X, Y sao cho mỗi cạnh của đồ thị

đều nối 1 đỉnh của tập X với 1 đỉnh của tập Y.

Ta ký hiệu một đồ thị 2 phía như sau: G = (X Y, E) là đồ thị 2 phía với

tập đỉnh được phân hoạch thành 2 tập X và Y, có tập cạnh E.

2. Đồ thị 2 phía đầy đủ

Đồ thị 2 phía G = (X Y, E) được gọi là “đồ thị 2 phía đầy đủ” nếu

x X, y Y: (x, y) E

tức là tất cả các đỉnh của đồ thị 2 phía đều có cạnh nối với nó.

3. Đồ thị 2 phía đầy đủ cân bằng

Đồ thị 2 phía đầy đủ G = (X Y, E) được gọi là “đồ thị 2 phía đầy đủ

cân bằng” nếu

|X| = |Y| = k

tức là số đỉnh trong tập X bằng số đỉnh trong tập Y.

4. Cặp ghép

Cho đồ thị 2 phía G = (X Y, E), một tập con các cạnh M của E được

gọi là “một cặp ghép của G” nếu:

e1, e2 M, e1 e2 e1, e2 không có đỉnh chung

Page 5: Báo cáo Cặp ghép - TùngNT

5

5. Cặp ghép cực đại

Cho đồ thị 2 phía G = (X Y, E), một cặp ghép M của G được gọi là

“cặp ghép cực đại của G” nếu nó có số cạnh lớn nhất trong tất cả các cặp

ghép của G.

6. Giá trị của cặp ghép

Giá trị của cặp ghép M bằng tổng tất cả trọng số các cạnh nằm trong M

(chỉ áp dụng cho đồ thị có trọng số)

ValueM = 𝑚𝑖𝑘𝑖=1

Page 6: Báo cáo Cặp ghép - TùngNT

6

III. Mô hình hóa bài toán thực tế

Ta xây dựng đồ thị 2 phía từ bài toán thực tế ban đầu như sau:

Dùng các đỉnh của đồ thị để mô tả người và việc, cụ thể tập đỉnh X mô tả

tập người, tập đỉnh Y mô tả tập công việc.

Một cạnh nối từ đỉnh xi của tập X nối đến đỉnh yj của tập Y, có trọng số cij

để mô tả người i có thể làm công việc j với chi phí cij.

Vậy với cách xây dựng trên, ta có đồ thị 2 phía có trọng số:

G = (X Y, E)

Yêu cầu của bài toán trở thành đi tìm cặp ghép cực đại giá trị cực tiểu của

đồ thị 2 phía G.

Ví dụ:

Page 7: Báo cáo Cặp ghép - TùngNT

7

IV. Thuật toán Hungary

1. Xây dựng đồ thị 2 phía đầy đủ cân bằng

Thêm các đỉnh ảo vào tập đỉnh có số đỉnh nhỏ hơn để có số đỉnh trong 2

tập con X và Y bằng nhau.

Thêm các cạnh còn thiếu vào trong tập E (gọi là cạnh ảo) với trọng số rất

lớn so với các cạnh có ban đầu để có đồ thị 2 phía đầy đủ cân bằng.

Ta có thể chứng minh từ cặp ghép cực đại có giá trị cực tiểu đồ thị 2 phía

đầy đủ cân bằng trên, bỏ đi các cạnh ảo, thì sẽ thu được cặp ghép cực đại

có giá trị cực tiểu của đồ thị 2 phía ban đầu.

Thật vậy, giả sử có:

o Đồ thị 2 phía A bổ sung thêm đỉnh ảo, cạnh ảo được đồ thị 2 phía

đầy đủ cân bằng B.

o Cặp ghép cực đại giá trị cực tiểu của đồ thị B: M (có n cạnh)

o Cặp ghép M bỏ đi các cạnh ảo: M’

o Cặp ghép cực đại giá trị cực tiểu của A: N

M là cặp ghép cực đại giá trị cực tiểu của B nên M sẽ có ít cạnh ảo

nhất trong các cặp ghép cực đại của B. Do đó M’ là cặp ghép cực đại

của A (có cùng số cạnh k với cặp ghép N, k n). Nếu giá trị của cặp

ghép M’ lớn hơn giá trị của cặp ghép N thì từ cặp ghép N, bổ sung

thêm (n – k) cạnh ảo sẽ thu được cặp ghép có giá trị nhỏ hơn cặp ghép

M trên cùng đồ thị B, dẫn đến M không phải là cặp ghép cực đại giá

trị cực tiểu của B => Trái giả thiết. Vậy nên giá trị cặp ghép M’ phải

nhỏ hơn hoặc bằng giá trị cặp ghép N => M’ chắc chắn là cặp ghép

cực đại giá trị cực tiểu của A (điều phải chứng minh).

Page 8: Báo cáo Cặp ghép - TùngNT

8

2. Hai định lý nền tảng

Cho G = (X Y, E) là một đồ thị 2 phía đầy đủ cân bằng, |X|=|Y|=k, sinh ra

từ đồ thị 2 phía K bằng cách thêm các đỉnh ảo, cạnh ảo như đã mô tả.

2.1. Định lý 1

Nếu mọi trọng số của G đều không âm, nếu tồn tại một bộ k cạnh có

trọng số bằng 0 sao cho bộ này là một cặp ghép của G thì bộ k cạnh

này là một cặp ghép cực đại giá trị cực tiểu của G.

Chứng minh: Do mọi trọng số của G đều không âm, nên bộ k cạnh có

trọng số bằng 0 sẽ có giá trị bằng 0, đặt giá trị cực tiểu cho các cặp

ghép của G => điều phải chứng minh.

2.2. Định lý 2

Với mọi đỉnh v của G, nếu cộng một số vào tất cả các cạnh chứa

đỉnh v thì ta được đồ thị G’ có cùng cặp ghép cực đại giá trị cực tiểu

với đồ thị G.

Chứng minh: Với mọi cặp ghép cực đại M của G, chỉ có một cạnh

trong cặp ghép M chứa đỉnh v. Nếu cộng một số vào tất cả các cạnh

chứa v của đồ thị G thì mọi cặp ghép cực đại M của G đều có giá trị

được cộng => Cặp ghép cực đại giá trị cực tiểu không đổi. (điều

phải chứng minh)

3. Ý tưởng thuật toán

Ta lưu đồ thị 2 phía đầy đủ cân bằng vào ma trận 2 chiều như sau:

1 2 … k

1 c11 c12 … c1k

2 c21 c22 … c2k

… … … … …

k ck1 ck2 … ckk

Định lý 1 cho ta ý tưởng tìm lời giải bằng cách biến đổi ma trận ban đầu

đến khi nào mỗi hàng mỗi cột của ma trận đều có ít nhất 1 phần tử 0.

Định lý 2 cho ta cách biến đổi ma trận: cộng (trừ) 1 số vào 1 hàng hoặc

1 cột sao cho mọi phần tử sau khi biến đổi đều không âm.

Page 9: Báo cáo Cặp ghép - TùngNT

9

4. Giải thuật

Input: Ma trận Kmn mô tả đồ thị 2 phía K = (XK YK, EK), với |XK| = m,

|YK| = n.

Output: Tập k-cạnh là cặp ghép cực đại giá trị cực tiểu của đồ thị K.

Thuật toán:

Bước 1: Thêm đỉnh ảo, cạnh ảo để có ma trận biểu diễn đồ thị 2 phía đầy

đủ cân bằng G = (X Y, E).

Bước 2: Trừ lần lượt các hàng cho phần tử nhỏ nhất trong hàng đó.

Bước 3: Trừ lần lượt các cột cho phần tử nhỏ nhất trong cột đó.

Bước 4: Kẻ các đường thẳng qua các hàng, cột sao cho dùng ít đường kẻ

nhất mà phủ hết các số 0. Nếu số đường kẻ bằng số cột => Bước 7.

Bước 5: Cộng giá trị nhỏ nhất của các ô chưa bị gạch vào các hàng cột bị

gạch.

Bước 6: Trừ giá trị phần tử nhỏ nhất của ma trận cho tất cả các hàng rồi

quay lại Bước 4.

Bước 7: Tìm ra bộ k số 0 sao cho mỗi hàng và mỗi cột chứa đúng 1 số 0

của bộ k số 0 này => cặp ghép cực đại giá trị cực tiểu của G.

Bước 8: Xóa các cạnh ảo => cặp ghép cực đại giá trị cực tiểu của K.

Page 10: Báo cáo Cặp ghép - TùngNT

10

V. Ví dụ minh họa

Ma trận K54

W X Y Z

A 10 - 8 15

B 10 18 7 17

C 13 16 9 14

D 12 - 8 18

E 14 17 10 -

Bước 1: Thêm đỉnh ảo, cạnh ảo để có ma trận biểu diễn đồ thị 2 phía đầy

đủ cân bằng G = (X Y, E).

10 100 8 15 100

10 18 7 17 100

13 16 9 14 100

12 100 8 18 100

14 17 10 100 100

Bước 2: Trừ lần lượt các hàng cho phần tử nhỏ nhất trong hàng đó.

2 92 0 7 92

3 11 0 10 93

4 7 0 5 91

4 92 0 10 92

4 7 0 90 90

Bước 3: Trừ lần lượt các cột cho phần tử nhỏ nhất trong cột đó.

0 85 0 2 2

1 4 0 5 3

2 0 0 0 1

2 85 0 5 2

2 0 0 85 0

Page 11: Báo cáo Cặp ghép - TùngNT

11

Bước 4: Kẻ các đường thẳng qua các hàng, cột sao cho dùng ít đường kẻ

nhất (N) mà phủ hết các số 0. Nếu số đường kẻ bằng số cột => Bước 7.

Bước 5: Cộng giá trị nhỏ nhất của các ô chưa bị gạch vào các hàng cột bị

gạch.

1 86 2 3 3

1 4 1 5 3

3 1 2 1 2

2 85 1 5 2

3 1 2 86 1

Bước 6: Trừ giá trị phần tử nhỏ nhất của ma trận cho tất cả các hàng rồi

quay lại Bước 4.

0 85 1 2 2

0 3 0 4 2

2 0 1 0 1

1 84 0 4 1

2 0 1 85 0

Page 12: Báo cáo Cặp ghép - TùngNT

12

Sau khi thực hiện lặp từ Bước 6 về Bước 4 vài lần, ta đi được tới Bước 7:

Tìm ra bộ k số 0 sao cho mỗi hàng và mỗi cột chứa đúng 1 số 0 của bộ k

số 0 này.

Bước 8: Xóa các cạnh ảo => cặp ghép cực đại giá trị cực tiểu của K.

Cặp ghép cần tìm: {(A, X), (B, Z), (C, W), (D, Y)}