Cặp ghép trong lập trình pascal - Pdf 16

Cặp Ghép
Lê Văn Chương
Định nghĩa cặp ghép
Xét hai tập hữu hạn X, Y gồm n phần tử:
X= {x
1
, x
2
,...,x
n
}
Y= {y
1
, y
2
,...,y
n
}
Cặp phần tử (x,y) với x thuộc X, y thuộc Y được gọi là một cặpghép. Hai cặp ghép (x,y) và
(x', ý) được gọi là rời nhau nếu x # x' và y # ý.Tập M gồm các cặp ghép rời nhau được gọi
là một tập cặp ghép.
{ Thông thường bài toánxây dựng các cặp ghép được tiếp cận theo 2 hướng hoặc thỏa mãn
một điều kiệnghép cặp nào đấy, khi đó người ta quan tâm đến khả năng ghép cặp tối đa,
hoặclượng hoá việc ghép cặp, khi đó người ta quan tâm đến phương án ghép cặp tối
ưutheo các giá trị đã lượng hoá. }
Vì số tập cặp ghép là hữu hạn, nên một phương pháp xây dựngđơn giản là thử tất cả các
khả năng. Tuy nhiên, số khả năng như vậy là rất lớn.Vì thế, phải tìm kiếm những thuật giải
thật hữu hiệu, dễ cài đặt chương trìnhvà có tính khả thi cao.
Bài toán tìm cặp ghép đầy đủtối ưu
a. Giới thiệu bài toán:Bài toán tìm cặp ghép đầy đủ tối ưu có nhiều mô hình ứng dụng thực
tế.Một trong những mô hình này là người ta quan tâm đến việc ghép cặp sao cho cóhiệu

j
)>=C
ij
với mọix
i
thuộc X,y
j
thuộc Y.Tập cặp ghép M và
nhãn F được gọi là tương thích với nhau nếu thoả mãn đẳngthức F(x
i
)+F(y
j
)=C
ij
với mọi x
i
thuộc X, y
j
thuộc Y.Nói riêng, tập cặp ghép rỗng được xem như tương thích với mọi nhãn.
Định lý:Tập cặp ghép đầy đủ M là tối ưu khi tồntại nhãn F chấp nhận được là tương thích
với nó.
c. Thuật toán Kuhn-Munkres: Nội dung chủ yếu của phương pháp là xuất phát từ một tập
cặp ghépnào đó chưa đầy đủ (có thể là rỗng), ta tăng dần số cặp ghép sao cho khi trởthành
đầy đủ, các cặp ghép thu được cũng đồng thời thoả mãn tính tối ưu. Cónhiều hình thức
trình bày phương pháp này. Dưới đây là cách trình bày trên ngônngữ đồ thị kèm với việc
dùng thuật toán tìm đường đi.
Giả sử F là một nhãn chấp nhận được và M là tập cặp ghép tươngthích với F. Xem các
phần tử của X và Y như những đỉnh của một đồ thị có hướnghai phía. Các cạnh của đồ thị
này được xác định tuỳ thuộc nội dung của nhãn Fvà tập cặp ghép M như sau:
- Mỗi cặp phầntử x

j
):=0 y
j
thuộc Y
M là tập cặp ghép rỗng.
Bước 2. Tìm đỉnh tự do thuộc X:
Tìm đỉnh u thuộc Xchưa được ghép cặp. Nếu không còn đỉnh nào của X chưa ghép cặp thì
kết thúc:tập cặp ghép M hiện hành là tập cặp ghép đầy đủ tối ưu. Trái lại sang bước kếtiếp.
Bước 3. Tìm đường tăng cặp ghép:
Xuất phát từ u, thực hiện việctìm kiếm trên đồ thị G(F, M). Kết quả tìm kiếm có hai trường
hợp:
- Nếu đến đượcmột đỉnh z thuộcY chưa ghép cặp thì ghi nhận đường đi từ u đến z và
chuyển sang bước tăng cặpghép trên đường đi này.
- Nếu không tồntại một đường đi như vậy thì chuyển sang bước sửa nhãn F.
Bước4. Tăng cặp ghép: điều chỉnh M như sau:
- Giữ nguyênnhững cặp ghép của M nằm ngoài đường tăng cặp ghép.
- Trên đườngtăng cặp ghép, bỏ đi những cặp ghép của M là cạnh ngược và thêm vào M
những cặpghép là cạnh thuận.
Sau bước này,số cặp ghép thuộc M được tăng thêm 1 và đỉnh u được bảo toàn. Sau đó
quay vềbước 2 để lặp lại vởi đỉnh tự do khác.
Bước5. Sửa nhãn:
Gọi S là tậpcác đỉnh thuộc X và T là tập các đỉnh thuộc Y đã được đi đến trong quá
trìnhtìm kiếm ở bước 3.
Việc sửa nhãn Fđược tiến hành như sau:
- Tìm lượng sửanhãn:
d:= min{F(x
i
) + F(y
j
)- C

j
) = C
ij
, vì thế, sau
một số lần sửa nhãn chắc chắnsẽ tăng được cặp ghép.
Dưới đây là sơ đồ khối mô tả các bướcthực hiện trên:
Các bạn có thể tham khảo thuật toán này quachương trình.
Chươngtrình:
Program Capghep;
Const Fi='capghep.Inp';
MaxN=100;
Var f:Text;
Total,n,i,j,u,Path:Integer;
A,B,Cg:Array[1..MaxN]Of 0..MaxInt;
Tr,Q:Array[1..2*MaxN]Of 0..2*MaxN;
S,T: Array[1..MaxN] Of 0..1;
Yetx,Yety:Array[1..MaxN]Of Boolean;
C:Array[1..MaxN,1..MaxN]Of 0..MaxInt;
Procedure ReadF;
Begin
Assign(f,Fi);
Reset(f);
Readln(f,n);
For i:=1 to n do
For j:=1 to n do Read(f,C[i,j]);
Close(f);
End;
ProcedureFindPath(u:Integer);
Var dq,cq,v:Integer;
Begin


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status