1. Trang chủ >
  2. Công Nghệ Thông Tin >
  3. Kỹ thuật lập trình >

Chương 3 ỨNG DỤNG CỦA BÀI TOÁN GHÉP CẶP

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (598.52 KB, 31 trang )


o Những cạnh (x, y) thuộc M trong đồ thị G được định hướng trở thành

cung (x, y) trong đồ thị G’.

o Như vậy, ta có nhận xét sau đây: giả sử đã xây dựng được một tập cặp

ghép M nhưng vẫn có đường tăng cặp ghép từ đỉnh tự do x 0 X đến đỉnh

tự do y0 Y

X 0  y 1  x1  y2  …  x n  y 0

-



Input: đồ thị hai phía đầy đủ G = (X Y, E) với | X | = | Y | = k. Được cho bơir ma trận

vuông C, kích thước k x k, C[i,j] = trọng số cạnh nối đỉnh X i với Yj, C[i,j] 0, với mọi i



-



, j.

Output: bộ ghép đầy đủ trọng số nhỏ nhất .

3.4 Thuật toán

Bước 1: Khởi tạo tập cặp ghép M là rỗng

Bước 2: Tìm đường cặp ghép từ một đỉnh x 0 tự do thuộc X đến một đỉnh y 0 tự do



-



thuộc Y

Nếu tìm được thì chuyển sang bước 3

Nếu không tìm được thì tập cặp ghép hiện thời là cực đại và kết thúc thuật toán.

Bước 3: Tăng cặp ghép:













W = min {c[x, y] – Tho[x] – Viec[y]}

Với mọi x VisitedX: Tho[x] = Tho[x] + W;

Với mọi y VisitedY: : Viec[y] = Viec[y] - W;

Lặp lại cho đến khi tìm được đường mở.

Xuất W;

3.5 Chương trình cài đặt:

- Nhập dữ liẹu từ file văn bản Input.inp

o Dòng 1 ghi hai chỉ số m, n tương ứng là số thợ và số việc

o Dòng tiếp theo, mỗi dòng ghi ba số i, j, c[i, j] thể hiện thợ i làm việc j và

chi phí c[i, j] để làm công việc đó.



Input.inp



Output.out



5



6



Tho[1] - Viec[1]



0



1



1



Tho[2] - Viec[4]



3



0



1



2



0



Tho[3] - Viec[2]



2



2



1



0



Tho[1] - Viec[1]



0



2



4



3



Trong So: 5



3



2



2



3



3



0



4



3



0



4



4



7



5



4



12



-



Dạng đồ thị như sau:



-



Chương trình cài đặt:



program GhepCapCucDai

User Crt;

Const



input = 'input.inp';

output = 'output.out';

MaxN = 200; // tap cac nguoi tho

MaxM = 200; // tap cac cong viec



Var

C: array[1...max, 1... max] of Integer;

Tho: array[1...MaxN] of Integer;

Viec: array[1...MaxM] of Integer;

N, M of Integer;

xo, yo of Integer;

PathFound = Boolean;



/*Đọc dữ liệu đầu vào*/

procedure ReadInput;

Var f: text;

i, x: byte;

Begin

Fillchar(C, SizeOf(C), 0); /* trả về mảng với C[i] = 0 */

Assign (f, input);

reset (f);

Readln (f, N, M);

For (i = 1; i <= N; i++)

Begin

While (seekeoln(f) == '') /*Doc du lieu kieu so trong tap tin*/

do



Begin

Read (f, x);

C[i, x] = 1;

End;

Readln (f);



End;

Close(f);

End;



/*In tập tin kết quả*/

procedure WriteOut;

Var:

f: text;

i, CountCV: byte;

Begin

CountCV = 0;

For(i = 1; i <= M; i++)

if(Viec[i] > 0) then

Inc(CountCV);

Assign(f, output);

Rewrite(f);

Writeln(f, CountCV);

For(i = 1; i<=M; i++)

if(Viec[i] > 0) then

Writeln (f, {'Tho', } i, {'Viec', } i);

Close (f);

End;



/*Khoi tao*/

procedure Inc;

var x, y, y1 : byte;

Begin

y



= y0;



while (pred[y] <> x0)

do

Begin

x:= pred[y];

Tho[y] := x;

y1 = Viec[x];

Viec[x] = y;

y = y1;

end;

Viec[x0] = y;

Tho[y] = x0;

end;



/* Tìm đường đi*/

procedure TimDuongDi(x of byte);

var y: byte;

Begin

For (y = 1; y<= M; y++)

Begin

if (Pred[y] = 0 and (C[x, y] = 1)) then

Begin

pred[y] = x;

if (Tho[y] == 0) then

Begin

y0 = y;

PathFound = True;

exit,

End;

else

Begin

TimDuongDi(Tho[y]);

End;



End;

if (TimDuongDi == True) then

Exit;

End;

End;



/* Kiem tra*/

procedure Matching;

var Stop: boolean;

x, y of byte;

W of Integer;

Begin

