レスポンスを解釈する

欧州経済領域(EEA)のデベロッパー

Route Optimization API は、対応するリクエストの車両のルートを返します。リクエストのプロパティに応じて、配送が車両に割り当てられるか、スキップされることがあります。

OptimizeToursResponse メッセージ(RESTgRPC)には、主に 2 つのトップレベル プロパティがあります。

  • routes[] は、割り当てられた荷物を含む各車両のルートです。各 Route には、その個々のルートのプロパティを反映する指標が含まれています。
  • metrics は、すべての車両とルートプランにわたるレスポンス全体の集計指標です。トップレベルの指標には、ルートごとの指標と同じプロパティが含まれており、値はすべてのルートで集計されます。

最適化の結果によっては、一部のプロパティが常に設定されるとは限りません。

  1. skippedShipments[] には、車両で実行されていない配送が一覧表示されます。指定された制約内で実行できない場合や、配送の実行費用がペナルティ費用を超える場合は、配送をスキップできます。たとえば、荷物の集荷または配達の timeWindow が非常に狭い場合、車両が指定された時間枠内に訪問を実行することが不可能または費用対効果が低い可能性があります。
  2. validationErrors[] は、リクエストの solvingModeVALIDATE_ONLY に設定されている場合に、リクエストを無効にするか、解決不可能にするエラーを指定します。通常の DEFAULT_SOLVE モードでは、検証エラーはレスポンス本文ではなくエラー メッセージに表示されます。VALIDATE_ONLY 解決モードでは、複数のエラーを一度に報告できます。これは、リクエストを迅速にデバッグするのに役立ちます。

ルート プロパティ

routes[] エントリは ShipmentRoute メッセージ(RESTgRPC)です。各 ShipmentRoute は、リクエストの特定の車両のルート割り当てを表します。対応する Vehicle に関連する重要な ShipmentRoute プロパティは次のとおりです。

  • vehicleIndex は、対応するリクエスト メッセージ内の Vehicle のゼロから始まるインデックスです。値が 0 の場合、REST レスポンスではこのプロパティは省略されます。
  • vehicleStartTime は、車両がルートを開始する必要がある時間です。
  • vehicleEndTime は、車両がルートを完了すると予想される時刻です。

レスポンスでは、routes は次のようになります。

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        ...
      ],
      "transitions": [
        ...
      ],
      "metrics": {
        ...
      },
      ...
    }
  ],
  ...
}

ShipmentRoute には、車両が完了する visits の順序付きリストが含まれます。各 VisitRESTgRPC)は、対応するリクエストの VisitRequestRESTgRPC)を表します。重要な Visit プロパティは次のとおりです。

  • shipmentIndex は、この訪問が属する配送の 0 ベースのインデックスです。
  • isPickup は、訪問が集荷の場合は true、配達の場合は false です。値が false の場合、REST レスポンスではこのプロパティは省略されます。
  • visitRequestIndex は、Visit が表す対応するリクエストの Shipment.pickups または Shipment.deliveries からの VisitRequest のゼロベースのインデックスです。値が 0 の場合、REST レスポンスではこのプロパティは省略されます。
  • startTime は、訪問が開始される予定時刻です。
  • loadDemands は、Visit を完了するために必要な読み込み量を読み込みタイプにマッピングします。配送訪問の場合、積載量は負の値になり、車両から荷物が降ろされたことを表します。

Visit の例を次に示します。

{
  "routes": [
    {
      ...
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        ...
      ],
    },
    ...
  ],
  ...
}

ShipmentRoute には、特定の車両の visits 間の移動を表す transitions の順序付きリストが含まれています。重要な Transition メッセージ(RESTgRPC)のプロパティは次のとおりです。

  • startTime は、車両が移行を開始する時刻です。
  • travelDuration は、車両が移行を完了するために走行しなければならない時間です。
  • travelDistanceMeters は、移行を完了するために車両が走行する必要がある距離(メートル単位)です。
  • trafficInfoUnavailable は、移行でトラフィック データを使用できるかどうかを示します。
  • waitDuration は、車両が次の Visit を開始する前に待機するアイドル時間を表します。これは、次の Visitstart_time が原因で発生する可能性があります。
  • totalDuration は、移動時間、待機時間、休憩時間、遅延時間を含む、移行の合計時間です。
  • vehicleLoads は、この移行中に車両が運ぶ積載量に積載タイプをマッピングします。

Transition の例を次に示します。

