Antwort interpretieren

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

Eine OptimizeToursResponse-Nachricht (REST, gRPC) hat zwei Haupteigenschaften 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 zusammengefasste Messwerte für die gesamte Antwort für alle Fahrzeuge und Routenpläne. Messwerte der obersten Ebene enthalten dieselben Eigenschaften wie Messwerte pro Route, wobei Werte für alle Routen aggregiert werden.

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

  1. skippedShipments[] listet Lieferungen auf, die von keinem Fahrzeug durchgeführt werden. Eine Sendung kann übersprungen werden, wenn sie nicht innerhalb der angegebenen Einschränkungen ausgeführt werden kann oder die Kosten für die Lieferung die Strafkosten überschreiten. Wenn z. B. die Abholung oder Lieferung einer Sendung einen sehr engen timeWindow hat, ist es unter Umständen nicht möglich oder kostengünstig, den Besuch während des erforderlichen Zeitfensters von einem Fahrzeug durchzuführen.
  2. validationErrors[] gibt Fehler an, die dazu führen, dass die Anfrage ungültig oder nicht gelöst werden kann, wenn der solvingMode der Anfrage auf VALIDATE_ONLY festgelegt ist. Im normalen DEFAULT_SOLVE-Modus werden Validierungsfehler in einer Fehlermeldung statt im Antworttext angezeigt. Im Lösungsmodus VALIDATE_ONLY können mehrere Fehler gleichzeitig gemeldet werden, was für die schnelle Fehlerbehebung von Anfragen hilfreich ist.

Routenattribute

Jeder routes[]-Eintrag ist eine ShipmentRoute-Nachricht (REST, gRPC). Jede ShipmentRoute stellt die Routenzuweisung für ein bestimmtes Fahrzeug aus der Anfrage dar. Zu den wichtigen ShipmentRoute-Properties im Zusammenhang mit der entsprechenden 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 die Zeit, zu der das Fahrzeug seine Route beginnen muss.
  • vehicleEndTime gibt die Zeit an, zu der das Fahrzeug voraussichtlich seine Route beenden soll.

In der 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 ausführen wird. Jede Visit (REST, gRPC) stellt eine VisitRequest (REST, gRPC) aus der entsprechenden Anfrage dar. Zu den wichtigen Visit-Attributen gehören:

  • shipmentIndex ist der nullbasierte Index der Sendung, zu der dieser Besuch in der entsprechenden Anfrage gehört.
  • isPickup ist „true“, wenn ein Besuch ein Abholort ist, und „false“, wenn ein Besuch eine Auslieferung ist. Bei REST-Antworten wird dieses Attribut weggelassen, wenn der Wert „false“ ist.
  • visitRequestIndex ist der nullbasierte Index von VisitRequest aus Shipment.pickups oder Shipment.deliveries in der entsprechenden Anfrage, die Visit darstellt. Bei REST-Antworten wird dieses Attribut weggelassen, wenn der Wert null ist.
  • startTime ist die Zeit, zu der der Besuch voraussichtlich beginnen wird.
  • loadDemands ordnet den Ladetyp zu, um die zum Ausführen des Visit erforderliche Lademenge zu laden. Die Lastenwerte sind für Lieferbesuche negativ und stellen die Last dar, die vom Fahrzeug entfernt 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 Fahrten zwischen visits für ein bestimmtes Fahrzeug darstellen. Zu den wichtigen Attributen der Transition-Nachricht (REST, gRPC) gehören:

  • startTime ist die Zeit, zu der das Fahrzeug mit der Umstellung beginnt.
  • travelDuration ist die Dauer, die das Fahrzeug für die Umstellung fahren muss.
  • travelDistanceMeters ist die Strecke in Metern, die das Fahrzeug für die Umstellung zurücklegen muss.
  • trafficInfoUnavailable gibt an, ob für die Umstellung Verkehrsdaten verfügbar sind.
  • waitDuration steht für die Leerlaufzeit, die ein Fahrzeug wartet, bevor es den nächsten Visit starten kann. Dieser kann aufgrund der start_time der folgenden Visit anfallen.
  • totalDuration ist die Gesamtdauer des Übergangs, einschließlich Fahrt-, Wartezeit-, Pausen- und Verspätungszeiten.
  • vehicleLoads ordnet den Ladetyp den Lasten zu, die 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.

Messwertattribute

Die Metrics-Nachricht (REST, gRPC) fasst die gesamte Lösung zusammen. Einige wichtige Metrics-Properties sind:

  • totalCost sind die Gesamtkosten, die bei der Durchführung 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 nicht erforderlich ist.
  • skippedMandatoryShipmentCount gibt die Anzahl der übersprungenen Sendungen an, die „erforderlich“ sind. Eine obligatorische Sendung gibt keine penaltyCost an, die erhoben wird, wenn die Sendung übersprungen wird. Obligatorische Sendungen können trotzdem ü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 Mitteilungstyp AggregatedMetrics wird für die Property Metrics.aggregatedRouteMetrics verwendet und für die Property ShipmentRoute.metrics enthält Metrics.aggregatedRouteMetrics Messwerte, die für alle ShipmentRoutes in OptimizeToursResponse zusammengefasst sind. Jedes ShipmentRoute.metrics-Attribut enthält Messwerte für die jeweilige ShipmentRoute.

Zu den wichtigen AggregatedMetrics-Unterkünften gehören:

  • performedShipmentCount ist die Anzahl der Lieferungen, die von Fahrzeugen auf ihren gesamten Routen ausgeführt werden.
  • travelDuration ist die Gesamtzeit, die die Fahrzeuge auf ihrer Route durchfahren.
  • waitDuration ist die Gesamtzeit, die die Fahrzeuge warten, während sie ihre Routen abschließen.
  • delayDuration ist die Gesamtverzögerungszeit für die Fahrzeuge. Dieser Wert ist normalerweise null, es sei denn, TransitionAttributes werden in der Anfrage verwendet.
  • breakDuration ist die Gesamtzeit, die die Fahrzeuge beim Abfahren der Routen in den Pausen verbringen.
  • visitDuration gibt die Gesamtzeit an, die die Fahrzeuge für die Durchführung ihrer Routen aufwenden. Das ist effektiv die Summe aller VisitRequest.duration-Werte für VisitRequest-Werte, die den Visit-Werten 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 beim Abschließen ihrer Routen zurückgelegt haben.
  • maxLoads ordnet Ladetypen dem maximalen Ladevolumen zu, das die Fahrzeuge zu jedem Zeitpunkt auf ihren Routen mitnehmen.

Hier ein Beispiel für eine Metrics-Nachricht:

{
  "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 Eine Anfrage erstellen 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
    }
  }
}