Xác định khả năng của đỉnh cho một cấu trúc rừng tăng trưởng

Một phần của tài liệu NGHIÊN cứu một số vấn đề của LÝTHUYẾT đồ THỊ ỨNG DỤNG TRONG GIẢIQUYẾT một số bài TOÁN THỰC tế (Trang 86)

trưởng

Gắn với mỗi cấu trúc rừng tăng trưởng là các luồng trên cung duy nhất và một tập hợp duy nhất các khả năng của đỉnh; trong phần này chúng ta sẽ mô tả các phương pháp hiệu quảđể xác định các thành phần này.

6.3.1. Xác định khả năng của đỉnh cho một cấu trúc rừng tăng trưởng trưởng

Gọi (F, L, U) là một cấu trúc rừng tăng trưởng của bài toán luồng trên mạng tổng quát. Rừng tăng trưởng F chứa một vài cây tăng trưởng. Chúng ta mô tả một phương pháp xác định các khả năng cho các đỉnh trong một cây tăng trưởng. Áp dụng phương pháp này lặp lại trên mọi cây tăng trưởng, chúng ta có thể đạt được khả năng của mọi đỉnh trong đồ thị. Xét cây tăng trưởng T {(∪ α , β)} có h là gốc của nó. Chúng ta muốn xác định các khả năng của đỉnh thỏa mãn điều kiện = 0 với mọi cung (i, j) trong cây tăng trưởng T {(

π

ij

c

∪ α, β)}. Trước tiên chúng ta gán khả năng của đỉnh h bằng với một tham số θ (giá trị này sẽ được tính toán sau). Chúng ta mở rộng ra các cung (i, j) trên cây sử dụng các chỉ số mạch và tính các khả năng của đỉnh khác bằng cách dùng phương trình π = c

ij

c ij - π(i) + µ πij (j) = 0. Quá trình duyệt qua các mạch đảm bảo rằng (xem phần 11.3) chúng ta đã

đánh giá được một trong các khả năng, π(i) hoặc π(j), vì thế chúng ta có thể tính

được khả năng còn lại dựa vào phương trình cij - π(i) + µijπ(j) = 0. Chúng ta chú ý rằng các khả năng của đỉnh được xác định theo phương pháp này sẽ là các hàm (tuyến tính) của θ . Kế đến chúng ta sử dụng phương trình cho cung thêm, cαβ -

π(α ) + µ παβ (β) = 0, để tính một giá trị số cho θ. Giá trị số này của θ cho phép chúng ta tính các giá trị số của tất cả các khả năng của đỉnh. Dưới đây là mô tả của thuật toán này.

KHOA CNTT –

ĐH KHTN

CHƯƠNG 6: LUỒNG TỔNG QUÁT

Thủ tục tính khả năng của đỉnh; begin π(h) := θ; j := thread(h); while j h ≠ do begin i := pred(j);

if (i, j) ∈ A then π(j) := (π(i) – cij)/µij; if (j, i) ∈ A then π(j) := µ πji (i) + cji;

j := thread(i);

end;

Với mỗi đỉnh i, gọi khả năng π(i), là một hàm của θ, được thể hiện bởi f(i) + g(i)θ với các hằng số f(i) và g(i);

Tính θ := (cαβ - f(α) + µαβf(β))/ (g(α) - µαβg(β));l

Thay thế giá trị này của θ vào biểu thức π(i) = f(i) + θg(i) để tính các khả năng của mỗi đỉnh i;

end;

Chúng ta minh họa thủ tục này bằng một ví dụ số. Hình vẽ 6.3(a) thể hiện một cây tăng trưởng và hình vẽ 6.3(b) biểu diễn các khả năng của đỉnh dưới dạng tham số θ. Sử dụng cung thêm (2, 3), ta tính được θ = -17. Thay thế giá trị θ này ta xác định được các giá trị của tất cả các khả năng của đỉnh như trên hình vẽ

6.3(c). Ta cũng chú ý rằng tất cả các cung trong cây tăng trưởng có các chi phí rút gọn bằng 0.

