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

這個範例說明如何使用轉換屬性,優先安排同一輛車在同一時段內,完成鄰近的取貨和送貨行程。如要進一步瞭解轉移屬性,請參閱「使用轉移屬性建立模型業務邏輯」。

在這個例子中:

  • 貨件 A、B 和 C 的送達地點位於同一條路上,且距離很近。
  • 其他交貨作業將在稍後進行。
  • 運送時間未指定。
  • 無論拜訪時間為何,車輛都必須行駛這條道路兩次:一次是早上從車庫出發時,另一次是晚上返回時。
  • 無論 A、B 和 C 何時執行,路線的總行駛距離和時間一律相同。

例如在同一條路上運送貨物。有三批貨物 A、B 和 C 從倉庫出發,要運往其他貨物。A 距離車庫 1000 公尺,B 距離車庫 1050 公尺,C 距離車庫 1080 公尺 (方向相同)。距離 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
其他→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

每個版本中,兩項解決方案的總成本較低者會以粗體醒目顯示。如您所見,如果使用高於門檻的成本,行程的總成本現在會高於行程中造訪地點分組的成本,這與您想達成的目標相反。