Method: projects.optimizeTours

Sendet eine OptimizeToursRequest mit einem ShipmentModel und gibt eine OptimizeToursResponse mit ShipmentRoutes zurück. Dies sind eine Reihe von Routen, die von Fahrzeugen ausgeführt werden sollen, um so die Gesamtkosten zu minimieren.

Ein ShipmentModel-Modell besteht hauptsächlich aus Shipments, die ausgeführt werden müssen, und Vehicles, die für den Transport der Shipments verwendet werden können. Die ShipmentRoute weisen den Vehicle-Werten Shipment-Werte zu. Genauer gesagt, wird jedem Fahrzeug eine Reihe von Visits zugewiesen, wobei eine Visit einer VisitRequest entspricht, also einem Abhol- oder Lieferservice für ein Shipment.

Das Ziel besteht darin, eine Zuweisung von ShipmentRoutes zu Vehicles bereitzustellen, um die Gesamtkosten zu minimieren, wenn bei den Kosten viele Komponenten in der ShipmentModel definiert sind.

HTTP-Anfrage

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

Die URL verwendet die Syntax der gRPC-Transcodierung.

Pfadparameter

Parameter
parent

string

Erforderlich. Zielprojekt oder -ort für den Aufruf.

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 überschritten oder die Serverfrist für synchrone Anfragen erreicht ist, je nachdem, was früher eintritt.

Bei asynchronen Anfragen generiert der Server (wenn möglich) vor Ablauf des Zeitlimits eine Lösung.

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)

Suchmodus, der zum Lösen der Anfrage verwendet wird.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Leiten Sie den Optimierungsalgorithmus an, um eine erste Lösung zu finden, die einer vorherigen Lösung ähnelt.

