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.
3) Hệ thống lưu kết quả tính toán xuống cơ sở dữ liệu.
4) Hệ thống hiển thị các đường đi kết quả lên bản đồ.
7.4.2.2.5.2.2. Các dòng sự kiện khác
Nếu không có phương pháp vận chuyển, bản đồ sẽ không thay đổi. 7.4.2.2.5.3. Yêu cầu đặc biệt
KHOA CNTT –
ĐH KHTN
7.4.2.2.5.4. Điều kiện đầu Không có.
7.4.2.2.5.5. Điều kiện sau
Lịch trình giao hàng sẽ đựơc hiển thị trên bản đồ dưới dạng đường đi của từng phương tiện. Nếu có đại lý nào không được giao hàng vì không đủ phương tiện vận chuyển, hệ thống sẽđưa ra thông báo.
7.4.2.2.5.6. Điểm mở rộng Không có.
7.4.2.2.6. Tìm đường đi ngắn nhất từ nhà cung cấp đến các đại lý
7.4.2.2.6.1. Mô tả
Use Case này cho phép người dùng xác định được đường đi ngắn nhất từ
nhà cung cấp đến các đại lý
7.4.2.2.6.2. Dòng sự kiện
7.4.2.2.6.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 đường đi ngắn nhất từ nhà cung cấp đến tất cả các đại lý hoặc đến một đại lý cụ thể
1) Hệ thống đọc thông tin về chiều dài đường đi giữa nhà cung cấp và các đại lý từ cơ sở dữ liệu. 2) Tìm đường đi ngắn nhất từ nhà cung cấp đến đại lý. 3) Hệ thống hiển thị các đường đi kết quả lên bản đồ. 7.4.2.2.6.2.2. Các dòng sự kiện khác Không có. 7.4.2.2.6.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.6.4. Điều kiện đầu Không có. 7.4.2.2.6.5. Điều kiện sau Không có. 7.4.2.2.6.6. Điểm mở rộng Không có. 7.4.2.2.7. Xuất lịch giao hàng 7.4.2.2.7.1. Mô tả
Use Case này cho phép người dùng kết xuất lịch giao hàng trong ngày của từng phương tiện.
7.4.2.2.7.2. Dòng sự kiện
7.4.2.2.7.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 kết xuất lịch giao hàng.
1) Hệ thống đọc thông tin về kết quả tính toán phương pháp vận chuyển tối ưu từ cơ sở dữ liệu.
2) Hệ thống kết xuất thông tin giao hàng dưới dạng văn bản.
7.4.2.2.7.2.2. Các dòng sự kiện khác
Không có.
7.4.2.2.7.3. Yêu cầu đặc biệt Không có.
KHOA CNTT –
ĐH KHTN
7.4.2.2.7.5. Điều kiện sau Văn bản về lich giao hàng sẽđược hiển thị.
7.4.2.2.7.6. Điểm mở rộng Không có. 7.5. Thiết kế 7.5.1. Thiết kế dữ liệu 7.5.1.1. Sơđồ các lớp dữ liệu Hình 7-3 Sơđồ các lớp dữ liệu 7.5.1.2. Mô tả các lớp dữ liệu 7.5.1.2.1. clsDatabase clsDatabase MakeConnection() CloseConnection() DoSql() Reader() Table() (from Entities)
KHOA CNTT –
ĐH KHTN
CHƯƠNG 7: XÂY DỰNG CHƯƠNG TRÌNH DISTRIBUTION
STT Phương thức Ý nghĩa
1 MakeConnection Mở kết nối cơ sở dữ liệu 2 CloseConnection Đóng kết nối cơ sở dữ liệu
3 DoSql Thực hiện 1 câu sql
4 Reader Truy vấn 1 câu sql và trả về đối tượng
SqlDataReader
5 Table Truy vấn 1 câu sql và trả về đối tượng