本例說明如何使用轉換屬性,為路線設定優先順序,讓同一輛車在同一時間區塊內執行附近的接送和送貨作業。如要進一步瞭解轉場屬性,請參閱「使用轉場屬性模擬業務邏輯」。
在這個例子中:
- 貨件 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 |
other→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 公尺內或超過 100 公尺的轉換中取得最佳效果。
您可以在兩個範例解決方案中看到這種效果。如果將每公里費用從低於門檻值改為高於門檻值,路線費用會有所變動:
高於門檻的費用 | 低於門檻的費用高 | |||
---|---|---|---|---|
解決方案 1 | 解決方案 2 | 解決方案 1 | 解決方案 2 | |
低於門檻的 KM | 0.45 | 0.38 | 0.45 | 0.38 |
單公里費用低於門檻 | 33 元 | 33 元 | 50.00 | 50.00 |
超過門檻的 KM | 3.71 | 3.78 | 3.71 | 3.78 |
超過門檻的單次轉換費用 | 50.00 | 50.00 | 33 元 | 33 元 |
總費用 | 185.95 | 189.38 | 26.21 | 22.78 |
針對每個版本,系統會以粗體字標示兩種解決方案中總費用較低的方案。您可以看到,如果使用高於門檻的費用,路徑的總費用會變高,這與您想要達到的目標相反。