Antwort interpretieren

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

Eine OptimizeToursResponse-Nachricht (REST, gRPC) hat zwei Haupteigenschaften der obersten Ebene:

  • routes[] sind die Routen für jedes Fahrzeug mit den zugewiesenen Sendungen. Jedes Route enthält Messwerte, die die Eigenschaften der jeweiligen Route widerspiegeln.
  • metrics sind aggregierte Messwerte für die gesamte Antwort, für alle Fahrzeuge und Routenpläne. Messwerte der obersten Ebene enthalten dieselben Properties wie Messwerte pro Route, wobei die Werte für alle Routen zusammengefasst werden.

Je nach Optimierungsergebnissen werden einige Properties möglicherweise nicht immer ausgefüllt:

  1. skippedShipments[] enthält Sendungen, die nicht mit einem 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 Abholung oder Zustellung einer Sendung einen sehr engen timeWindow hat, ist es für ein Fahrzeug möglicherweise nicht möglich oder kostengünstig, den Besuch innerhalb des erforderlichen Zeitfensters durchzuführen.
  2. validationErrors[] gibt Fehler an, die die Anfrage ungültig machen oder deren Behebung unmöglich machen, wenn solvingMode der Anfrage auf VALIDATE_ONLY festgelegt ist. Im normalen DEFAULT_SOLVE-Modus werden Validierungsfehler in einer Fehlermeldung anstelle im Antworttext angezeigt. Im VALIDATE_ONLY-Lösungsmodus können mehrere Fehler gleichzeitig gemeldet werden. Das ist nützlich, um Anfragen schnell zu beheben.

Routeneigenschaften

Jeder routes[]-Eintrag ist eine ShipmentRoute-Nachricht (REST, gRPC). Jedes 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 der Vehicle in der entsprechenden Anfragenachricht. In REST-Antworten wird diese Eigenschaft weggelassen, wenn der Wert null ist.
  • vehicleStartTime ist die Uhrzeit, zu der das Fahrzeug seine Route beginnen muss.
  • vehicleEndTime ist die voraussichtliche Zeit, zu der das Fahrzeug seine Route beendet.

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 der visits, die das Fahrzeug zurücklegt. Jede Visit (REST, gRPC) entspricht einer VisitRequest (REST, gRPC) aus der entsprechenden Anfrage. Zu den wichtigen Visit Eigenschaften gehören:

  • shipmentIndex ist der Index der Sendung, zu der dieser Besuch in der entsprechenden Anfrage gehört, beginnend mit 0.
  • isPickup ist „wahr“, wenn es sich bei einem Besuch um eine Abholung handelt, und „falsch“, wenn es sich um eine Lieferung handelt. In REST-Antworten wird diese Eigenschaft weggelassen, 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. In REST-Antworten wird dieses Attribut weggelassen, wenn der Wert null ist.
  • startTime ist die voraussichtliche Uhrzeit des Besuchs.
  • loadDemands ordnet den Ladetyp der Lademenge zu, die zum Ausführen der Visit erforderlich ist. Bei Zustellfahrten sind die Ladungsmengen negativ, was bedeutet, dass Ladung aus dem Fahrzeug entfernt wird.

Ein Beispiel für Visit sieht so aus:

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

Jede ShipmentRoute enthält eine sortierte Liste von transitions, die Fahrten zwischen visits für ein bestimmtes Fahrzeug darstellen. Zu den wichtigen Transition-Nachrichteneigenschaften (REST, gRPC) gehören:

  • startTime ist der Zeitpunkt, zu dem das Fahrzeug mit der Umstellung beginnt.
  • travelDuration ist die Dauer, während der das Fahrzeug fahren muss, um den Übergang abzuschließen.
  • 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 Traffic-Daten 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 aufgrund der start_time der folgenden Visit geschehen.
  • totalDuration ist die Gesamtdauer des Übergangs, einschließlich Reise-, Warte-, Pausen- und Verspätungszeiten.
  • vehicleLoadsordnet den Ladetyp der Ladungsmenge zu, die das Fahrzeug während dieses Übergangs geladen hat.

Ein Transition-Beispiel sieht so aus:

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

Weitere Informationen zur Beziehung zwischen vists und transitions finden Sie unter Optimierung der Abhol- und Lieferstoppreihenfolge und in der Referenzdokumentation zu ShipmentRoute (REST, gRPC). Weitere Informationen zu den Eigenschaften routePolyline und routeToken einer Transition-Nachricht finden Sie unter Übergangspolylinien und Routentokens.

Messwerteigenschaften

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

  • totalCost sind die Gesamtkosten für die Ausführung der Routen. 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 der Optimierer feststellt, dass ihre Nutzung nicht erforderlich ist.
  • skippedMandatoryShipmentCount ist die Anzahl der übersprungenen Sendungen, die „erforderlich“ sind. Für eine obligatorische Sendung wird kein penaltyCost angegeben, der anfällt, wenn die Sendung übersprungen wird. Erforderliche Sendungen können trotzdem übersprungen werden, wenn ihre Leistung unter den angegebenen Einschränkungen nicht möglich 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 die Property Metrics.aggregatedRouteMetrics und für die Property ShipmentRoute.metrics verwendet. Metrics.aggregatedRouteMetrics enthält Messwerte, die für alle ShipmentRoutes in der OptimizeToursResponse aggregiert wurden. Jede ShipmentRoute.metrics-Property enthält Messwerte für diese spezifische ShipmentRoute.

Zu den wichtigen AggregatedMetrics-Properties gehören:

  • performedShipmentCount ist die Anzahl der Sendungen, die von Fahrzeugen auf ihren gesamten Routen ausgeführt werden.
  • travelDuration ist die Gesamtzeit, die die Fahrzeuge auf ihren Routen unterwegs sind.
  • waitDuration ist die Gesamtzeit, die die Fahrzeuge beim Durchfahren ihrer Routen warten.
  • delayDuration ist die Gesamtverzögerungszeit für die Fahrzeuge. Dieser Wert ist normalerweise null, es sei denn, in der Anfrage werden TransitionAttributes verwendet.
  • breakDuration ist die Gesamtzeit, die die Fahrzeuge während der Fahrten in Pausen verbringen.
  • visitDuration ist die Gesamtzeit, die die Fahrzeuge für Besuche auf ihren Routen aufwenden. Dies ist die Summe aller VisitRequest.duration-Werte für VisitRequests, die den Visits entsprechen, die dem betreffenden Fahrzeug zugewiesen sind.
  • totalDuration ist die Gesamtdauer, die für die Ausführung der Strecken der Fahrzeuge erforderlich ist.
  • travelDistanceMeters ist die Gesamtstrecke, die die Fahrzeuge bei der Ausführung ihrer Routen zurückgelegt haben.
  • 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
    }
  }
}