InjectedSolutionConstraint

リクエストに注入されるソリューション(制限が必要な訪問や、どのように制限する必要があるかに関する情報を含む)。

JSON 表現
{
  "routes": [
    {
      object (ShipmentRoute)
    }
  ],
  "skippedShipments": [
    {
      object (SkippedShipment)
    }
  ],
  "constraintRelaxations": [
    {
      object (ConstraintRelaxation)
    }
  ]
}
フィールド
routes[]

object (ShipmentRoute)

挿入するソリューションのルート。元のソリューションから一部のルートが省略されている場合があります。ルートとスキップされた配送は、injectedFirstSolutionRoutes に記載されている基本的な妥当性の前提条件を満たしている必要があります。

skippedShipments[]

object (SkippedShipment)

注入するソリューションの出荷をスキップした。元のソリューションから一部が省略されている場合があります。routes フィールドをご覧ください。

constraintRelaxations[]

object (ConstraintRelaxation)

0 個以上の車両グループの場合は、制約を緩和するタイミングと程度を指定します。このフィールドが空の場合、空でない車両ルートはすべて完全な制約を受けます。

ConstraintRelaxation

車両のグループについて、訪問に対する制約をどのしきい値でどのレベルに緩和するかを指定します。skipped_shipment フィールドにリストされている配送は、スキップすることが制限されているため、実行できません。

JSON 表現
{
  "relaxations": [
    {
      object (Relaxation)
    }
  ],
  "vehicleIndices": [
    integer
  ]
}
フィールド
relaxations[]

object (Relaxation)

vehicleIndices の車両が走行する経路での訪問に適用されるすべての訪問制約の緩和。

vehicleIndices[]

integer

訪問の制約 relaxations を適用する車両インデックスを指定します。空の場合、デフォルトとみなされ、他の constraintRelaxations で指定されていないすべての車両に relaxations が適用されます。デフォルトは 1 つまでです。つまり、空の vehicleIndices に指定できる制約緩和フィールドは 1 つまでです。車両インデックスは、複数の constraintRelaxations 内であっても、一度しかリストできません。

interpretInjectedSolutionsUsingLabels が true の場合、車両インデックスは ShipmentRoute.vehicle_index と同じようにマッピングされます(fields のコメントを参照)。

リラクゼーション

relaxations が空の場合、routes へのすべての訪問の開始時間と順序は完全に制限され、新しい訪問をそれらのルートに挿入したり追加したりすることはできません。また、routes での車両の開始時間と終了時間には、完全に制約があります。ただし、車両が空である(訪問がなく、モデルで usedIfRouteIsEmpty が false に設定されている)場合を除きます。

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

訪問が thresholdVisitCount または thresholdTime を満たす場合に緩和レベルを適用するには、同じ level を持つ relaxations を 2 つ追加します。1 つは thresholdVisitCount のみ、もう 1 つは thresholdTime のみを設定します。訪問が複数の relaxations の条件を満たす場合は、最も緩和されたレベルが適用されます。その結果、車両の始点から経路の訪問を経て車両の終点まで、リラクゼーションのレベルはより緩やかになります。つまり、リラクゼーションのレベルは、ルートが進むにつれて下がりません。

どの relaxations のしきい値も満たさない訪問のタイミングと順序は完全に制限され、訪問はこれらの順序に挿入できません。また、車両の始動または終点がリラクゼーションの条件を満たさない場合、車両が空でない限り、時間は固定されます。

JSON 表現
{
  "level": enum (Level),
  "thresholdTime": string,
  "thresholdVisitCount": integer
}
フィールド
level

enum (Level)

thresholdTime 以上かつ thresholdVisitCount 以上の条件が満たされた場合に適用される制約緩和レベル。

thresholdTime

string (Timestamp format)

リラクゼーション level を適用する時間またはそれより後の時間。

RFC3339 UTC「Zulu」形式のタイムスタンプ。精度はナノ秒まで、小数点以下は最大 9 桁。例: "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

thresholdVisitCount

integer

リラクゼーション level が適用されるか、その時点以降の訪問回数。thresholdVisitCount が 0 の場合(または未設定の場合)、level を車両の起動時に直接適用できます。

route.visits_size() + 1 の場合、level は車両端にのみ適用できます。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 と同じですが、車両も緩和されています。しきい値時間以降は完全に無料であるため、行方不明になる可能性があります。