Thuật toán Primal-Dual

Một phần của tài liệu Bài toán luồng cực đại với chi phí cực tiểu và ứng dụng trong vận chuyển hàng cứu trợ bão lũ (Trang 40 - 43)

6. Bố cục của đề tài

2.4.3.Thuật toán Primal-Dual

2.4.3.1. Tư tưởng thuật toán

Tư tưởng thuật toán: Thuật toán Primal-Dual cho bài toán luồng với chi phí cực

b. Đồ thị sau khi cập nhật

các khả năng c. Đồ thị sau khi tăng 2 đơn vị luồng theo đường 1-3-4

b. Đồ thị sau khi cập nhật

tiểu cũng giống như thuật toán đường đi ngắn nhất liên tiếp ở khía cạnh nó cũng duy trì một luồng giả thỏa mãn các điều kiện tối ưu về chi phí rút gọn và từ từ biến đổi nó thành một luồng bằng cách tăng luồng theo các đường đi ngắn nhất. Nhưng nó khác ở chỗ thay vì tăng luồng dọc theo một đường đi ngắn nhất tại một thời điểm, nó giải bài toán luồng cực đại để tăng luồng theo tất cả các đường đi ngắn nhất.

2.4.3.2. Mô tả thuật toán

Thuật toán Primal-Dual biến đổi bài toán luồng với chi phí cực tiểu thành một bài toán có một đỉnh vượt quá đơn và một đỉnh thiết hụt đơn. Chúng ta biến đổi bài toán thành dạng này bằng cách đưa vào một đỉnh nguồn s và một đỉnh đích t. Với mỗi đỉnh

i có bi > 0, chúng ta thêm cung (s, i) có chi phí bằng 0 và độ thông qua bi, và với mỗi

đỉnh i có bi < 0, chúng ta thêm cung (i, t) có chi phí bằng 0 và độ thông qua –bi. Cuối

cùng chúng ta đặt: { ,i 0} s i i V b b b     bt = -bs bi =0 với  i V

Dễ thấy rằng một luồng có chi phí cực tiểu trong đồ thị biến đổi cho ta một luồng với chi phí cực tiểu trong đồ thị gốc. Để đơn giản hóa các ký hiệu, chúng ta biểu diễn đồ thị biến đổi là G = (V, A) giống như biểu diễn đồ thị gốc.

Thuật toán Primal-Dual giải bài toán luồng cực đại trên một đồ thị con của đồ thị

thặng dư G(f), được gọi là đồ thị có thể chấp nhận, biểu diễn là G0(f). Chúng ta định

nghĩa một đồ thị có thể chấp nhận G0(f) đối với một luồng giả f thỏa mãn các điều kiện

tối ưu về chi phí rút gọn với khả năng  , đồ thị có thể chấp nhận chỉ chứa các cung

có chi phí rút gọn bằng 0 trong G(f). Khả năng thông qua thặng dư của một cung trong

G0

(f)bằng với trong G(f). Ta nhận thấy rằng mọi đường đi có hướng từ đỉnh s đến đỉnh

t trong G0(f) là đường đi ngắn nhất giữa 2 đỉnh đó trong G(f).

2.4.3.3. Các bước thực hiện thuật toán

Giả code:

begin

x: = 0 và  : = 0; es:= bs và et:= bt;

while es > 0 do begin

đỉnh khác trong G(x) với chi phí rút gọn pij ;

Cập nhật  : =  - d;

Định nghĩa đồ thị có thể chấp nhận G0

(f);

Tìm luồng cực đại từ đỉnh s đến đỉnh t trong G0(f);

Cập nhật es, et, và G(f); (adsbygoogle = window.adsbygoogle || []).push({});

end; end;

Ví dụ minh họa:

pịj,cij

a. Đồ thị mẫu b. Đồ thị biến đổi

c. Đồ thị thặng dư sau khi cập nhật các khả năng của đỉnh

Hình 2.4. Minh họa thuật toán Primal-dual 2.4.3.4. Độ phức tạp thuật toán

Thuật toán Primal-Dual đảm bảo rằng độ vượt quá của đỉnh s giảm sau mỗi vòng lặp, và cũng chắc chắn rằng khả năng của đỉnh đích giảm khi chuyển từ vòng lặp này sang vòng lặp khác. Nhận xét thứ 2 có được từ việc khi chúng ta thiết lập một luồng

cực đại trong G0(f),đồ thị thặng dư G(f) không chứa đường đi có hướng nào từ đỉnh s

đến đỉnh t chỉ gồm các cung có chi phí rút gọn bằng 0. Do đó, trong vòng lặp kế tiếp

khi chúng ta giải bài toán đường đi ngắn nhất dt  1. Các quan sát này cho chúng ta

một giới hạn min{nC, nP} đối với số vòng lặp vì ban đầu es  nC, và không có giá trị

khả năng của đỉnh nào có thể hạ thấp hơn -nP.

Giới hạn về số vòng lặp này tốt hơn của thuật toán tìm đường đi ngắn nhất liên tiếp, nhưng thuật toán phải chịu chi phí cho việc giải bài toán luồng cực đại ở mỗi vòng lặp. Nếu S(n, m, P) và M(n, m, P) là thời gian giải bài toán đường đi ngắn nhất và luồng cực đại thì thuật toán Primal-Dual có độ phức tạp tổng cộng là O(min{nC, nP} { S(n, m, P) + M(n, m, P)}).

Một phần của tài liệu Bài toán luồng cực đại với chi phí cực tiểu và ứng dụng trong vận chuyển hàng cứu trợ bão lũ (Trang 40 - 43)