這個範例說明如何使用轉換屬性,優先安排同一輛車在同一時段內,完成附近的上車和送達行程。如要進一步瞭解轉移屬性,請參閱「使用轉移屬性建立模型業務邏輯」。
在這個例子中:
- 貨件 A、B 和 C 的送達地點位於同一條路上,且距離很近。
- 其他交貨作業將在稍後進行。
- 運送時間未指定。
- 無論拜訪時間為何,車輛都必須行駛這條道路兩次:一次是早上從車庫出發時,另一次是晚上返回時。
- 無論 A、B 和 C 何時執行,路線的總行駛距離和時間一律相同。
在這種情況下,如果要求只使用每小時費用和每公里費用,最佳化路徑可能會在上午處理 A 和 B,在晚上處理 C,而解決方案的費用與同時處理這三項要求相同。
設有門檻的每公里費用
如要將鄰近的造訪記錄歸為一組,請先選取距離門檻。這是指您認為相近的兩次造訪之間的最大距離。這個範例使用 100 公尺的門檻,大約相當於市區的一個街區。您可以視業務需求和駕駛人的偏好,提高或降低門檻。
如要將彼此相距 100 公尺內的造訪次數歸為一組,請為每次轉換的前 100 公尺設定較高的費用,並為轉換的任何額外公尺設定較低的費用。由於前 100 公尺的費用最高,因此最佳化工具會使用短於 100 公尺門檻的轉場效果,即使這表示會延長路線總長度,也能節省最多費用。
如要設定費用,請在 ShipmentModel.transition_attributes
中新增項目,並設定下列屬性:
- 如要比對所有可能的轉移,請挑選模型中任何位置都未使用的標記,例如
UNUSED_TAG
。將TransitionAttributes.excluded_src_tag
和TransitionAttributes.excluded_dst_tag
設為這個標記。 - 使用門檻距離和費用設定
TransitionAttributes.distance_limit
:- 將
DistanceLimit.soft_max_meters
設為所選門檻。 - 將
DistanceLimit.cost_per_kilometer_below_soft_max
設為低於門檻的每公里費用。 - 將
DistanceLimit.cost_per_kilometer_above_soft_max
設為高於門檻的每公里費用。
- 將
{
"model": {
"transitionAttributes": [
{
"excluded_dst_tag": "UNUSED_TAG",
"excluded_src_tag": "UNUSED_TAG",
"distanceLimit": {
"softMaxMeters": 100,
"costPerKilometerBelowSoftMax": 50,
"costPerKilometerAboveSoftMax": 1,
}
}
]
}
}
任何貨件或車輛都不得使用 #unused_tag#
標記,以比對所有可能的轉換。詳情請參閱如何比對所有預約要求。
高於起付額度的費用
本節說明成本高於和低於門檻時,對範例情境中不同解決方案的整體成本有何影響。
解決方案 1:在去程執行 A 和 B,回程執行 C
在這項解決方案中,貨物會分成兩次運送,沿著這條道路來回。其中兩個會在第一次遍歷時傳送,其餘一個則會在第二次遍歷時傳送。共有 5 種轉場效果:
轉移 | 距離 | 低於門檻 | 高於門檻 | ||
---|---|---|---|---|---|
距離 | 費用 | 距離 | 費用 | ||
depot →A | 1000 公尺 | 100 公尺 | 5 | 900 公尺 | 0.9 |
A→B | 50 公尺 | 50 公尺 | 2.5 | 0 分鐘 | 0 |
B→other | 1030 公尺 | 100 公尺 | 5 | 930 公尺 | 0.93 |
其他→C | 1000 公尺 | 100 公尺 | 5 | 900 公尺 | 0.9 |
C→depot | 1080 公尺 | 100 公尺 | 5 | 980 公尺 | 0.98 |
總計 | 450 公尺 | 22.5 | 3710 公尺 | 3.71 |
總費用的計算方式為每公里費用加總:
- 低於門檻 (50) 的每公里費用乘以低於門檻的總行駛距離 (450 公尺 = 0.45 公里)。
- 超過門檻的每公里費用 (1) 乘以超過門檻的總行經距離 (3710 公尺 = 3.71 公里)。
因此總費用為 0.45 * 50 + 3.71 * 1 = 22.5 + 3.71 = 26.21。
解決方法 2:在去程執行 A、B、C,回程則不執行任何動作
與解決方案 1 不同,這個解決方案會在一次道路行程中「一併」運送所有三批貨物。在另一次的遍歷中,車輛完全不會停靠。同樣有 5 個轉場效果,但長度和組成不同:
轉移 | 距離 | 低於門檻 | 高於門檻 | ||
---|---|---|---|---|---|
距離 | 費用 | 距離 | 費用 | ||
depot →A | 1000 公尺 | 100 公尺 | 5 | 900 公尺 | 0.9 |
A→B | 50 公尺 | 50 公尺 | 2.5 | 0 分鐘 | 0 |
B→C | 30 公尺 | 30 公尺 | 1.5 | 0 分鐘 | 0 |
C→其他 | 1000 公尺 | 100 公尺 | 5 | 900 公尺 | 0.9 |
other→depot | 2080 公尺 | 100 公尺 | 5 | 1980 公尺 | 1.98 |
總計 | 380 公尺 | 19 | 3780 公尺 | 3.78 |
使用與解決方案 1 相同的計算方式,總費用為 0.38 * 50 + 3.78 * 1 = 19 + 3.78 = 22.78,在一個時間區塊內完成所有拜訪的費用,比分兩組完成拜訪的費用更低。您可以增加 DistanceLimit.cost_per_kilometer_below_soft_max
來強化這項效果。
為什麼低於門檻的每公里費用不適用
由於您偏好短程轉乘而非長程轉乘,因此可能會想為長程轉乘設定較高的每公里成本,並為短程轉乘設定較低的每公里成本。但這實際上會產生反效果:由於轉換的前 100 公尺最便宜,最佳化工具會優先選擇接近或超過 100 公尺的轉換,盡量利用這些「便宜」的公尺。
您可以在這兩個範例解決方案中看到這項效果。如果將門檻上下的每公里費用互換,路線費用就會變更:
高於門檻的費用 | 高成本低於門檻 | |||
---|---|---|---|---|
解決方案 1 | 解決方案 2 | 解決方案 1 | 解決方案 2 | |
低於門檻的 KM | 0.45 | 0.38 | 0.45 | 0.38 |
低於門檻的每公里費用 | 1.00 | 1.00 | 50.00 | 50.00 |
超過門檻的 KM | 3.71 | 3.78 | 3.71 | 3.78 |
超出門檻的每公里費用 | 50.00 | 50.00 | 1.00 | 1.00 |
總費用 | 185.95 | 189.38 | 26.21 | 22.78 |
每個版本中,兩項解決方案的總成本較低者會以粗體醒目顯示。如您所見,如果使用高於門檻的成本,行程的總成本現在會更高,這與您想達成的目標正好相反。