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.