優先顯示含有轉換屬性的附近造訪

本例說明如何使用轉換屬性,為路線設定優先順序,讓同一輛車在同一時間區塊內執行附近的接送和送貨作業。如要進一步瞭解轉場屬性,請參閱「使用轉場屬性模擬業務邏輯」。

在這個例子中:

  • 貨件 A、B 和 C 的送達地點位於同一條路上,彼此相距不遠。
  • 我們會在日後提供更多提交方式。
  • 沒有指定運送時間。
  • 無論訪視時間表為何,車輛都必須行駛這條路線兩次:上午從車庫出發時一次,晚上返回時一次。
  • 無論 A、B 和 C 何時執行,路線的整體行程距離和時間一律相同。

範例:在同一條路上運送多筆貨件。從倉庫前往其他貨運的路線上,有三個貨運 A、B 和 C。A 距離車庫 1000 公尺,B 距離車庫 50 公尺,C 則在同方向上距離車庫 30 公尺。有其他貨件距離 C 有 1000 公尺。

在這種情況下,如果要求只使用每小時費用和每公里費用,最佳化路徑可能會在早上處理 A 和 B,在晚上處理 C,而解決方案的費用會與同時處理三者相同。

設有門檻的單公里費用

如要將附近的造訪次數分組,您必須先選取門檻距離。這是您認為兩次造訪之間的最大距離。這個範例使用的門檻為 100 公尺,大致對應於都會區的一個街區。你可以根據業務需求和駕駛人的偏好,增加或減少門檻。

如要將距離相距 100 公尺以內的附近訪客歸為同一群組,請為每個轉換作業的前 100 公尺設定高成本,並為轉換作業的額外公尺設定較低成本。由於前 100 公尺的費用最高,因此最佳化工具會使用短於 100 公尺閾值的轉換,即使這意味著延長路線的整體長度,也能節省最多費用。

如要設定費用,請使用下列屬性,在 ShipmentModel.transition_attributes 中新增項目:

{
  "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

針對每個版本,系統會以粗體字標示兩種解決方案中總費用較低的方案。您可以看到,如果使用高於門檻的費用,路徑的總費用會變高,這與您想要達到的目標相反。