Method: projects.locations.optimizeTours

Es wird eine OptimizeToursRequest mit einer ShipmentModel gesendet und eine OptimizeToursResponse mit ShipmentRoutes zurückgegeben. Das sind eine Reihe von Routen, die von Fahrzeugen ausgeführt werden, um die Gesamtkosten zu minimieren.

Ein ShipmentModel-Modell besteht hauptsächlich aus Shipments, die ausgeführt werden müssen, und Vehicles, die zum Transport der Shipments verwendet werden können. Die ShipmentRoutes weisen Shipments den Vehicles zu. Konkret ordnet er jedem Fahrzeug eine Reihe von Visit zu, wobei eine Visit einer VisitRequest entspricht, also einer Abholung oder Lieferung für eine Shipment.

Ziel ist es, ShipmentRoutes den Vehicles so zuzuweisen, dass die Gesamtkosten minimiert werden. Die Kosten haben viele Komponenten, die in der ShipmentModel definiert sind.

HTTP-Anfrage

POST https://routeoptimization.googleapis.com/v1/{parent=projects/*/locations/*}:optimizeTours

Die URL verwendet die Syntax der gRPC-Transcodierung.

Pfadparameter

Parameter
parent

string

Erforderlich. Zielprojekt oder -standort für einen Anruf festlegen.

Format: * projects/{project-id} * projects/{project-id}/locations/{location-id}

Wenn kein Standort angegeben ist, wird automatisch eine Region ausgewählt.

Anfragetext

Der Anfragetext enthält Daten mit folgender Struktur:

JSON-Darstellung
{
  "timeout": string,
  "model": {
    object (ShipmentModel)
  },
  "solvingMode": enum (SolvingMode),
  "searchMode": enum (SearchMode),
  "injectedFirstSolutionRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "injectedSolutionConstraint": {
    object (InjectedSolutionConstraint)
  },
  "refreshDetailsRoutes": [
    {
      object (ShipmentRoute)
    }
  ],
  "interpretInjectedSolutionsUsingLabels": boolean,
  "considerRoadTraffic": boolean,
  "populatePolylines": boolean,
  "populateTransitionPolylines": boolean,
  "allowLargeDeadlineDespiteInterruptionRisk": boolean,
  "useGeodesicDistances": boolean,
  "label": string,
  "geodesicMetersPerSecond": number,
  "maxValidationErrors": integer
}
Felder
timeout

string (Duration format)

Wenn dieses Zeitlimit festgelegt ist, gibt der Server eine Antwort zurück, bevor das Zeitlimit abgelaufen ist oder die Serverfrist für synchrone Anfragen erreicht wird, je nachdem, was früher eintritt.

Bei asynchronen Anfragen generiert der Server (falls möglich) eine Lösung, bevor das Zeitlimit abgelaufen ist.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

model

object (ShipmentModel)

Zu lösendes Versandmodell.

solvingMode

enum (SolvingMode)

Standardmäßig ist der Lösungsmodus DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Der Suchmodus, der zur Lösung der Anfrage verwendet wurde.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Den Optimierungsalgorithmus bei der Suche nach einer ersten Lösung unterstützen, die einer früheren Lösung ähnelt.

Das Modell wird eingeschränkt, wenn die erste Lösung erstellt wird. Alle Sendungen, die nicht auf einer Route ausgeführt werden, werden in der ersten Lösung implizit übersprungen, können aber in nachfolgenden Lösungen ausgeführt werden.

