Antwort interpretieren

Die Route Optimization API gibt Routen für Fahrzeuge in der entsprechenden Anfrage zurück. Lieferungen werden Fahrzeugen zugewiesen oder können je nach Eigenschaften der Anfrage übersprungen werden.

Eine OptimizeToursResponse-Nachricht (REST, gRPC) hat zwei wichtige Eigenschaften auf oberster Ebene:

  • routes[] sind die Routen für jedes Fahrzeug mit den zugewiesenen Sendungen. Jede Route enthält Messwerte, die die Attribute der jeweiligen Route widerspiegeln.
  • metrics sind aggregierte Messwerte für die gesamte Antwort, unabhängig davon, ob es sich um Fahrzeuge und Routenpläne handelt. Messwerte auf oberster Ebene enthalten dieselben Attribute wie Messwerte für einzelne Routen. Die Werte werden für alle Routen aggregiert.

Einige Eigenschaften werden je nach Optimierungsergebnissen möglicherweise nicht immer ausgefüllt:

  1. skippedShipments[] listet Sendungen auf, die von keinem Fahrzeug durchgeführt werden. Eine Sendung kann übersprungen werden, wenn sie nicht innerhalb der festgelegten Einschränkungen durchgeführt werden kann oder die Kosten für die Durchführung über die Strafgebühren hinausgehen. Wenn beispielsweise die timeWindow für die Abholung oder Zustellung einer Sendung sehr schmal ist, ist es unter Umständen nicht möglich oder kostengünstig, den Besuch im erforderlichen Zeitfenster durchzuführen.
  2. validationErrors[] gibt Fehler an, die dazu führen, dass die Anfrage ungültig oder nicht zu beheben ist, wenn solvingMode der Anfrage auf VALIDATE_ONLY gesetzt ist. Im normalen DEFAULT_SOLVE-Modus werden Validierungsfehler in einer Fehlermeldung statt im Antworttext angezeigt. Beachten Sie, dass der Lösungsmodus von VALIDATE_ONLY mehrere Fehler gleichzeitig melden kann. Dies ist nützlich, um Anfragen schnell zu beheben.

Routeneigenschaften

Jeder routes[]-Eintrag ist eine ShipmentRoute-Nachricht (REST, gRPC). Jede ShipmentRoute steht für die Routenzuweisung für ein bestimmtes Fahrzeug aus der Anfrage. Zu den wichtigen ShipmentRoute-Properties im Zusammenhang mit der zugehörigen Vehicle gehören:

  • vehicleIndex ist der nullbasierte Index von Vehicle in der entsprechenden Anfragenachricht. Bei REST-Antworten wird dieses Attribut weggelassen, wenn der Wert null ist.
  • vehicleStartTime ist der Zeitpunkt, zu dem das Fahrzeug mit seiner Route beginnen muss.
  • vehicleEndTime ist die Uhrzeit, zu der das Fahrzeug voraussichtlich seine Route beenden wird.

In einer Antwort sieht routes so aus:

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

Jede ShipmentRoute enthält eine sortierte Liste von visits, die das Fahrzeug vervollständigt. Jede Visit (REST, gRPC) stellt eine VisitRequest (REST, gRPC) aus der entsprechenden Anfrage dar. Wichtige Visit-Attribute sind:

  • shipmentIndex ist der nullbasierte Index der Sendung, zu der dieser Besuch in der entsprechenden Anfrage gehört.
  • isPickup ist „true“, wenn ein Besuch eine Abholung ist, und „false“, wenn es sich bei einem Besuch um eine Lieferung handelt. REST-Antworten lassen dieses Attribut weg, wenn der Wert „false“ ist.
  • visitRequestIndex ist der nullbasierte Index von VisitRequest aus Shipment.pickups oder Shipment.deliveries in der entsprechenden Anfrage, die das Visit darstellt. REST-Antworten lassen dieses Attribut weg, wenn der Wert null ist.
  • startTime ist die Uhrzeit, zu der der Besuch voraussichtlich beginnen wird.
  • loadDemands ordnet den Ladetyp dem Ladevolumen zu, das zum Abschluss von Visit erforderlich ist. Die Ladungsbeträge sind bei Lieferbesuchen negativ und stellen die Ladung dar, die vom Fahrzeug abgenommen wird.

Ein Visit-Beispiel sieht so aus:

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

