Phương pháp Hung-ga-ri

Một phần của tài liệu một số thuật toán lập lịch để phân phối tài nguyên trong hệ thống tính toán lưới (Trang 45 - 47)

Bài toán: Có N người (số hiệu i=1, 2, …, N) và N công việc (số hiệu j=1, 2, ...,

N). Để giao công việc j cho người i thực hiện cần chi phí là Cij. Vấn ñề là cần phân cho người nào làm việc gì (mỗi người chỉ làm một việc, mỗi việc chỉ do một người làm) sao cho chi phí tổng cộng là nhỏ nhất?

Một trong các phương pháp giải bài toán này là tìm cặp ghép có tổng trọng số

trên các cung ñạt giá trị nhỏ nhất trên ñồ thị hai phía. Có thể giải bằng phương pháp Hung-ga-ri ñược xây dựng trên cơ sở các phát biểu sau:

Mnh ñề 1: Nếu ma trận chi phí C(N,N) có N s 0 mà không có s 0 nào cùng

hàng hoặc cùng cột thì có phương án tối ưu là: Nếu có số 0 (i, j) thì phân công

người i làm vic j.

Mnh ñề 2: Nếu thay ma trận C(N,N) bởi ma trận C’(N,N) bằng cách trừ mỗi phần tử trong một hàng (hoặc cột) cho phần tử nhỏ nhất của hàng ñó (hoặc cột ñó) thì phương án phân công tối ưu không thay ñổi khi tìm phương án này trên C’(N,N).

Thut toán:

Bước 1: Thực hiện trên ma trận chi phí C: Trừ mỗi hàng cho phần tử nhỏ nhất của hàng ñó. Trừ mỗi cột cho phần tử nhỏ nhất của cột ñó. Kết quả thu ñược ma trận C’ có tính chất: trên mỗi hàng, trên mỗi cột có ít nhất một số 0 (ta ký hiệu những ô số 0 này là T).

Bước 2: Lần lượt từ hàng 1 ñến hàng N, trên mi hàng tìm ô T ñầu tiên thuộc cột chưa có ô Đ thì gán lại các ký hiệu T của ô này thành Đ. Khi xét hết hàng thứ N

nếu có ñủ N ô Đ thì dừng và kết luận tập các ô Đ sẽ là lời giải: người i ñược phân công việc j nếu ô Đ nằm ở hàng i ct j.

47

Nếu số lượng ô Đ nhỏ hơn N thì chuyển sang bước 3.

Bước 3: Lần lượt từ hàng 1 ñến hàng N tìm hàng ñầu tiên không chứa ô Đ (giả

sửñó là hàng i0). Tìm ô T trên hàng i0, chẳng hạn ở cột j0. Xuất phát từ ô T(i0,j0) này ta xây dựng một dây chuyền các ô kế tiếp nhau theo cột rồi theo hàng xen kẽ các ô

T và Đ. Giả sửñã có dây chuyền các ô kế tiếp nhau theo cột rồi hàng xen kẽ các ô T và Đ. Giả sửñã có dây chuyền: T(i0,j0), Đ(i1,j0), T(i1,j1),... ta tìm tiếp theo cách thức sau :

+ (3-A): Nếu ñã tìm ñến ô T(ik,jk) ta tìm ô T trong ct jk không cùng dòng với ô Đ nào ñã có trong dây chuyền ñang xét. Nếu tìm thấy T dòng ik+1 thì gán lại ký hiệu T của ô này thành Đ ñược ô Đ(ik+1,jk) và thêm nó vào dây chuyền rồi chuyển tới bước (3-B), trái lại ta ñược một dây chuyền bắt ñầu là ô T(i0,j0) và kết thúc tại ô

T(ik,jk) ta ñổi ký hiệu màu các ô trên dây chuyền (T thành Đ và ngược lại - nghĩa là tăng luồng trên dây chuyền). Nếu ñủ N ô Đ thì dừng, trái lại trở về ñầu bước 3 tìm hàng tiếp theo không chứa ô Đ.

+ (3-B): Nếu ñã ñến ô Đ(ik+1,jk) ta tìm trên hàng ik+1 ô T không cùng cột với bất kỳ ô nào ñã có mặt trong dây chuyền ñang xét. Nếu tìm ñược trên cột jk+1 thì thêm ô

T(ik+1,jk+1) vào dây chuyền rồi chuyển tới (3-A). Trường hợp ngược lại thì dây chuyền xuất phát từ T(i0,j0) và kết thúc tại Đ(ik+1,jk) và không thể tăng luồng trên dây chuyền này ñược (vì số ô T bằng số ô Đ). Ta sẽ loại khỏi dây chuyền các ô

T(ik,jk) và Đ(ik+1,jk) ñồng thời ñánh dấu cột jk làcột «trở ngại», lui về ô Đ(ik,jk-1) tiếp tục mở rộng dây chuyền nếu trên hàng ik còn có ô T khác vi ô T(ik,jk) không nằm trên cột «trở ngại» và các cột ñã có mặt trong dây chuyền ñang xét, nghĩa là ta lặp lại (3-B) với hàng ik.

Nếu không tiếp tục mở rộng ñược dây chuyền theo cách trên nữa thì tìm ô T trên dòng i0ở cột j0 không là cột «trở ngại». Nếu ô T như thế tồn tại thì bắt ñầu lặp lại (3-A), ngược lại chuyển sang bước 4.

48

Bước 4: Xác ñịnh các hàng «trở ngại» là các hàng không thể chứa ô Đ ở cột không «trở ngại».

Bước 5: Tìm số nhỏ nhất trên các ô không là ô Đ, thuộc hàng không «trở

ngại» và cột không «trở ngại» của ma trận chi phí C, gọi số này là m. Trừ mọi phần tử thuộc hàng và cột không «trở ngại» với m, cộng mọi phần tử thuộc hàng và cột «trở ngại» với m.

Quay về bước 2 với ma trận mới thu ñược là C’ ñóng vai trò C

Một phần của tài liệu một số thuật toán lập lịch để phân phối tài nguyên trong hệ thống tính toán lưới (Trang 45 - 47)