InjectedSolutionConstraint

在要求中插入的解決方案,包括哪些造訪必須受到限制,以及如何限制。

JSON 表示法
{
  "routes": [
    {
      object (ShipmentRoute)
    }
  ],
  "skippedShipments": [
    {
      object (SkippedShipment)
    }
  ],
  "constraintRelaxations": [
    {
      object (ConstraintRelaxation)
    }
  ]
}
欄位
routes[]

object (ShipmentRoute)

要插入的解決方案路徑。原始解決方案可能會省略部分路線。路線和略過的運送作業必須符合 injectedFirstSolutionRoutes 列出的基本有效性假設。

skippedShipments[]

object (SkippedShipment)

略過要插入的解決方案出貨作業。部分內容可能會從原始解決方案中省略。請參閱 routes 欄位。

constraintRelaxations[]

object (ConstraintRelaxation)

針對零或多個車輛群組,指定放寬限制的時機和程度。如果這個欄位為空白,則所有非空白的車輛路線都會受到完全限制。

ConstraintRelaxation

針對一組車輛,指定訪客限制的門檻和鬆綁程度。skipped_shipment 欄位中列出的運送作業會遭到略過,也就是無法執行。

JSON 表示法
{
  "relaxations": [
    {
      object (Relaxation)
    }
  ],
  "vehicleIndices": [
    integer
  ]
}
欄位
relaxations[]

object (Relaxation)

所有造訪限制放寬項目,會套用至 vehicleIndices 中含有車輛的路線造訪。

vehicleIndices[]

integer

指定要套用造訪限制 relaxations 的車輛索引。如果留空,系統會將其視為預設值,並將 relaxations 套用至其他 constraintRelaxations 未指定的所有車輛。最多只能有一個預設值,也就是最多只能有一個限制鬆綁欄位可為空白 vehicleIndices。車輛索引只能列出一次,即使在多個 constraintRelaxations 中也是如此。

如果 interpretInjectedSolutionsUsingLabels 為 true (請參閱 fields 註解),車輛索引會與 ShipmentRoute.vehicle_index 進行相同的對應。

休閒場所

如果 relaxations 為空白,routes 上所有造訪記錄的開始時間和順序都會受到完全限制,且無法在這些路徑中插入或新增新的造訪記錄。此外,除非車輛為空 (即在模型中沒有造訪,且 usedIfRouteIsEmpty 設為 false),否則 routes 中的車輛開始和結束時間會受到完全限制。

relaxations(i).level 會指定套用至符合下列條件的 #j 次訪問的限制放寬程度:

  • route.visits(j).start_time >= relaxations(i).threshold_time
  • j + 1 >= relaxations(i).threshold_visit_count

同樣地,如果車輛啟動符合下列條件,系統會將啟動時間延後至 relaxations(i).level

  • vehicleStartTime >= relaxations(i).threshold_time
  • relaxations(i).threshold_visit_count == 0 和車輛端會在滿足下列條件時放寬至 relaxations(i).level
  • vehicleEndTime >= relaxations(i).threshold_time
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

如要針對符合 thresholdVisitCountthresholdTime 的造訪次數套用放寬程度,請新增兩個具有相同 levelrelaxations:一個只設定 thresholdVisitCount,另一個只設定 thresholdTime。如果造訪符合多個 relaxations 的條件,系統會套用最寬鬆的層級。因此,從車輛出發到車輛抵達路線的各個點,放鬆程度會逐漸增加,也就是說,放鬆程度不會隨著路線的推進而降低。

路線造訪的時間和順序若不符合任何 relaxations 的門檻條件,就會受到完全限制,且無法在這些序列中插入造訪。此外,如果車輛的起點或終點不符合任何放寬條件,則會固定時間,除非車輛為空車。

JSON 表示法
{
  "level": enum (Level),
  "thresholdTime": string,
  "thresholdVisitCount": integer
}
欄位
level

enum (Level)

thresholdTime 之後或之後,且至少滿足 thresholdVisitCount 的條件時,套用的限制放寬程度。

thresholdTime

string (Timestamp format)

可套用放寬 level 的時間點或之後。

使用 RFC 3339,產生的輸出內容一律會經過 Z 規格化,並使用 0、3、6 或 9 小數位數。系統也接受「Z」以外的偏移值。例如:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z""2014-10-02T15:01:23+05:30"

thresholdVisitCount

integer

系統可在多少次造訪後套用放寬 level 的數量。如果 thresholdVisitCount 為 0 (或未設定),level 可能會在車輛啟動時直接套用。

如果是 route.visits_size() + 1level 可能只會套用至車輛端。如果超過 route.visits_size() + 1,則該路徑將完全不套用 level

層級

表示不同的限制放寬層級,這些層級會套用至符合門檻條件的單一造訪,以及後續的造訪。

下列列舉的順序是依放鬆程度排序。

列舉
LEVEL_UNSPECIFIED

隱含的預設放寬程度:不放寬任何限制,也就是所有造訪皆受到完全限制。

這個值不得在 level 中明確使用。

RELAX_VISIT_TIMES_AFTER_THRESHOLD 系統會放寬造訪開始時間和車輛開始/結束時間的限制,但每個造訪仍會綁定至同一輛車輛,且必須遵循造訪順序:在兩次造訪之間或之前,不得插入其他造訪。
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD RELAX_VISIT_TIMES_AFTER_THRESHOLD 相同,但訪問順序也較為寬鬆:訪問只能由此車輛執行,但可能不會執行。
RELAX_ALL_AFTER_THRESHOLD RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD 相同,但車輛也放寬限制:在門檻時間點或之後,訪客可完全免費,且可能不會執行。