Dimensions

ルーティング ソルバーでは、ディメンションと呼ばれるオブジェクトを使用して、 車両のルートに沿って累積された数量(移動時間、 車両の集荷と配達を行っている場合の総重量 をタップします。ルーティングの問題で、制約または 定義するには、それを指定するディメンションを定義する必要があります。

このセクションでは、ディメンションを定義して使用する方法について説明します。

ディメンションの例

前のセクションのディメンションの例を以下に示します。

  • VRPTW の例で、追跡するディメンションが作成される 各車両の累積走行時間です解法は次元を使用して、 車両が通行できるのはそのロケーションの 指定することもできます。

  • この CVRP の例では、 需要(集荷する荷物の重量や体積など) 車両がルートに沿って運んでいる累積負荷。 ソルバーは寸法を使用して車両の負荷に制約を適用します。 容量を超えないようにする必要があります

以下の例では、 AddDimension メソッドを呼び出します。

Python

routing.AddDimension(
    callback_index,
    slack_max,
    capacity,
    fix_start_cumul_to_zero,
    dimension_name)

C++

routing.AddDimension(
    callback_index,
    slack_max,
    capacity,
    fix_start_cumul_to_zero,
    dimension_name)

Java

routing.addDimension(
    callbackIndex,
    slackMax,
    capacity,
    fixStartCumulToZero,
    dimensionName)

C#

routing.AddDimension(
    callbackIndex,
    slackMax,
    capacity,
    fixStartCumulToZero,
    dimensionName)

AddDimension メソッドには、次の入力があります。

  • callback_index: 数量を返すコールバックのインデックス。「 コールバックへのソルバーの内部参照であるインデックスは、 メソッド(RegisterTransitCallbackRegisterUnitaryTransitCallback など)を使用できます。
  • slack_max: スラックの最大値、待機を表すために使用される変数 繰り返します以下の slack 変数をご覧ください。 表示されます。 待ち時間が不要な場合は、通常は slack_max を設定できます。 0 に変更します。
  • capacity: 各経路で累積された合計数量の最大値。 capacity を使用して、 CVRP。問題にこのような 制約については、capacity を、変更の実行に十分な大きさの値に ルートに制限は課されません。たとえば、すべてのリソースの合計 コールバックの定義に使用される行列または配列のエントリ。
  • fix_start_cumulative_to_zero: ブール値。true の場合、累積値 0 から始まりますほとんどの場合、True に設定する必要があります。 ただし、VRPTWリソースの制約、一部の車両 時間枠の制約により時間 0 より後に開始しなければならない場合があるため、 これらの問題では、fix_start_cumulative_to_zeroFalse に設定します。
  • dimension_name: ディメンションの名前の文字列('Distance' など)。 これを使用して、プログラムの他の場所で変数にアクセスできます。

CVRP プログラムでは、 AddDimensionWithVehicleCapacity メソッドを呼び出します。このメソッドは、車両ごとに 1 つのエントリを持つ容量の配列を受け取ります。 (これに対して、AddDimensioncapacity に対して単一の値を取るため、 すべての車両は同じ容量であると想定されます)。

RoutingModel をご覧ください。 ディメンションを作成するその他のメソッドについては、リファレンス ページをご覧ください。

セクション 解答の時間枠をリストまたは配列に保存する リストまたは配列のディメンションに累積データを保存する関数を示します。

Slack の変数

次の例は、以下の問題に対するスラック変数を示しています。 移動時間が短縮されます仮に、 車両がルートの 1 つのステップで場所 i から場所 j に向かう、

  • i での車両の累積走行時間は 100 分です。
  • j における車両の累積走行時間は 200 分です。
  • i から j までの移動時間は 75 分です。

車両は到着後すぐに場所 i から離れることはできません。 場所 j の時間は 175 とします。代わりに、車両は 出発前の場所 iつまり、ロケーション i でのスラックは 25 です。

VRPTW では、車両が到着するまでに待機時間が必要になる場合があるため、スラックを許容する必要があります。 一定の時間内で同じ地域を訪れる可能性がありますこのような問題では、 slack_max を、車両の待機時間の上限に設定します。 場所を指定してから次の場所に進んでください。どれだけ長くても slack_max を非常に大きな数値に設定するだけです。

一方、CVRP では、i から j は常に i の需要と等しいため、スラックはありません。たとえば、 slack_max を 0 に設定できます。

次に、Slack の正式な定義について説明します。ディメンションには内部的に ルートに沿って累積される数量に関連する 2 種類の変数:

  • 推移変数: 各ステップにおける数量の増減 ルートです。 i -> j が経路の 1 つのステップの場合、交通機関の変数は i、 交通機関マトリックスの j エントリ(交通機関のコールバックの場合)、または単に 位置 i でのコールバック値(コールバックが 1 つの場所のみに依存する場合)。
  • 累積変数: 各ロケーションでの累積合計数量。マイページ ロケーション i の累積変数に dimension_name.CumulVar(i)。例については、 時間枠の制約 説明しました

車両が 1 つのステップで場所 i から場所 j に向かうと仮定すると、 slack はこれらの変数と次のように関連しています。

slack(i) = cumul(j) - cumul(i) - transit(i, j)

ディメンションについて詳しくは RoutingDimension ご覧ください。