Die Lösung muss einige grundlegende Gültigkeitsannahmen erfüllen:

  • Für alle Routen muss vehicleIndex in Reichweite sein und darf nicht dupliziert werden.
  • Für alle Besuche müssen shipmentIndex und visitRequestIndex im Bereich liegen.
  • Eine Sendung darf nur auf einer Route referenziert werden.
  • Die Abholung eines Versands mit Abhol- und Zustelloption muss vor der Zustellung erfolgen.
  • Es kann nur eine Abhol- oder Lieferalternative für eine Sendung ausgewählt werden.
  • für alle Routen werden die Zeiten verlängert (d.h., vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • Eine Lieferung darf nur mit einem zulässigen Fahrzeug erfolgen. Ein Fahrzeug ist zulässig, wenn Shipment.allowed_vehicle_indices leer ist oder seine vehicleIndex in Shipment.allowed_vehicle_indices enthalten ist.

Wenn die eingebrachte Lösung nicht realisierbar ist, wird nicht unbedingt ein Validierungsfehler zurückgegeben. Stattdessen kann ein Fehler zurückgegeben werden, der auf die Unmöglichkeit hinweist.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Der Optimierungsalgorithmus wird so eingeschränkt, dass eine endgültige Lösung gefunden wird, die einer früheren Lösung ähnelt. So können Sie beispielsweise Teile von Routen sperren, die bereits abgeschlossen sind oder noch abgeschlossen werden sollen, aber nicht geändert werden dürfen.

Wenn die eingebrachte Lösung nicht realisierbar ist, wird nicht unbedingt ein Validierungsfehler zurückgegeben. Stattdessen kann ein Fehler zurückgegeben werden, der auf die Unmöglichkeit hinweist.

refreshDetailsRoutes[]

object (ShipmentRoute)

Wenn die Liste nicht leer ist, werden die angegebenen Routen aktualisiert, ohne dass die zugrunde liegende Abfolge der Besuche oder Fahrtzeiten geändert wird. Nur andere Details werden aktualisiert. Das Modell wird dadurch nicht gelöst.

Seit November 2020 werden damit nur die Polylinien nicht leerer Routen ausgefüllt. Außerdem muss populatePolylines auf „wahr“ gesetzt sein.

Die routePolyline-Felder der übergebenen Routen stimmen möglicherweise nicht mit Route transitions überein.

Dieses Feld darf nicht mit injectedFirstSolutionRoutes oder injectedSolutionConstraint verwendet werden.

Shipment.ignore und Vehicle.ignore haben keine Auswirkungen auf das Verhalten. Polylinien werden weiterhin zwischen allen Besuchen in allen nicht leeren Routen eingefügt, unabhängig davon, ob die zugehörigen Sendungen oder Fahrzeuge ignoriert werden.

interpretInjectedSolutionsUsingLabels

boolean

Wenn wahr:

Diese Interpretation gilt für die Felder injectedFirstSolutionRoutes, injectedSolutionConstraint und refreshDetailsRoutes. Sie kann verwendet werden, wenn sich die Sendungs- oder Fahrzeugindizes in der Anfrage seit der Erstellung der Lösung geändert haben, z. B. weil Sendungen oder Fahrzeuge aus der Anfrage entfernt oder hinzugefügt wurden.

Wenn diese Option aktiviert ist, dürfen Labels in den folgenden Kategorien höchstens einmal in ihrer Kategorie vorkommen:

Wenn ein vehicleLabel in der eingespritzten Lösung keinem Anfragefahrzeug entspricht, wird die entsprechende Route zusammen mit ihren Besuchen aus der Lösung entfernt. Wenn ein shipmentLabel in der eingespritzten Lösung nicht einer Anfragesendung entspricht, wird der entsprechende Besuch aus der Lösung entfernt. Wenn eine SkippedShipment.label in der eingespritzten Lösung nicht einer angeforderten Sendung entspricht, wird die SkippedShipment aus der Lösung entfernt.

Wenn Sie Routenbesuche oder ganze Routen aus einer eingespritzten Lösung entfernen, kann sich das auf die impliziten Einschränkungen auswirken. Dies kann zu Änderungen an der Lösung, Validierungsfehlern oder Undurchführbarkeit führen.

HINWEIS: Der Aufrufer muss dafür sorgen, dass jede Vehicle.label (bzw. Shipment.label) identifiziert eindeutig ein Fahrzeug- bzw. Versandelement, das in den beiden relevanten Anfragen verwendet wird: die vorherige Anfrage, die die in der eingespritzten Lösung verwendete OptimizeToursResponse generiert hat, und die aktuelle Anfrage, die die eingespritzte Lösung enthält. Die oben beschriebenen Prüfungen auf Eindeutigkeit reichen nicht aus, um diese Anforderung zu erfüllen.

considerRoadTraffic

boolean

Berücksichtigen Sie die Besucherzahlschätzung bei der Berechnung der ShipmentRoute-Felder Transition.travel_duration, Visit.start_time und vehicleEndTime, beim Festlegen des Felds ShipmentRoute.has_traffic_infeasibilities und bei der Berechnung des Felds OptimizeToursResponse.total_cost.

populatePolylines

boolean

Wenn „true“ festgelegt ist, werden Polylinien in Antwort-ShipmentRoutes eingefügt.

populateTransitionPolylines

boolean

Wenn „wahr“ festgelegt ist, werden Polylinien und Routen-Tokens in Antwort ShipmentRoute.transitions eingefügt.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Wenn diese Option festgelegt ist, kann die Anfrage ein Zeitlimit von bis zu 60 Minuten haben (siehe https://grpc.io/blog/deadlines). Andernfalls beträgt die maximale Frist nur 30 Minuten. Beachten Sie, dass bei langlebigen Anfragen das Risiko einer Unterbrechung deutlich höher (aber immer noch gering) ist.

useGeodesicDistances

boolean

Wenn „wahr“ festgelegt ist, werden Reisedistanzen anhand von geodätischen Entfernungen anstelle von Google Maps-Entfernungen berechnet. Reisezeiten werden anhand von geodätischen Entfernungen mit einer Geschwindigkeit berechnet, die durch geodesicMetersPerSecond definiert ist.

label

string

Label, das verwendet werden kann, um diese Anfrage zu identifizieren, die in der OptimizeToursResponse.request_label gemeldet wird.

geodesicMetersPerSecond

number

Wenn useGeodesicDistances auf „wahr“ gesetzt ist, muss dieses Feld festgelegt werden. Es definiert die Geschwindigkeit, die für die Berechnung der Fahrtzeiten verwendet wird. Der Wert muss mindestens 1,0 Meter/Sekunde betragen.

maxValidationErrors

integer

Die Anzahl der zurückgegebenen Validierungsfehler wird gekürzt. Diese Fehler werden in der Regel als BadRequest-Fehlerdetails (https://cloud.google.com/apis/design/errors#error_details) an eine INVALID_ARGUMENT-Fehlernutzlast angehängt, es sei denn, solvingMode=VALIDATE_ONLY (siehe Feld OptimizeToursResponse.validation_errors). Die Standardeinstellung ist 100 und die Obergrenze liegt bei 10.000.

Antworttext

Wenn der Vorgang erfolgreich abgeschlossen wurde, enthält der Antworttext eine Instanz von OptimizeToursResponse.

Autorisierungsbereiche

Erfordert den folgenden OAuth-Bereich:

  • https://www.googleapis.com/auth/cloud-platform

IAM-Berechtigungen

Erfordert die folgende IAM-Berechtigung für die Ressource parent:

  • routeoptimization.locations.use

Weitere Informationen finden Sie in der IAM-Dokumentation.