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 内であっても 1 回しか登録できません。

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

リラクゼーション

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

relaxations(i).level は、次の条件を満たす訪問 #j に適用される制約緩和レベルを指定します。

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

同様に、次の条件を満たす場合、車両の始動は relaxations(i).level に緩和されます。

  • vehicleStartTime >= relaxations(i).threshold_time AND
  • relaxations(i).threshold_visit_count == 0 と車両の終了は、次の条件を満たす場合に relaxations(i).level に緩和されます。
  • vehicleEndTime >= relaxations(i).threshold_time AND
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

訪問が thresholdVisitCount または thresholdTime を満たす場合に緩和レベルを適用するには、同じ level を持つ 2 つの relaxations を追加します。1 つは thresholdVisitCount のみ設定し、もう 1 つは thresholdTime のみ設定します。1 回のアクセスが複数の 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() + 1 の場合、level は車両の末尾にのみ適用できます。route.visits_size() + 1 を超える場合、そのルートには level は適用されません。

レベル

しきい値条件を満たした場合に、1 回の訪問とその後の訪問に適用されるさまざまな制約緩和レベルを表します。

次の列挙型は、緩和の度合いが低い順に並んでいます。

列挙型
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 と同じですが、車両も緩和されます。しきい値時間以降の訪問は完全に無料になり、実行されない可能性があります。