Das Modell wird beim Erstellen der ersten Lösung eingeschränkt. Alle Lieferungen, die nicht auf einer Route durchgeführt werden, werden in der ersten Lösung implizit übersprungen, können jedoch in aufeinanderfolgenden Lösungen durchgefü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 innerhalb des Bereichs liegen.
  • darf auf eine Sendung nur auf einer Route verwiesen werden.
  • die Abholung einer Lieferung zur Abholung und Lieferung muss vor der Lieferung erfolgen.
  • Es darf nicht mehr als eine Abhol- oder Lieferalternative einer Sendung ausgeführt werden.
  • steigen die Fahrzeiten für alle Routen (d.h. vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • Ein Versand darf nur mit einem zulässigen Fahrzeug durchgeführt werden. Ein Fahrzeug ist zulässig, wenn Shipment.allowed_vehicle_indices leer ist oder vehicleIndex in Shipment.allowed_vehicle_indices enthalten ist.
  • Wenn avoidUTurns auf „true“ gesetzt wird, muss für relevante Besuche injectedSolutionLocationToken festgelegt werden

Wenn die injizierte Lösung nicht durchführbar ist, wird nicht unbedingt ein Validierungsfehler zurückgegeben. Stattdessen wird möglicherweise ein Fehler zurückgegeben, der die Nichtdurchführbarkeit anzeigt.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Schränken Sie den Optimierungsalgorithmus ein, um eine endgültige Lösung zu finden, die einer vorherigen Lösung ähnelt. Dies kann beispielsweise verwendet werden, um Teile von Routen zu fixieren, die bereits abgeschlossen sind oder noch abgeschlossen werden müssen, aber nicht geändert werden dürfen.

Wenn die injizierte Lösung nicht durchführbar ist, wird nicht unbedingt ein Validierungsfehler zurückgegeben. Stattdessen wird möglicherweise ein Fehler zurückgegeben, der die Nichtdurchführbarkeit anzeigt.

refreshDetailsRoutes[]

object (ShipmentRoute)

Wenn das Feld nicht leer ist, werden die angegebenen Routen aktualisiert, ohne dass die zugrunde liegende Abfolge von Besuchen oder Fahrtzeiten geändert wird. Es werden nur andere Details aktualisiert. Damit ist das Modell nicht gelöst.

Seit dem 11. Dezember 2020 werden damit nur Polylinien nicht leerer Routen gefüllt und populatePolylines muss auf „true“ gesetzt sein.

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

Dieses Feld darf nicht zusammen mit injectedFirstSolutionRoutes oder injectedSolutionConstraint verwendet werden.

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

interpretInjectedSolutionsUsingLabels

boolean

Falls wahr:

Diese Interpretation gilt für die Felder injectedFirstSolutionRoutes, injectedSolutionConstraint und refreshDetailsRoutes. Sie kann verwendet werden, wenn sich die Versand- 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 der Anfrage hinzugefügt wurden.

Falls wahr, dürfen Labels in den folgenden Kategorien höchstens einmal in ihrer Kategorie vorkommen:

Wenn eine vehicleLabel in der injizierten Lösung nicht einem Anfragefahrzeug entspricht, wird die entsprechende Route zusammen mit den zugehörigen Besuchen aus der Lösung entfernt. Wenn ein shipmentLabel in der injizierten Lösung nicht mit einer Versandanfrage übereinstimmt, wird der entsprechende Besuch aus der Lösung entfernt. Wenn eine SkippedShipment.label in der injizierten Lösung nicht mit einer Versandanfrage übereinstimmt, wird die SkippedShipment aus der Lösung entfernt.

Das Entfernen von Routenbesuchen oder ganzer Routen aus einer eingefügten Lösung kann sich auf die implizierten Einschränkungen auswirken, was zu einer Änderung der Lösung, Validierungsfehlern oder Undurchführbarkeit führen kann.

HINWEIS: Der Aufrufer muss sicherstellen, dass jedes Vehicle.label (bzw. Shipment.label) identifiziert eindeutig eine Fahrzeugentität (bzw. die Versandentität), die für die beiden relevanten Anfragen verwendet wird: die letzte Anfrage, die die in der eingeschleusten Lösung verwendete OptimizeToursResponse generiert hat, und die aktuelle Anfrage, die die injizierte Lösung enthält. Die oben beschriebenen Prüfungen auf Eindeutigkeit reichen nicht aus, um diese Anforderung zu garantieren.

considerRoadTraffic

boolean

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

populatePolylines

boolean

Bei Einstellung auf „true“ werden Polylinien in Antwort-ShipmentRoutes ausgefüllt.

populateTransitionPolylines

boolean

Falls wahr, werden Polylinien in der Antwort ShipmentRoute.transitions ausgefüllt.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Wenn dieser festgelegt ist, kann die Anfrage ein Zeitlimit (siehe https://grpc.io/blog/deadlines) von bis zu 60 Minuten haben. Andernfalls beträgt die maximale Frist nur 30 Minuten. Beachten Sie, dass bei langlebigen Anfragen ein erheblich größeres, aber dennoch geringes Unterbrechungsrisiko besteht.

useGeodesicDistances

boolean

Falls wahr, werden die Entfernungen anhand von geodätischen Entfernungen und nicht anhand von Entfernungen aus Google Maps berechnet. Die Reisezeiten werden anhand von geodätischen Entfernungen berechnet, deren Geschwindigkeit durch geodesicMetersPerSecond definiert wird.

label

string

Label, das zur Identifizierung dieser Anfrage verwendet werden kann und im OptimizeToursResponse.request_label gemeldet wird.

geodesicMetersPerSecond

number

Wenn useGeodesicDistances auf „true“ gesetzt ist, muss dieses Feld festgelegt werden und definiert die Geschwindigkeit, die zur Berechnung von Fahrtzeiten verwendet wird. Der Wert muss mindestens 1,0 Meter/Sekunden betragen.

maxValidationErrors

integer

Kürzt die Anzahl der zurückgegebenen Validierungsfehler. Diese Fehler werden in der Regel als BadRequest-Fehlerdetail an die Fehlernutzlast INVALID_ARGUMENT angehängt (https://cloud.google.com/apis/design/errors#error_details). Es sei denn, ResolveMode=VALIDATE_ONLY: Siehe Feld OptimizeToursResponse.validation_errors. Der Standardwert ist 100 und ist auf 10.000 begrenzt.

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.