KHOA CNTT – ĐH KHTN i j ( c , ij ij) 1 2 3 4 5 1 2 3 4 5 i j 1 2 3 4 5 i j Root (10, 1) (5 , 2) (6 , 3) (8 , 3) (10, 2) (a) - 10 + -2. 5 + 0.5 - 22 + 3 -6. 25 + 0.25 f(i ) + g(i) f(j ) + g(j) (b) -17 -27 -11 -73 -10.5 (i) (j) (c) Hình 6-3 Minh họa tính toán các khả năng của đỉnh Tính đúng đắn của thủ tục này có được từđịnh nghĩa của các khả năng của

đỉnh [vectơ π phải thỏa mãn điều kiện = 0 với mọi cung (i, j) trong cây tăng trưởng T ∪ {( π ij c α, β)}. Thủ tục tính khả năng của đỉnh có độ phức tạp là O(n). 6.3.2. Xác định luồng cho một cấu trúc rừng tăng trưởng

Gọi (F, L, U) là một cấu trúc rừng tăng trưởng của bài toán luồng trên mạng tổng quát. Giả sử rằng đồ thị không có độ thông qua (uncapacitated), và vì thế, U = . Như trước đây, chúng ta mô tả một phương pháp xác định luồng cho một cây tăng trưởng: áp dụng phương pháp này vào từng cây tăng trưởng, chúng ta có thể

xác định luồng trên tất cả các cung của rừng tăng trưởng. Phương pháp tính luồng trên cung được thực hiện theo cách ngược lại của phương pháp chúng ta đã sử

dụng để tính các khả năng của đỉnh: thay vì bắt đầu tại đỉnh gốc và lan ra theo các cung trên cây, chúng ta bắt đầu tại đỉnh lá và đi hướng về phía gốc.

Phương pháp xác định luồng cho một cây tăng trưởng T ∪ {(α , β)} với gốc h được thực hiện như sau. Đầu tiên chúng ta định nghĩa độ mất cân bằng e(i) của mỗi đỉnh i bằng với b(i) và gán luồng trên các cung bằng 0. Rồi chúng ta đặt

KHOA CNTT –

ĐH KHTN

CHƯƠNG 6: LUỒNG TỔNG QUÁT

luồng trên cung thêm (α , β) bằng θ. Lượng luồng này làm giảm θ đơn vị của độ

mất cân bằng tại đỉnh α và làm tăng độ mất cân bằng tại đỉnh β một lượng µαβ θ

đơn vị. Kếđến chúng ta xác định tất cả các luồng như là hàm của θ; rồi chúng ta xác định giá trị số của θ, và thay thế giá trị này vào các luồng, ta xác định được giá trị của tất cả các luồng trên cung.

Hãy xét một đỉnh lá j trên cây T. Có chính xác một cung trên cây (một cung trong T) gắn với đỉnh j: nó là cung (j, i) hoặc cung (i, j). Vì vậy, chúng ta chỉ có một cách duy nhất để hủy bỏđộ mất cân bằng của đỉnh j, qua cung (j, i) hoặc cung (i, j). Nếu cung (j, i) gắn với đỉnh j, ta gửi e(j) đơn vị luồng từ đỉnh j đến đỉnh i, làm giảm độ mất cân bằng của đỉnh j thành 0, gán luồng trên cung (j, i) bằng với e(j), và thay đổi độ mất cân bằng của đỉnh i thành e(i) + e(j)µji [vì e(j)µji đơn vị

luồng đến đỉnh i]. Chúng ta minh họa trường hợp này trong hình vẽ 6.4(a). Nếu cung (i, j) gắn với đỉnh j, ta cần gửi –e(j)/µij đơn vị luồng từ đỉnh i qua cung (i, j)

để làm –e(j) đơn vị có giá trị tại đỉnh j, vì thế hủy đi độ vượt quá. Chúng ta minh họa khả năng này trong hình vẽ 6.4(b). Trong trường hợp này chúng ta thay đổi độ

mất cân bằng của đỉnh i thành e(i) – e(j)/µij và gán luồng trên cung (i, j) bằng – e(j)/µij. Khi chúng ta đã xác định được giá trị luồng trên cung (i, j) hoặc (j, i), bất cứ cung nào có trên đồ thị, chúng ta xóa cung đó đi và lặp lại thủ tục này trên phần còn lại của cây. Cuối cùng, chúng ta chỉ còn đỉnh gốc h với độ mất cân bằng e(h).

Hình 6-4 Tính luồng trên các cung thuộc cây

Tại thời điểm này, luồng trên mỗi cung trong cây tăng trưởng T {(∪ α , β)} là một hàm tuyến tính của θ và luồng thỏa mãn các ràng buộc về

KHOA CNTT –

ĐH KHTN

e(h) (cũng là một hàm tuyến tính của θ). Bằng cách gán e(h) = 0, chúng ta tính θ

và xác định các giá trị số của luồng trên các cung của cây tăng trưởng. Sau đây chúng ta sẽ mô tả thủ tục này. Chúng ta áp dụng thủ tục này vào mọi cây tăng

trưởng, bắt đầu từ các khởi tạo sau: e(i) = b(i) với ∀i ∈ N và xij = 0 với (i, j) ∈ A. ∀ procedure tính luồng; begin gán xαβ := θ, e(α ) := e(α) - θ, và e(β) := e(β) + µ θαβ ; T’ := T; while T’ ≠ {h} do begin chọn một đỉnh lá j trong T’; i := pred(j);

if (j, i) ∈ T’ then gán xji := e(j) và cộng –e(j)µji vào e(i);

if (i, j) ∈ T’ then gán xij := -e(j)/µij và cộng e(j)/µij vào e(i);

xóa đỉnh j và cung gắn với nó khỏi T’;

end;

Với mỗi cung (i, j) trong cây tăng trưởng, ta thể hiện xij bởi f(i, j) + θg(i, j);

để e(h) được thể hiện bởi f(h) + θg(h);

Tính θ := -f(h)/g(h) và sử dụng giá trị này của θ để tính giá trị số của tất cả

các luồng trên cung;

end;

Dễ thấy rằng thủ tục này xác định luồng duy nhất trên các cung của cây tăng trưởng bởi vì bằng cách duyệt qua các cung của cây ta xác định duy nhất các luồng trên cây như một hàm của θ, và các ràng buộc về cân bằng khối lượng của

đỉnh gốc h cho duy nhất một giá trị số của θ.

Chúng ta minh họa thủ tục này bằng cách sử dụng ví dụ số trên hình vẽ

KHOA CNTT –

ĐH KHTN

CHƯƠNG 6: LUỒNG TỔNG QUÁT

lượng luồng θ trên cung thêm (2, 3). Ta khảo sát các đỉnh của cây theo thứ tự 4, 5, 2, 3, và tính luồng trên các cung gắn với các đỉnh này. Hình vẽ 6.5(b) biểu diễn các luồng trên cung và các khả năng của đỉnh tại thời điểm này. Bây giờ, đỉnh 1 có độ

mất cân bằng là 25 – 0.5θ, và cho giá trị này bằng 0, ta tìm được θ = 50. Sử dụng giá trị này của θ, ta tính được các giá trị số của tất cả các luồng trên cung, như trên hình vẽ 6.5(c).

Hình 6-5 Minh họa quá trình tính luồng cho 1 cây tăng trưởng

Để kết thúc việc chứng minh rằng thủ tục tính luồng tìm đúng các luồng trên cung, chúng ta cần chỉ ra rằng g(h) không bao giờ bằng 0; ngược lại, chúng ta không thể tính θ bằng cách sử dụng phương trình θ = -f(h)/g(h). Dễ dàng để thấy rằng θg(h) là độ mất cân bằng tại đỉnh h có được từ việc gán luồng trên cung thêm (α, β) bằng giá trị θ. Gán luồng trên cung (α, β) bằng θ tạo ra một độ thiếu hụt -θ đơn vị tại đỉnh α và một độ dư thừa µαβ θ đơn vị tại đỉnh β. Gọi là đường

đi trên cây từđỉnh h đến đỉnh

α

P

α và Pβ là đường đi trên cây từđỉnh β đến đỉnh h; cũng như vậy, ta định nghĩa µ( ) là số nhân của đường đi . Chúng ta có thể

hủy độ thiếu hụt tại đỉnh

α

P Pα

α bằng cách gửi θ/µ(Pα) từđỉnh h đến đỉnh α . Tương tự, khi chúng ta gửi một độ vượt quá µαβ đơn vị từđỉnh β đến đỉnh h trên đường

đi Pβ, µαβ θ µ(Pβ) đơn vịđến được đỉnh h. Những quan sát này cho ta:

g(h) = µαβ µ(Pβ) – 1/µ(Pα).

KHOA CNTT –

ĐH KHTN

0 khi và chỉ khi chu trình thêm là một chu trình cân bằng. Vì cây tăng trưởng là tốt, chu trình thêm vào không là một chu trình cân bằng và g(h) là khác 0.

Chúng ta đã xét các đồ thị không có độ thông qua, nghĩa là chúng ta giả sử

rằng µij = với (i, j) ∈ A. Kết quả là, tập hợp U rỗng. Nếu đồ thị có độ thông qua và tập U khác rỗng thì chúng ta cần thay đổi một chút trong thủ tục tính luồng. Trong trường hợp không có độ thông qua, chúng ta bắt đầu với x

∞ ∀

ij = 0 với (i, j) A và e(i) = b(i) với i N. Trong trường hợp có độ thông qua, chúng ta bắt

đầu với cùng các giá trị của x ∀ ∈ ∀ ∈ ij và e(i) và thực hiện vòng lặp sau: for mọi (i, j) ∈ U do begin xij := uij; e(i) := e(i) – uij; e(j) := e(j) + µijuij; end;

Mục đích của vòng lặp này là để gán luồng trên mỗi cung (i, j) ∈ U bằng với giới hạn trên của nó, điều đó tạo ra một độ thiếu hụt uijđơn vị tại đỉnh i và một

độ vượt quá µijuijđơn vị tại đỉnh j. Sau khi thực hiện quá trình khởi tạo này, chúng ta tiếp tục thực hiện thủ tục tính luồng nhưđã mô tả trước đây.

Thủ tục tính luồng cho ta một phương pháp xác định một luồng thỏa mãn các ràng buộc cung/cầu của tất cả các đỉnh trong một cây tăng trưởng. Áp dụng thủ

tục này vào mỗi cây tăng trưởng, ta đạt được một luồng thỏa mãn ràng buộc cung/cầu của tất cả các đỉnh. Chú ý rằng chúng ta đã tính các luồng trên cung bằng cách áp dụng thủ tục cập nhật luồng và sử dụng dữ kiện luồng thỏa mãn các ràng buộc vsề cân bằng khối lượng. Chúng ta đã nhận xét trước đây rằng luồng trên các cung trong rừng tăng trưởng thỏa mãn các ràng buộc về cân bằng khối lượng là duy nhất và thủ tục tính luồng xác định một lời giải duy nhất. Luồng này có thể

thỏa mãn các giới hạn luồng hoặc không. Nếu nó thỏa mãn, cấu trúc rừng tăng trưởng là khả thi; ngược lại là không khả thi. Rõ ràng, thời gian chạy của thủ tục tính luồng là O(m).

KHOA CNTT –

ĐH KHTN

CHƯƠNG 6: LUỒNG TỔNG QUÁT

6.4. Tóm tắt chương 6

Bài toán luồng tổng quát là bài toán tổng quát của bài toán luồng với chi phí cực tiểu theo nghĩa các cung không bảo toàn luồng. Trong chương này chúng tôi

đã trình bày chi tiết thuật toán đơn hình mạng tổng quát để giải quyết bài toán luồng tổng quát.

KHOA CNTT –

ĐH KHTN

CHƯƠNG 7 : XÂY DNG NG DNG

DISTRIBUTION

7.1. Yêu cầu thực tế và lý do xây dựng ứng dụng

Ngày nay, khi đời sống của người dân ngày càng được nâng cao, nhu cầu tiêu dùng cũng ngày một lớn theo. Các cửa hàng, đại lý mọc lên khắp nơi để đáp

ứng nhu cầu tiêu dùng của khách hàng. Là một Thành phố lớn nhất nước, Thành phố Hồ Chí Minh cũng là nơi tiêu thụ hàng hóa nhiều nhất. Các nhà phân phối, sản xuất có hàng trăm đại lý bán lẻ nằm rải rác trong Thành phố. Điều này tạo ra rất nhiều khó khăn trong việc quản lý. Hàng ngày, hàng tuần các nhà phân phối nhận thông tin yêu cầu từ các đại lý của mình để lập ra các kế hoạch giao hàng chi tiết. Công việc này thường được thực hiện một cách khá thủ công và mất nhiều thời gian. Nó phụ thuộc nhiều vào kinh nghiệm của người quản lý. Trong điều kiện như

vậy, một chương trình hỗ trợ việc lập phương án vận chuyển hàng hóa hiệu quả từ

nhà sản xuất đến các đại lý là rất cần thiết. Một phương pháp vận chuyển hàng hóa hợp lý sẽ tiết kiệm đáng kể chi phí cho doanh nghiệp.

7.2. Mục tiêu của ứng dụng

Mục tiêu của ứng dụng Distribution là xây dựng một phương pháp vận chuyển hàng hóa hàng ngày đến các đại lý cho một cho một nhà sản xuất cụ thể, ở đây là một công ty nước uống đóng chai. Thông tin về vị trí, nhu cầu của các đại lý cũng như số phương tiện, chi phí vận chuyển của từng phương tiện của nhà sản xuất đều được xác định trước. Ứng dụng cần xây dựng được một lịch giao hàng cho từng phương tiện đến các đại lý mà nó cần giao hàng trong ngày. Mỗi phương tiện sẽ đi theo một tuyến đường định trước sao cho tổng chi phí của các phương tiện là thấp nhất. Tuyến các đại lý này sẽ được in ra và giao cho các tài xế tương

ứng. Đồng thời chương trình cũng cần có chức năng thể hiện cụ thểđường đi của các phương tiện trên bản đồđể việc theo dõi được trực quan hơn.

KHOA CNTT –

ĐH KHTN

CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION

7.3. Tiếp cận bài toán

7.3.1. Phát biểu bài toán

Công ty nước uống đóng chai AQ có một nhà cung cấp chính và một mạng lưới gồm n đại lý. Mỗi ngày, các đại lý sẽ gửi số lượng hàng d (nhu cầu) cần được nhà cung cấp giao cho vào ngày hôm sau.

Nhà cung cấp có một đội xe L chiếc gồm l loại xe. Tương ứng với mỗi xe có :

• khả năng vận tải: v

• chi phí cho một đơn vịđường đi[tính theo mét(m)]: c

Với tuyến các đại lý cho trước, nhà cung cấp mong muốn xây dựng một lịch giao hàng trong ngày nhằm thỏa mãn nhu cầu của tất cả các đại lý sao cho tổng chi phí chuyên chở là nhỏ nhất.

7.3.2. Mô hình toán học

Xuất phát từ nhà cung cấp, mỗi xe phải qua một số đại lý rồi quay về. Ta gọi các đại lý lần lượt là T0, T1, …, Tn (nhà cung cấp chính là T0). Ta có thể thiết lập tương ứng 1-1 giữa hành trình T0 → Ti1 → Ti2 → … → Tin → T0 với một tổ hợp π = (i1, i2, …, im) của n số tự nhiên 1, 2, …, n (m ≤ n). Đặt fk(π) = ik k i i k i i k i c cn n cn c0 0 1 2 1 1 + +...+ + − với là chi phí ck ủa xe k đi từđại lý iđến đại lý j. ij c Gọi P là tập hợp tất cả các tổ hợp π = (i1, i2, …, im) của n số tự nhiên 1, 2, …, n (m n). ≤

Khi đó bài toán có thểđược phát biểu như sau: Cực tiểu hóa: ∑ f = L k 1 k(π) π ∈ P thỏa mãn các điều kiện:

KHOA CNTT – ĐH KHTN dk(π) ≤ vk , ∀k = 1,L, với dk(π) = di +di +...+din 2 1 π1 ∪ π2 … ∪ ∪ πL = {1, 2, …, n} , với πi là tập hợp các đại lý mà xe i đi qua. 7.3.3. Nhận xét

Chúng ta có thể nhận thấy rằng bài toán trên chính là dạng tổng quát của bài

Một phần của tài liệu NGHIÊN cứu một số vấn đề của LÝTHUYẾT đồ THỊ ỨNG DỤNG TRONG GIẢIQUYẾT một số bài TOÁN THỰC tế (Trang 86)