Jede ShipmentRoute enthält eine geordnete Liste von transitions, die die Fahrt zwischen visits für ein bestimmtes Fahrzeug darstellen. Wichtige Attribute der Transition-Nachricht (REST, gRPC) sind:

  • startTime ist der Zeitpunkt, zu dem das Fahrzeug mit dem Wechsel beginnt.
  • travelDuration ist die Dauer, die das Fahrzeug für den Wechsel zurücklegen muss.
  • travelDistanceMeters ist die Entfernung in Metern, die das Fahrzeug zurücklegen muss, um den Übergang abzuschließen.
  • trafficInfoUnavailable gibt an, ob für die Umstellung Verkehrsdaten verfügbar sind.
  • waitDuration steht für die Leerlaufzeit, die das Fahrzeug wartet, bevor es in die nächste Visit-Phase starten kann. Dies kann an den start_time der folgenden Visit liegen.
  • totalDuration ist die Gesamtdauer des Übergangs, einschließlich Reise-, Warte-, Pausen- und Verspätungszeiten.
  • vehicleLoads ordnet den Ladetyp dem Ladevolumen zu, das das Fahrzeug während dieses Übergangs transportiert.

Ein Transition-Beispiel sieht so aus:

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

Die Beziehung zwischen vists und transitions wird unter Optimierung von Abhol- und Lieferstopps sowie in der ShipmentRoute-Referenzdokumentation (REST, gRPC) beschrieben.

Messwerteigenschaften

Die Metrics-Nachricht (REST, gRPC) fasst die gesamte Lösung zusammen. Zu den wichtigen Metrics-Properties gehören:

  • totalCost sind die Gesamtkosten, die für die Fertigstellung der Routen anfallen. Weitere Informationen zu Kosten finden Sie unter Kostenmodellparameter.
  • usedVehicleCount ist die Gesamtzahl der in der Lösung verwendeten Fahrzeuge. Fahrzeuge können leere Routen haben, wenn die Optimierung feststellt, dass ihre Verwendung unnötig ist.
  • skippedMandatoryShipmentCount ist die Anzahl der übersprungenen Sendungen, die „obligatorisch“ sind. Bei einer obligatorischen Sendung ist keine penaltyCost angegeben, die beim Überspringen der Sendung entsteht. Obligatorische Sendungen können dennoch übersprungen werden, wenn ihre Leistung unter bestimmten Einschränkungen nicht realisierbar ist. Weitere Informationen zu Kosten finden Sie unter Kostenmodellparameter.

Zusätzliche Messwerte werden als AggregatedMetrics-Nachrichten (REST, gRPC) gemeldet. Der Nachrichtentyp AggregatedMetrics wird für das Attribut Metrics.aggregatedRouteMetrics verwendet und für das Attribut ShipmentRoute.metrics Metrics.aggregatedRouteMetrics enthält es Messwerte, die für alle ShipmentRoutes im OptimizeToursResponse aggregiert sind. Jedes ShipmentRoute.metrics-Attribut enthält Messwerte für die jeweilige ShipmentRoute.

Wichtige AggregatedMetrics-Properties sind:

  • performedShipmentCount ist die Anzahl der Sendungen, die von Fahrzeugen auf ihren gesamten Routen ausgeführt werden.
  • travelDuration ist die Gesamtzeit, die die Fahrzeuge während der Abfahrtszeit auf ihren Routen verbringen.
  • waitDuration ist die Gesamtzeit, die die Fahrzeuge beim Abschließen ihrer Routen warten.
  • delayDuration ist die Gesamtverzögerungszeit der Fahrzeuge. Dieser Wert ist in der Regel null, es sei denn, in der Anfrage werden TransitionAttributes verwendet.
  • breakDuration ist die Gesamtzeit, die ein Fahrzeug während der Abfahrt der Route in Pausen verbringt.
  • visitDuration ist die Gesamtzeit, die die Fahrzeuge während der Abfahrt der Route für Besuche aufwenden. Das ist die Summe aller VisitRequest.duration-Werte für VisitRequest, die den Visits entsprechen, die dem jeweiligen Fahrzeug zugewiesen sind.
  • totalDuration ist die Gesamtdauer, die für die Routen des Fahrzeugs erforderlich ist.
  • travelDistanceMeters ist die Gesamtstrecke, die die Fahrzeuge auf ihren Routen zurücklegen.
  • maxLoads ordnet die Lasttypen dem maximalen Ladevolumen zu, das die Fahrzeuge an einem beliebigen Punkt auf ihren Routen tragen.

Eine Metrics-Nachricht sieht beispielsweise so aus:

{
  "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
    }
  }
}

Vollständiges Beispiel

Eine vollständige Beispielantwort auf die Anfrage von Compose a Request sieht so aus:

{
  "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
    }
  }
}