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 toán người du lịch (TSP). Một phương tiện xuất phát từ nhà cung cấp sẽ đi qua một số đại lý và quay trở về nhà cung cấp. Chúng ta cần xác định đường đi qua nhóm các đại lý sao cho tổng chi phí là nhỏ nhất. Ngoài ra, chúng ta còn phải xác
định phương tiện nào qua nhóm các đại lý nào sao cho tổng chi phí của tất cả các phương tiện là nhỏ nhất. Qua đó ta thấy rằng bài toán của chúng ta thuộc vào lớp bài toán NP-đầy đủ. Các bài toán thuộc vào lớp này thường không có thuật toán tối
ưu để giải vì thế ta cần hướng tới việc sử dụng một phương pháp gần đúng để giải chúng. Trên thực tế, bài toán người du lịch cũng chưa có một thuật toán hiệu quả. Người ta thường sử dụng thuật toán nhánh cận để giải bài toán này. Tuy nhiên, phương pháp này chỉ hiệu quả đối với một số lượng đỉnh duyệt nhỏ và trong một số trường hợp thuật toán này trở thành duyệt toàn bộ. Những điểm bất lợi trên khiến ta phải nghĩđến một lời giải gần đúng khác cho bài toán giao hàng, bài toán tổng quát của bài toán người du lịch vì một nhà cung cấp thường có đến hàng trăm
đại lý bán lẻ, và yêu cầu về thời gian tìm ra phương án giao hàng phải nhanh chóng trong mọi trường hợp. Một số phương pháp giải quyết bài toán người du lịch khác cũng rất khó có thể áp dụng trong bài toán này vì bên cạnh việc xác định nhóm các
đại lý cho một phương tiện ta còn phải phân hoạch tập các đại lý ra thành các tập con phụ thuộc vào khả năng chuyên chở của từng phương tiện.
7.3.4. Hướng tiếp cận của luận văn
Trong luận văn này, chúng em muốn hướng đến một cách tiếp cận khác, sử
dụng các thuật toán luồng trên mạng, để giải bài toán giao hàng, bài toán tổng quát của bài toán người du lịch. Với cách tiếp cận này, chúng em muốn rút ngắn thời gian thực hiện việc tìm kiếm một phương án hiệu quả cho việc giao hàng đến các
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
cầu của bài toán. Những rút gọn này là cần thiết để có thể chuyển bài toán về dạng bài toán luồng trên mạng nhưng cũng làm cho các lời giải nhận được chỉ là các lời giải tốt chứ không hẳn là lời giải tối ưu, điều này là phù hợp trong điều kiện tìm lời giải tối ưu sẽ tốn một chi phí rất lớn.
Sau đây ta sẽ rút gọn lại yêu cầu của bài toán cũng như thêm một số điều kiện để bài toán trở nên sát với thực tế hơn và đưa bài toán về dạng đồ thị để có thể
áp dụng các thuật toán luồng trên mạng.
7.3.4.1. Một số yêu cầu rút gọn
Trước hết ta thu gọn lại yêu cầu của bài toán là đường đi của một phương tiện chỉđược tính là đường đi từ nhà phân phối đến các đại lý chứ không tính
đường đi từđại lý cuối cùng trở về nhà cung cấp như trong bài toán người du lịch.
Điều kiện này thường không làm ảnh hưởng nhiều đến kết quả của bài toán. Trong mô hình toán học thì đường đi này được biểu diễn như sau:
T0 → Ti1 → Ti2 → … → Tin
Ta cũng thêm vào một giả thiết là nhà phân phối có đủ xe đểđi đến tất cả
các đại lý sao cho mỗi đại lý chỉ cần được giao hàng đúng một lần. Điều này cũng phù hợp với điều kiện thực tế là công ty có xe đủ lớn, đủ nhiều để không phải buộc các đại lý ký nhận hàng nhiều lần trong ngày để có được số lượng hàng họ cần.
KHOA CNTT –
ĐH KHTN
7.3.4.2. Mô hình bài toán
Trước tiên ta mô hình lại bài toán như sau:
1 3 2 4 5 0 6
Nhà cung cấp Phương tiện Đại lý Đỉnh ảo i ) , 0 (lij = uij =k i (lij =0,uij =max) j i (lij =0,uij =v) 6 i (lij =0,uij =max) j
Hình 7-1 Mô hình bài toán phân phối hàng
Trong đồ thị trên, k là khả năng vận tải của phương tiện, v là nhu cầu của
đại lý và max là một sốđủ lớn để tổng của các luồng qua cung luôn nhỏ hơn max.
Đỉnh ảo được thêm vào trong mô hình với ý nghĩa: một phương tiện đi cung cấp hàng cho đại lý sẽ có luồng từđại lý đến đỉnh ảo. Độ dài các cung từ nhà cung cấp
đến đỉnh phương tiện và các cung từđại lý đến đỉnh ảo đều bằng 0.
Trong bài toán này, chi phí gửi luồng không giống như các bài toán khác trong lớp bài toán về luồng trên mạng. Luồng vận tải bắt đầu từ phương tiện nào thì chi phí trên quãng đường nó đi qua sẽ bằng C = c * d, trong đó c là chi phí trên một đơn vịđường đi và d là độ dài quãng đường, chi phí này không phụ thuộc vào lượng hàng mà phương tiện phải vận chuyển. Đồng thời, ở bài toán này, luồng đi ra từ 1 phương tiện qua các đại lý cũng không được tách ra, trừ khi luồng đó đi từ đại lý đến đỉnh ảo, vì tính bảo toàn của phương tiện (phương tiện không thể tách ra làm nhiều phần, mỗi phần đến một đại lý khác nhau được).
Chính vì hai lý do trên cùng với điều kiện của bài toán là mỗi phương tiện chỉ chở hàng đến một đại lý khi lượng hàng còn lại trên xe đủđể đáp ứng nhu cầu
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
của đại lý nên cách giải quyết bài toán này có một đặc thù riêng, không giống như
các bài toán luồng trên mạng khác. Sau đây sẽ là chi tiết của thuật toán.
7.3.4.3. Thuật toán
Chúng em đề xuất một thuật toán dựa trên thuật toán khử chu trình âm để
giải quyết bài toán giao hàng cho các đại lý như sau: như thuật toán khử chu trình âm, chúng ta sẽ tìm một luồng khả thi (các phương tiện đi đến các đại lý xác định), rồi sẽ từng bước cải thiện giá trị hàm mục tiêu của nó bằng cách khử đi các chu trình âm. Tuy nhiên đây là một bài toán có đặc thù riêng nên việc tìm kiếm một luồng khả thi cũng như khử các chu trình âm của nó cũng khác với bài toán thông thường.
Thuật toán tìm luồng khả thi thực chất là tìm đường đi cho các phương tiện
đến các đại lý mà nó có thể đáp ứng nhu cầu. Ở đây chúng ta thêm vào một phương án tìm đường để lời giải của luồng khả thi tốt hơn. Đó là chúng ta sẽ sử
dụng thuật toán tìm đường đi ngắn nhất để đi đến một đại lý gần nhất mà phương tiện có thểđáp ứng nhu cầu của nó. Ởđây, chúng ta sẽ sử dụng thuật toán Dijkstra cùng với một điều kiện là khi ta gán nhãn cốđịnh cho một đỉnh nào đó có nhu cầu mà phương tiện của chúng ta có thể đáp ứng được thì ta kết thúc thuật toán. Nếu không có đại lý nào mà phương tiện có thểđáp ứng được thì phương tiện sẽ trở về
nhà cung cấp. Chúng ta có hàm tìm đường đi ngắn nhất như sau:
Hàm Tìm đường đi ngắn nhất; begin S:= ∅; S:= N; d(i):= ∝ với tất cả các đỉnh i∈N; d(s):= 0 và pred(s):= 0; flag = true;
while (|S| < n) and (flag = true) do begin
đặt i∈Slà đỉnh mà d(i) = min{d(j): j∈S};
KHOA CNTT –
ĐH KHTN
S:= S∪{i};
S:= S - {i};
for mỗi (i, j) ∈ A(i) do
if d(j) > d(i) + cijthen d(j):= d(i) + cij và pred(j):=i;
end;
If (flag = false) then
Tìm đường đi ngắn nhất := i;
else
Tìm đường đi ngắn nhất := 0;
end;
Cũng như thuật toán Dijkstra, hàm tìm đường đi ngắn nhất trên chạy trong thời gian O(n2).
Gọi S là tập hợp các đỉnh đã được thỏa mãn nhu cầu (đã có phương tiện vận chuyển nước đến) và S là tập hợp các đỉnh mà nhu cầu chưa được thỏa mãn. Thủ
tục tìm luồng khả thi chi tiết được mô tả như sau:
Thủ tục Tìm luồng khả thi;
begin
S := ∅;
S := {i, i đại diện cho các đại lý có nhu cầu > 0}; N := |S |;
while |S| < N do begin
x := khả năng vận tải của phương tiện chưa được sử dụng và y := vị
trí của phương tiện đó;
while Tìm được đường đi ngắn nhất từ y đến một đại lý i mà x có thể đáp ứng nhu cầu v của nó do
begin
gửi v đơn vị luồng từđỉnh nguồn qua đỉnh x, đến i theo đường
đi ngắn nhất; y := i;
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
end; end;
end;
Với các ràng buộc điều kiện bài toán là công ty có đủ xe để vận chuyển nước đến các đại lý sao cho mỗi xe chỉ cần chạy nhiều nhất một lần là đủđể thỏa mãn nhu cầu của các đại lý, thủ tục trên luôn tìm được luồng khả thi. Ta dễ nhận thấy thuật toán tìm luồng khả thi này có độ phức tạp là O(Nn2).
Sau khi đã có được luồng khả thi, chúng ta tiếp tục sử dụng thuật toán tối
ưu hóa luồng để đạt được phương pháp vận chuyển tốt nhất. Thuật toán tối ưu hóa luồng được mô tả chi tiết dưới đây:
Thuật toán Tối ưu hóa luồng;
begin
Tìm luồng khả thi;
while G(x) chứa một chu trình âm và lượng hàng vận chuyển trên chu trình
âm bằng nhau do begin
sử dụng một thuật toán để tìm một chu trình âm W;
δ:= min{rij: (i, j) ∈ W};
tăng δ đơn vị luồng trong chu trình W và cập nhật G(x);
end; end;
Cũng như thuật toán khử chu trình âm, thuật toán này chạy trong thời gian là O(nm2CU).
KHOA CNTT – ĐH KHTN 7.4. Phân tích 7.4.1. Yêu cầu chức năng STT Chức năng Ghi chú 1. Hiển thị bản đồ 2. Phóng to, thu nhỏ bản đồ 3. Di chuyển bản đồ
4. Thông tin về các đại lý trên bản đồ
Thông tin về các đại lý gồm có:
9 Địa chỉ
9 Nhu cầu của đại lý (lượng hàng cần có trong ngày hôm sau)
5. Thông tin về các phương tiện
chuyên chở
Thông tin về các phương tiện chuyên chở gồm có:
9 Khả năng vận tải (có thể
chở được bao nhiêu hàng)
9 Chi phí vận chuyển (tính theo đơn vị mét)
6. Thay đổi nhu cầu của các đại lý
7. Thay đổi thông tin về các phương
tiện chuyên chở 8. Tìm phương pháp vận chuyển hàng hóa tối ưu cho tất cả các đại lý Có thể hiển thị kết quả theo nhiều cách: đường đi của từng xe hoặc tất cả các xe 9. Tìm đường đi ngắn nhất từ nhà cung cấp đến các đại lý
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
7.4.2. Mô hình Use Case
7.4.2.1. Lược đồ chính của mô hình Use Case
Thay doi nhu cau cua cac dai ly
Thay doi thong tin cac phuong tien
Tim phuong phap van chuyen toi uu
Tim duong di ngan nhat tu nha cung cap den dai ly Xem thong tin cac dai ly
Xem thong tin cac phuong tien Nguoi dung
Xuat lich giao hang
Hình 7-2 Biểu đồ Use Case
7.4.2.2. Đặc tả Use Case
7.4.2.2.1. Xem thông tin các đại lý
7.4.2.2.1.1. Mô tả
Use Case này cho phép người dùng xem thông tin của đại lý như: địa chỉ, lượng hàng cần giao trong ngày của đại lý.
7.4.2.2.1.2. Dòng sự kiện
7.4.2.2.1.2.1. Dòng sự kiện chính
Use Case này bắt đầu khi người dùng muốn xem thông tin của các đại lý.
KHOA CNTT – ĐH KHTN 7.4.2.2.1.2.2. Các dòng sự kiện khác Không có. 7.4.2.2.1.3. Yêu cầu đặc biệt Không có. 7.4.2.2.1.4. Điều kiện đầu Không có. 7.4.2.2.1.5. Điều kiện sau Không có. 7.4.2.2.1.6. Điểm mở rộng
Kết xuất thông tin của tất cả các đại lý dưới dạng văn bản.
7.4.2.2.2. Thay đổi nhu cầu của các đại lý
7.4.2.2.2.1. Mô tả
Use Case này cho phép người dùng thay đổi nhu cầu của các đại lý. 7.4.2.2.2.2. Dòng sự kiện
7.4.2.2.2.2.1. Dòng sự kiện chính
Use Case này bắt đầu khi người dùng yêu cầu thay đổi nhu cầu của một đại lý cụ thể hoặc của tất cả các đại lý.
1) Hệ thống truy xuất và hiển thị nhu cầu hiện thời của các đại lý.
2) Người dùng thay đổi nhu cầu của các đại lý.
3) Hệ thống cập nhật thay đổi vào cơ sở dữ liệu.
7.4.2.2.2.2.2. Các dòng sự kiện khác
Không có.
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
Không có. 7.4.2.2.2.4. Điều kiện đầu Không có. 7.4.2.2.2.5. Điều kiện sau Không có. 7.4.2.2.2.6. Điểm mở rộng Không có.
7.4.2.2.3. Xem thông tin các phương tiện
7.4.2.2.3.1. Mô tả
Use Case này cho phép người dùng xem thông tin của tất cả các phương tiện hiện có của nhà cung cấp như: mã phương tiện, loại phương tiện, khả năng vận chuyển, chi phí cho một đơn vị đường đi.
7.4.2.2.3.2. Dòng sự kiện
7.4.2.2.3.2.1. Dòng sự kiện chính
Use Case này bắt đầu khi người dùng muốn xem thông tin của các phương tiện.
1) Hệ thống đọc thông tin của các phương tiện từ cơ sở dữ liệu.
2) Hệ thống hiển thị thông tin của tất cả các phương tiện dưới dạng lưới.
7.4.2.2.3.2.2. Các dòng sự kiện khác
Không có
KHOA CNTT – ĐH KHTN 7.4.2.2.3.4. Điều kiện đầu Không có 7.4.2.2.3.5. Điều kiện sau Không có. 7.4.2.2.3.6. Điểm mở rộng Không có.
7.4.2.2.4. Thay đổi thông tin về các phương tiện
7.4.2.2.4.1. Mô tả
Use Case này cho phép người dùng thay đổi thông tin của các phương tiện hoặc thêm vào các phương tiện khác, bao gồm số lượng, khả năng vận tải và chi phí trên một đơn vịđường đi của phương tiện đó.
7.4.2.2.4.2. Dòng sự kiện
7.4.2.2.4.2.1. Dòng sự kiện chính
Use Case này bắt đầu khi người dùng yêu cầu thay đổi thông tin của các phương tiện hoặc thêm các phương tiện mới.
1) Hệ thống đọc thông tin của tất cả các phương tiện từ cơ sở dữ liệu.
2) Hệ thống hiển thị thông tin của các phương tiện dưới dạng lưới.
3) Người dùng thay đổi thông tin của các phương tiện hoặc thêm các phương tiện mới . 4) Hệ thống cập nhật thay đổi vào cơ sở dữ liệu. 7.4.2.2.4.2.2. Các dòng sự kiện khác Không có. 7.4.2.2.4.3. Yêu cầu đặc biệt Không có.
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
7.4.2.2.4.4. Điều kiện đầu Không có. 7.4.2.2.4.5. Điều kiện sau Không có. 7.4.2.2.4.6. Điểm mở rộng Không có. 7.4.2.2.5. Tìm phương pháp vận chuyển tối ưu 7.4.2.2.5.1. Mô tả
Use Case này cho phép người dùng xác định được phương án vận chuyển tối ưu (đường đi của các phương tiện) đến các đại lý.
7.4.2.2.5.2. Dòng sự kiện
7.4.2.2.5.2.1. Dòng sự kiện chính
Use Case này bắt đầu khi người dùng yêu cầu hệ thống tìm phương pháp vận chuyển hàng hóa đến các đại lý.
1) Hệ thống đọc thông tin các phương tiện, nhu cầu của các đại lý và chiều dài đường đi giữa các đại lý.
2) Hệ thống tìm phương pháp vận chuyển tối ưu.