{
  "routes": [
    {
      ...
      "transitions": [
        ...
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        ...
      ],
      ...
    }
  ],
  ...
}

viststransitions の関係について詳しくは、集荷と配達の停止順序の最適化ShipmentRoute リファレンス ドキュメント(RESTgRPC)をご覧ください。Transition メッセージの routePolyline プロパティと routeToken プロパティの詳細については、トランジション ポリラインとルートトークンをご覧ください。

指標のプロパティ

Metrics メッセージ(RESTgRPC)は、ソリューション全体を要約したものです。重要な Metrics プロパティは次のとおりです。

  • totalCost は、ルートの完了にかかった合計費用です。費用の詳細については、費用モデルのパラメータをご覧ください。
  • usedVehicleCount は、ソリューションで使用される車両の合計数です。オプティマイザーが車両の使用は不要と判断した場合、車両のルートが空になることがあります。
  • skippedMandatoryShipmentCount は、「必須」のスキップされた配送の数です。必須の配送では、配送がスキップされた場合に発生する penaltyCost は指定されません。指定された制約の下でパフォーマンスが実現できない場合、必須の出荷をスキップできます。費用については、費用モデルのパラメータをご覧ください。

追加の指標は AggregatedMetrics メッセージ(RESTgRPC)として報告されます。AggregatedMetrics メッセージ タイプは、Metrics.aggregatedRouteMetrics プロパティと ShipmentRoute.metrics プロパティに使用されます。Metrics.aggregatedRouteMetrics には、OptimizeToursResponse 内のすべての ShipmentRoute で集計された指標が含まれます。各 ShipmentRoute.metrics プロパティには、その特定の ShipmentRoute の指標が含まれています。

重要な AggregatedMetrics プロパティは次のとおりです。

  • performedShipmentCount は、車両がルート全体で実行した配送の数です。
  • travelDuration は、車両がルートを完了するまでに移動に費やした合計時間です。
  • waitDuration は、車両がルートを完了するまでの合計待機時間です。
  • delayDuration は車両の合計遅延時間です。通常、リクエストで TransitionAttributes が使用されていない限り、この値は 0 です。
  • breakDuration は、車両がルートを完了するまでの休憩時間の合計です。
  • visitDuration は、車両がルートを完了しながら訪問を行うのに費やした合計時間です。これは、該当する車両に割り当てられた Visit に対応する VisitRequest のすべての VisitRequest.duration 値の合計です。
  • totalDuration は、車両のルートを完了するために必要な合計時間です。
  • travelDistanceMeters は、車両がルートを完了したときの合計走行距離です。
  • maxLoads は、ルート上の任意の時点で車両が運ぶ最大積載量を積載量タイプにマッピングします。

Metrics メッセージの例を次に示します。

{
  "routes": [
    ...
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 1,
      "travelDuration": "2322s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "2322s",
      "travelDistanceMeters": 18603
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T00:00:00Z",
    "latestVehicleEndTime": "2024-02-13T00:38:42Z",
    "totalCost": 18.603,
    "costs": {
      "model.vehicles.cost_per_kilometer": 18.603
    }
  }
}

サンプルコードの全文

リクエストを作成するのリクエストに対する完全なレスポンスの例は次のようになります。

{
  "routes": [
    {
      "vehicleStartTime": "2024-02-13T00:00:00Z",
      "vehicleEndTime": "2024-02-13T00:38:42Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2024-02-13T00:00:00Z",
          "detour": "0s"
        },
        {
          "startTime": "2024-02-13T00:19:31Z",
          "detour": "0s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        {
          "travelDuration": "1171s",
          "travelDistanceMeters": 9004,
          "waitDuration": "0s",
          "totalDuration": "1171s",
          "startTime": "2024-02-13T00:00:00Z"
        },
        {
          "travelDuration": "1151s",
          "travelDistanceMeters": 9599,
          "waitDuration": "0s",
          "totalDuration": "1151s",
          "startTime": "2024-02-13T00:19:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 1,
        "travelDuration": "2322s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "0s",
        "totalDuration": "2322s",
        "travelDistanceMeters": 18603
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 18.603
      },
      "routeTotalCost": 18.603
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 1,
      "travelDuration": "2322s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "2322s",
      "travelDistanceMeters": 18603
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2024-02-13T00:00:00Z",
    "latestVehicleEndTime": "2024-02-13T00:38:42Z",
    "totalCost": 18.603,
    "costs": {
      "model.vehicles.cost_per_kilometer": 18.603
    }
  }
}