Ví dụ này cho thấy cách sử dụng các thuộc tính chuyển đổi để ưu tiên những tuyến đường mà cùng một xe thực hiện việc nhận và giao hàng ở gần trong một khoảng thời gian. Để tìm hiểu thêm về các thuộc tính chuyển đổi, hãy xem Model Business Logic with Transition Attributes (Mô hình logic nghiệp vụ với các thuộc tính chuyển đổi).
Trong ví dụ này:
- Các chuyến giao hàng A, B và C gần nhau trên cùng một con đường.
- Các đợt phân phối khác sẽ diễn ra trong thời gian tới.
- Không có thời gian giao hàng cụ thể.
- Bất kể lịch trình ghé thăm, xe cần lái trên đường này hai lần: một lần vào buổi sáng trên đường từ nhà kho và một lần vào buổi tối trên đường về.
- Tổng quãng đường và thời gian di chuyển của tuyến đường luôn không đổi, bất kể thời điểm thực hiện A, B và C.
Trong trường hợp này và đối với yêu cầu chỉ sử dụng chi phí mỗi giờ và chi phí mỗi km, tuyến đường được tối ưu hoá có thể xử lý A và B vào buổi sáng, còn C được xử lý vào buổi tối và chi phí của giải pháp sẽ giống như khi cả 3 yêu cầu được xử lý cùng một lúc.
Chi phí trên mỗi km có ngưỡng
Để nhóm các lượt ghé thăm gần đó, trước tiên bạn cần chọn một khoảng cách ngưỡng. Đây là khoảng cách tối đa giữa hai lượt truy cập mà bạn cho là gần nhau. Ví dụ này sử dụng ngưỡng 100 mét, tương ứng với khoảng một khu phố ở khu vực đô thị. Bạn có thể tăng hoặc giảm ngưỡng để phù hợp với nhu cầu của doanh nghiệp và lựa chọn ưu tiên của người lái xe.
Để nhóm các lượt ghé thăm gần nhau trong phạm vi 100 mét, bạn đặt chi phí cao cho 100 mét đầu tiên của mỗi lượt chuyển đổi và chi phí thấp hơn cho mọi mét bổ sung của lượt chuyển đổi. Vì 100 mét đầu tiên là đoạn đường tốn kém nhất, nên trình tối ưu hoá sẽ tiết kiệm được nhiều nhất bằng cách sử dụng các đoạn đường ngắn hơn ngưỡng 100 mét, ngay cả khi điều đó có nghĩa là kéo dài tổng chiều dài của tuyến đường.
Để thiết lập chi phí, bạn thêm một mục mới vào ShipmentModel.transition_attributes
bằng các thuộc tính sau:
- Để khớp với tất cả các chuyển đổi có thể xảy ra, hãy chọn một thẻ không được dùng ở bất kỳ vị trí nào trong mô hình, ví dụ:
UNUSED_TAG
. ĐặtTransitionAttributes.excluded_src_tag
vàTransitionAttributes.excluded_dst_tag
cho thẻ này. - Thiết lập
TransitionAttributes.distance_limit
với khoảng cách và chi phí theo ngưỡng:- Đặt
DistanceLimit.soft_max_meters
thành ngưỡng đã chọn. - Đặt
DistanceLimit.cost_per_kilometer_below_soft_max
thành chi phí mỗi km dưới ngưỡng. - Đặt
DistanceLimit.cost_per_kilometer_above_soft_max
thành chi phí mỗi km vượt ngưỡng.
- Đặt
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG",
"excluded_src_tag": "UNUSED_TAG",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
Không được sử dụng thẻ #unused_tag#
cho bất kỳ lô hàng hoặc xe nào để khớp với tất cả các trạng thái chuyển đổi có thể có. Để biết thêm thông tin, hãy xem bài viết Cách so khớp tất cả các yêu cầu truy cập.
Cách hoạt động của chi phí cao dưới ngưỡng
Phần này cho biết chi phí dưới và trên ngưỡng ảnh hưởng đến tổng chi phí của các giải pháp khác nhau trong tình huống ví dụ.
Giải pháp 1: Thực hiện A, B trên đường đến đó, C trên đường về
Trong giải pháp này, các lô hàng được chia thành 2 lượt đi trên đường này. Hai trong số đó được phân phối trong lần truyền tải đầu tiên và một trong số đó được phân phối trong lần truyền tải thứ hai. Có 5 trạng thái chuyển đổi:
Hiệu ứng chuyển cảnh | Khoảng cách | Dưới ngưỡng | Trên ngưỡng | ||
---|---|---|---|---|---|
Khoảng cách | Chi phí | Khoảng cách | Chi phí | ||
depot →A | 1000 m | 100 m | 5 | 900 m | 0,9 |
A→B | 50 m | 50 m | 2.5 | 0 phút | 0 |
B→other | 1030 m | 100 m | 5 | 930 m | 0,93 |
other→C | 1000 m | 100 m | 5 | 900 m | 0,9 |
C→depot | 1080 m | 100 m | 5 | 980 m | 0,98 |
Tổng | 450 m | 22,5 | 3710 m | 3,71 |
Tổng chi phí được tính bằng tổng của hai chi phí trên mỗi km:
- chi phí cho mỗi ki-lô-mét dưới ngưỡng (50) nhân với tổng quãng đường đã đi dưới ngưỡng (450 m = 0,45 km),
- chi phí trên mỗi ki-lô-mét vượt quá ngưỡng (1) nhân với tổng quãng đường đã đi vượt quá ngưỡng (3.710 m = 3,71 km).
Do đó, tổng chi phí là 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.
Giải pháp 2: Thực hiện A, B, C trên đường đi, không thực hiện gì trên đường về
Trong giải pháp này, không giống như giải pháp 1, cả 3 lô hàng đều được giao "theo nhóm" trong một lần di chuyển trên đường. Trong lần di chuyển khác, xe không dừng lại. Một lần nữa, có 5 hiệu ứng chuyển cảnh, nhưng độ dài và thành phần của chúng khác nhau:
Hiệu ứng chuyển cảnh | Khoảng cách | Dưới ngưỡng | Trên ngưỡng | ||
---|---|---|---|---|---|
Khoảng cách | Chi phí | Khoảng cách | Chi phí | ||
depot →A | 1000 m | 100 m | 5 | 900 m | 0,9 |
A→B | 50 m | 50 m | 2.5 | 0 phút | 0 |
B→C | 30 phút | 30 phút | 1,5 | 0 phút | 0 |
C→other | 1000 m | 100 m | 5 | 900 m | 0,9 |
other→depot | 2080 m | 100 m | 5 | 1980 m | 1,98 |
Tổng | 380 m | 19 | 3.780 m | 3,78 |
Sử dụng cùng một phép tính như trong giải pháp 1, tổng chi phí là 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78 và thực hiện tất cả các lượt truy cập trong một khối thời gian có chi phí thấp hơn so với việc thực hiện chúng trong hai nhóm. Bạn có thể tăng cường hiệu ứng này bằng cách tăng DistanceLimit.cost_per_kilometer_below_soft_max
.
Lý do khiến chi phí thấp cho mỗi km dưới ngưỡng không hoạt động
Vì muốn ưu tiên các chuyển đổi ngắn hơn là các chuyển đổi dài, nên bạn có thể muốn đặt chi phí cao cho mỗi km đối với các chuyển đổi dài và giữ chi phí thấp cho mỗi km đối với các chuyển đổi ngắn. Nhưng điều này thực tế lại có tác dụng ngược lại: vì 100 mét đầu tiên của quá trình chuyển đổi là rẻ nhất, nên trình tối ưu hoá sẽ sử dụng những mét "rẻ" này một cách hiệu quả nhất bằng cách ưu tiên những quá trình chuyển đổi có chiều dài gần bằng hoặc hơn 100 mét.
Bạn có thể thấy hiệu ứng này trên hai giải pháp ví dụ. Nếu bạn hoán đổi chi phí trên mỗi km dưới và trên ngưỡng, chi phí của tuyến đường sẽ thay đổi:
Chi phí cao hơn ngưỡng | Chi phí cao dưới ngưỡng | |||
---|---|---|---|---|
Giải pháp 1 | Giải pháp 2 | Giải pháp 1 | Giải pháp 2 | |
Số KM dưới ngưỡng | 0,45 | 0,38 | 0,45 | 0,38 |
Chi phí cho mỗi KM dưới ngưỡng | 1 | 1 | 50.00 | 50.00 |
Số KM trên ngưỡng | 3,71 | 3,78 | 3,71 | 3,78 |
Chi phí cho mỗi KM vượt quá ngưỡng | 50.00 | 50.00 | 1 | 1 |
Tổng chi phí | 185,95 | 189,38 | 26,21 | 22,78 |
Đối với mỗi phiên bản, tổng chi phí thấp hơn của 2 giải pháp sẽ được đánh dấu bằng chữ in đậm. Bạn có thể thấy rằng khi bạn sử dụng chi phí cao hơn ngưỡng, tổng chi phí của tuyến đường hiện cao hơn đối với tuyến đường mà các lượt truy cập được nhóm lại, điều này trái ngược với những gì bạn muốn đạt được.