CHƯƠNG 2. BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ VÀ CÁC THUẬT TOÁN
2.3 BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI VỚI TỔNG TRỌNG SỐ CỰC ĐẠI HOẶC CỰC TIỂU TRÊN ĐỒ THỊ HAI PHÍA
2.3.4 Phương pháp đối ngẫu Kuhn-Munkres
Phương pháp đối ngẫu Kuhn-Munkres đi tìm hai dãy số Fx[l..k] và Fy[l..k] thoả mãn:
• C[i j] – F x [ i ] – F y U ] > = 0
• Tập các c nh (x[i], y[j]) thoả mãn C[i,j] – Fx[i] – Fy[j] = 0 chứa trọn
một bộ ghép đầy đủ k c nh, đây chính là bộ ghép cần tìm.
Rõ ràng nếu tìm đƣợc hai dãy số thoả mãn trên thì ta chỉ việc thực hiện hai thao tác:
+ Với mỗi đỉnh x[i], trừ tất cả trọng số của những c nh liên thuộc với x[i] đi một lƣợng Fx[i].
+ Với mỗi đỉnh y[j], trừ tất cả trọng số của những c nh liên thuộc với y[j] đi một lƣợng Fy[j].
(Hai thao tác này tương đương với việc trừ tất cả trọng số của các c nh (x[i], y[j]) đi một lƣợng Fx[i] + Fy[j] tức là C[i,j] := C[i,j] – Fx[i] – Fy[j])
Thì dễ thấy đổ thị mới t o thành sẽ gồm c các c nh trọng số không âm và những c nh c trọng số bằng 0 của đồ thị chứa trọn một bộ ghép đầy đủ.
Vậy phương pháp đối ngẫu Kuhn-Munkres đưa việc biến đổi đổ thị G (biến đổi ma trận C) về việc biến đổi hai dãy số Fx và Fy. Việc trừ một lƣợng delta vào trọng số tất cả các c nh liên thuộc với x[i] tương đương với việc t ng Fx[i] lên một lƣợng delta. Việc cộng một lƣợng delta vào trọng số tất cả các c nh liên thuộc với y[j] tương đương với việc giảm Fy[j] đi một lượng delta. Khi cần biết trọng số c nh (x[i], y[j]> là bao nhiêu sau các bước biến đổi, thay vì viết C[i,j] ta viết
C[i,j] – Fx[i] – Fy[j].
Sơ đồ cài đặt phương pháp đối ngẫu Kuhn-Munkres có thể viết như sau:
Bước : Khởi t o:
+ M := ;
+ Việc khởi t o các Fx, Fy c thể c nhiều cách miễn sao C[i,j] – Fx[i]
– Fy[j] >= 0, đơn giản nhất c thể đặt tất cả các Fx[.], Fy[.] bằng 0.
Bước : Với mọi đỉnh x* X, ta tìm cách ghép x* nhƣ sau:
Bắt đầu từ đỉnh x*, thử tìm đường mở bắt đầu ở x* bằng thuật toán tìm kiếm trên đồ thị (BFS hoặc DFS). C hai khả n ng xảy ra:
+ Hoặc tìm được đường mở thì dọc theo đường mở, ta lo i bỏ những c nh đã ghép khỏi M và thêm vào M những c nh chƣa ghép.
+ Hoặc không tìm được đường mở thì xác định được:
VisitedX = { Tập những x_đỉnh c thể đến được từ x* bằng một đường pha}
VisitedY ={Tập những Y_đỉnh c thể đến được từ x* bằng một đường pha } Đặt delta = min {C[i,j] –Fx[i] –F[j] | x[i] VisitedX, y[j] VisitedY}
Với x[i] VisitedX: Đặt Fx[i] := Fx[i] + delta;
Với y[j] VisitedY: Đặt Fy[j] := Fy[j] – delta;
Lặp l i thủ tục tìm đường mở xuất phát t i x* cho tới khi tìm ra đường mở.
Bước 3: Lưu rằng bước 2 luôn tìm ra đường mở vì đồ thị đã được làm cho trở nên cân bằng (|X| = |Y|) và đầy đủ, ta chỉ việc trả về đường mở tìm đƣợc.
Đáng lưu ở phương pháp Kuhn-Munkres là phương pháp này không làm thay đổi ma trận C ban đầu. Điều đ thực sự hữu ích trong trường hợp trọng số của c nh (x[i], y[j]) không được cho một cách tường minh bằng giá trị C[i,j] mà l i cho bằng hàm c(i,j): trong trường hợp này, việc trừ hàng/cộng cột trực tiếp trên ma trận chi phí C là không thể thực hiện đƣợc.
2.3.5 Đánh giá độ phức tạp và cải tiến thuật toán
Dựa vào sơ đồ cài đặt thuật toán Kuhn-Munkres ở trên, ta c thể đánh giá độ phức t p tính toán l thuyết của cách cài đặt này:
Thuật toán tìm kiếm theo chiều rộng được sử dụng để tìm đường mở c độ phức t p 0(k2), mỗi lần xoay trọng số c nh mất một chi phí thời gian cỡ
0(k2). Vậy, mỗi lần t ng cặp cần tối đa k lần dò đường và k lần xoay trọng số c nh, mất một chi phí thời gian cỡ 0(k3). Thuật toán cần k lần t ng cặp nên độ phức t p tính toán trên l thuyết của phương pháp này cỡ 0(k4). C thể cải tiến mô hình cài đặt để đƣợc một thuật toán với độ phức t p 0(k3) dựa trên những nhận xét sau:
Nhận xét 1:
Quá trình tìm kiếm theo chiều rộng bắt đầu từ một đỉnh x* chƣa ghép cho ta một cây pha gốc x*. Nếu tìm được đường mở thì dừng l i và t ng cặp ngay, nếu không thì xoay trọng số c nh và bắt đầu tìm kiếm l i để đƣợc một cây pha lớn hơn cây pha cũ.
Nhận xét 2:
Việc xác định trọng số nhỏ nhất của c nh nối một X_đỉnh trong cây pha với một Y_đỉnh ngoài cây pha c thể kết hợp ngay trong bước dựng cây pha mà không làm t ng cấp phức t p tính toán. Để thực hiện đƣợc điều này, ta sử dụng kỹ thuật sau:
Với mọi y[j] Y, gọi d[j] là khoảng cách từ y[j] đến cây pha gốc x*.
Ban đầu d[j] đƣợc khởi t o bằng trọng số c nh (x*,y[j]) (cây pha ban đầu chỉ c đúng một đỉnh x*).
Trong bước tìm đường bằng BFS, mỗi lần rút một đỉnh x[i] ra khỏi Queue, ta xét những đỉnh y[j] Y chƣa th m và đặt l i d[j]mới := min(d[j]cũ, trọng số c nh (x[i] , y[j])) sau đ mới kiểm tra xem (x[i],y[j]) c phải là c nh c trọng số bằng 0 hay không để tiếp tục các thao tác như trước. Nếu quá trình BFS không tìm ra đường mở thì giá tộ xoay delta chính là giá trị nhỏ nhất trong các d[j] dương. Ta bớt được một đo n chương trình tìm giá trị xoay c độ phức t p 0(k2). Công việc t i mỗi bước xoay chỉ là tìm giá trị nhỏ nhất trong các d[j] dương và thực hiện phép cộng, trừ trên hai dãy đối ngẫu
Fx và Fỵ, n c độ phức t p tính toán O(k). Tối đa c k lần xoay để tìm đường mở nên tổng chi phí thời gian thực hiện các lần xoay cho tới khi tìm ra đường mở cỡ 0(k2). Lưu rằng đồ thị đang xét là đồ thị hai phía đầy đủ nên khi xoay các trọng số c nh bằng giá trị xoay delta, tất cả các c nh nối từ X_đỉnh trong cây pha tới Y_đỉnh ngoài cây pha đều bị giảm trọng số đi delta, chính vì vậy sau mỗi bước xoay, ta phải trừ tất cả các d[j]> 0 đi delta để giữ đƣợc tính hợp l của các d[j].
Nhận xét 3:
Ta c thể tận dụng kết quả của quá trình tìm kiếm theo chiều rộng ở bước trước để nới rộng cây pha cho bước sau mà không phải dựng cây pha l i từ đầu.
Khi không tìm thấy đường mở, bước xoay trọng số c nh sẽ được thực hiện. Sau khi xoay, ta sẽ thãm luôn những đỉnh y[j] Y chƣa th m t o với một X_đỉnh đã th m một c nh c trọng số bằng 0, nếu tìm thấy đường mở thì dừng ngay, nếu không tìm thấy thì đẩy tiếp những đỉnh thuộc tập X ghép với đỉnh y[j] vào hàng đợi và lặp l i thuật toán tìm kiếm theo chiều rộng bắt đầu từ những đỉnh này. Vậy nếu xét tổng thể, mỗi lần t ng cặp ta chỉ thực hiện một lần dựng cây pha, tức là tông chi phí thời gian của những lần thực hiện giải thuật tìm kiếm trên đồ thị sau mỗi lần tàng cặp chỉ còn là 0(k2).
Nhận xét 4:
Thủ tục t ng cặp dựa trên đường mở c độ phức t p O(k).
Từ 4 nhận xét trên, phương pháp đối ngẫu Kuhn-Munkres c thể cài đặt bằng một chương trình c độ phức t p tính toán 0(k3) bởi n c k lần t ng cặp và chi phí cho mỗi lần là 0(k2).