FillChar(Tho, SizeOf(Tho), 0 );

FillChar(Viec, SizeOf(Viec), 0);

Stop = False;

while not (Stop) do

Begin

y = Tho[x];

TimDuongDi = False;

FillChar(Pred, SizeOf(pred),0);

For(x= 1; x<= N; x++)

if(Viec[x] == 0) then

Begin

x0 = x;

TimDuongDi(x);

if (TimDuongDi == True and c[x, y] < maxC) then

Begin

C[x, y] = Tho[x] - Viec[y];

W = W + C[x, y];

Break;

End;



End;

else

Stop = True;

End;

WriteLn (Tho[',x,'] - Viec[',y,'] , C[x, y] );

WriteLn ('Trong So: ', W);

End;

Begin

clrscr;

ReadInput;

Matching;

WriteOut;

End;



3.6 Giải bài toán (dùng thuật toán Hungary)

- Bươc 1:

o Khởi tạo M =

o Khởi tạo Fx, Fy

o Fx[i] = 0, Fy[j] = 0, c[i, j] – Fx[i] – Fx[j] 0

- Bước 2: Với mọi đỉnh x* X, ta tìm cách ghép x* như sau:

Bắt đầu từ đỉnh x* chưa ghép, tìm đường mở bắt đầu ở x* nếu:

o Tìm được đường:

 Loại bỏ những cạnh đã ghép khỏi M

 Thêm vào M những cạnh chưa ghép, ta được một bộ ghép mới

nhiều hơn bộ ghép cũ 1 cạnh và đỉnh x* được ghép.

o Không tìm được mở thì ta xác định hai tập:

 VisitedX = { tập những đỉnh X có thể đến được từ x* bằng một

đường pha}

 VisitedY = {tập những đỉnh Y có thể đến được từ x* bằng một

đường pha}

 Gọi Delta là trọng số nhỏ nhất của các cạnh nối giữa một đỉnh

thuộc VisitedX với một đỉnh không thuộc VisitedY. Nếu S = 0 thì

tồn tại một cạnh (x, y) với x VisitedX và y VisitedY.

Delta = min {c[i, j] – Fx[i] – Fy[j]}

 Với mọi x VisitedX: Fx[i] = Fx[i] + Delta;

 Với mọi y VisitedY: : Fy[j] = Fy[j] - Delta;

 Lặp lại cho đến khi tìm được đường mở.

- Bước 3: Sau bước 2 thì mọi đỉnh X đều được ghép  xuất kết quả về bộ ghép

tìm được  Dừng.



Chương 4

TỔNG KẾT, ĐÁNH GIÁ

Mặc dù vẫn còn nhiếu thiếu sót trong quá trình thực hiện báo cáo, qua bài cáo

giúp chúng ta nắm được cái khai niệm về lý thuyết đồ thị, khái niệm đồ thị,…..

Bái báo cáo cũng cho chúng ta nắm được bài toán ghép cặp trong đồ thị, ứng

dụng của bài toán trong thực tế, cũng như các bước cài đặt bài toán bằng ngôn ngữ lập

trình Pascal.



TÀI LIỆU THAM KHẢO





Nguyễn Hữu Anh, Hàm giải tích một biến phức tạp, Trường ĐH KH TN, 2000.







J. P. Barthelemy, G. Cohen, A. Lobstien, Algorithmic Complexity and

Communication Problems, UCL Press, 1966.







Robert Sedgewick. Algorithms in Java: Parts 1-4, Addison Wesley, 2002.







Các bài giảng, giáo trình, tài liệu giảng dạy liên quan của các trường đại học, viện

đào tạo trên thế giới.







Giáo trình Lý thuyết đồ thị - Lê Minh Hoàng, Đại học sư phạm Hà Nội.







Cấu trúc dữ liệu Tác giả: Nguyễn Trung Trực Khoa CNTT, trường ĐHBK

TP.HCM







Giáo trình Cấu trúc dữ liệu 1 Tác giả: Trần Hạnh Nhi – Dương Anh Đức Khoa

CNTT, trường ĐHKHTN – ĐHQG TP.HCM







Cẩm nang thuật toán–cuốn 1–RobertSedgewich– Trần Đan Thư.







Lập trình =Thuật toán + CTDL, N.Wirth







Algorithms + Data Structures = Programs Tác giả: N.Wirth NXB: Prentice Hall,

1976







Data Structures and Algorithms Tác giả: Alfred V.Aho - John E.Hopcroft – Jeffrey

D.Ullman NXB: Addison-Wesley Publishing Company







Algorithms (Second Edition) Tác giả: Robert Sedgewick NXB: Addison-Wesley

Publishing Company







Data Structures and Program Design (Third Edition) Tác giả: Robert L.Kruse

NXB: Prentice Hall







AlgorithmComplexity&CommunicationProblems,

J.P.Barthélemy,G.Cohen&a.Lobstein,UCLPress, London1996.



Xem Thêm
Tải bản đầy đủ (.docx) (31 trang)

×