Thuật toán Hung-ga-ri

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế (Trang 40 - 44)

Bước 1: Khởi tạo:

Một bộ ghép M:= 

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

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ị. Có 2 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, ta được một bộ ghép mới nhiều hơn bộ ghép cũ 1 cạnh và đỉnh x* thành đỉnh đã ghép.

 Hoặc không tìm thấy đường mở thì có 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}

Gọi ∆ 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. Dễ thấy ∆> 0 bởi nếu ∆= 0 thì tồn tại một 0_cạnh (x, y) với x∈VisitedX và y∉VisitedY. Vì x* đến được x bằng một đường pha và (x, y) là một 0_cạnh nên x* cũng đến được y bằng một đường pha, dẫn tới y ∈VisitedY, điều này vô lý.

Biến đổi đồ thị G như sau: Với ∀x ∈VisitedX, trừ ∆ vào trọng số những cạnh liên thuộc với x, Với ∀y ∈VisitedY, cộng ∆ vào trọng số những cạnh liên thuộc với y.

x* cho tới khi tìm ra đường mở.

Bước 3:Sau bước 2 thì mọi X_đỉnh đều được ghép, in kết quảvề bộ ghép tìm được.

Mô hình cài đặt của thuật toán có thể viết như sau: <Khởi tạo: M := ∅...>;

for (x*∈X) do begin

repeat

<Tìm đường mở xuất phát ở x*>;

if <Không tìm thấy đường mở> then <Biến đổi đồ thị G: Chọn ∆:= ...>; until <Tìm thấy đường mở>;

<Dọc theo đường mở, 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>;

end;

<Kết quả>; Ví dụ minh hoạ:

Để không bị rối hình, ta hiểu những cạnh không ghi trọng số là những 0_cạnh, những cạnh không vẽ mang trọng số rất lớn trong trường hợp này không cần thiết phải tính đến. Những cạnh nét đậm là những cạnh đã ghép, những cạnh nét thanh là những cạnh chưa ghép.

x * = X1 Tìm được đường mở: X1 →Y1 Tăng cặp x*= X2 Tìm được đường mở: X2 →Y1 →X1 →Y2 Tăng cặp x*= X3 Tìm được đường mở: X3 →Y3 Tăng cặp

x*= X4

Không tìm được đường mở: Tập những X_đỉnh đến được từ X4 bằng một đường pha: {X3, X4} Tập những Y_đỉnh đến được từ X4 bằng một đường pha: {Y3} Giá trị xoay ∆= 1 (Cạnh X3- Y2) Trừ tất cả trọng số những cạnh liên thuộc với {X3,X4} đi 1 Cộng tất cả trọng số những

cạnh liên thuộc với Y3 lên 1 x*= X4

Vẫn không tìm được đường mở: Tập những X_đỉnh đến được từ X4 bằng một đường pha: {X1, X2, X3, X4} Tập những Y_đỉnh đến được từ X4 bằng một đường pha: {Y1, Y2, Y3}

Giá trị xoay ∆= 2 (Cạnh X2- Y4)

Trừ tất cả trọng số những cạnh liên thuộc với {X1, X2, X3, X4} đi 2

Cộng tất cả trọng số những cạnh liên thuộc với {Y1, Y2, Y3} lên 2

x*= X4 Tìm được đường mở: X4 →Y3 →X3 →Y2 →X1 →Y1 →X2 →Y4 Tăng cặp Xong

Để ý rằng nếu như không tìm thấy đường mở xuất phát ở x* thì quá trình tìm kiếm trên đồ thị sẽ cho ta một cây pha gốc x*. Giá trị xoay ∆ thực chất là 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ạnh ngoài). Việc trừ ∆ vào những cạnh liên thuộc với X_đỉnh trong cây pha và cộng ∆ vào những cạnh liên thuộc với Y_đỉnh trong cây pha sẽ làm cho cạnh ngoài nói trên trở thành 0_cạnh, các cạnh khác vẫn có trọng số ≥0. Nhưng quan trọng hơn là tất cả những cạnh trong cây pha vẫn cứ là 0_cạnh. Điều đó đảm bảo cho quá trình tìm kiếm trên đồ thị lần sau sẽ xây dựng được cây pha mới lớn hơn cây pha cũ(Thể hiện ở chỗ: tập Visited Y sẽ rộng hơn trước ít nhất 1 phần tử). Vì tập các Y_ đỉnh đã ghép là hữu hạn nên sau không quá k bước, sẽ có một Y_đỉnh chưa ghép ∈VisitedY, tức là tìm ra đường mở

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế (Trang 40 - 44)

Tải bản đầy đủ (PDF)

(80 trang)