Method: projects.locations.optimizeTours

Sendet eine OptimizeToursRequest mit einer ShipmentModel und gibt eine OptimizeToursResponse mit ShipmentRoute zurück. Das sind eine Reihe von Routen, die von Fahrzeugen gefahren werden sollen, um die Gesamtkosten zu minimieren.

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

Ziel ist es, ShipmentRoutes so Vehicles 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 zum Anrufen festlegen.

Format:

  • projects/{project-id}
  • projects/{project-id}/locations/{location-id}

Wenn kein Ort 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 ist, je nachdem, was zuerst 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)

Der Standardmodus ist DEFAULT_SOLVE (0).

searchMode

enum (SearchMode)

Der Suchmodus, der zum Beantworten der Anfrage verwendet wurde.

injectedFirstSolutionRoutes[]

object (ShipmentRoute)

Den Optimierungsalgorithmus dabei unterstützen, eine erste Lösung zu finden, 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:

  • Bei allen Routen muss vehicleIndex im Bereich liegen und darf nicht dupliziert werden.
  • Bei allen Besuchen müssen shipmentIndex und visitRequestIndex im Bereich liegen.
  • Auf eine Sendung darf nur in einer Route verwiesen werden.
  • Die Abholung einer Sendung mit Abholung und Zustellung muss vor der Zustellung erfolgen.
  • Es darf nur eine Abhol- oder Lieferalternative für eine Sendung durchgeführt werden.
  • Bei allen Routen verlängern sich die Zeiten (z.B. vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • Eine Lieferung darf nur mit einem zugelassenen Fahrzeug erfolgen. Ein Fahrzeug ist zulässig, wenn Shipment.allowed_vehicle_indices leer ist oder sein vehicleIndex in Shipment.allowed_vehicle_indices enthalten ist.

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

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Den Optimierungsalgorithmus so einschränken, dass die endgültige Lösung einer vorherigen Lösung ähnelt. Dies kann beispielsweise verwendet werden, um Abschnitte von Routen zu fixieren, die bereits abgeschlossen sind oder abgeschlossen werden sollen, aber nicht geändert werden dürfen.

Wenn die eingefügte Lösung nicht praktikabel 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 nicht leer, werden die angegebenen Routen aktualisiert, ohne dass die zugrunde liegende Reihenfolge der Besuche oder Reisezeiten geändert wird. Es werden nur andere Details aktualisiert. Das Modell wird dadurch nicht gelöst.

Seit November 2020 werden damit nur die Polylinien von nicht leeren Routen ausgefüllt. Außerdem muss populatePolylines 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 weiterhin zwischen allen Besuchen auf allen nicht leeren Routen eingefügt, unabhängig davon, ob die zugehörigen Sendungen oder Fahrzeuge ignoriert werden.

interpretInjectedSolutionsUsingLabels

boolean

Falls zutreffend:

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

Bei „true“ dürfen Labels in den folgenden Kategorien höchstens einmal in ihrer Kategorie vorkommen:

Wenn ein vehicleLabel in der eingefügten Lösung keinem angeforderten Fahrzeug entspricht, wird die entsprechende Route zusammen mit den zugehörigen Besuchen aus der Lösung entfernt. Wenn ein shipmentLabel in der eingefügten Lösung nicht mit einer Anfrage für den Versand übereinstimmt, wird der entsprechende Besuch aus der Lösung entfernt. Wenn ein SkippedShipment.label in der eingefügten Lösung nicht mit einer Anfrageübersendung übereinstimmt, wird das SkippedShipment aus der Lösung entfernt.

Wenn Sie Routenbesuche oder ganze Routen aus einer eingefügten Lösung entfernen, kann sich das auf die impliziten Einschränkungen auswirken. Das kann zu einer Änderung der Lösung, zu Validierungsfehlern oder zu einer Unmöglichkeit führen.

HINWEIS: Der Anrufer muss dafür sorgen, dass jede Vehicle.label (bzw. Shipment.label) identifiziert eindeutig eine Fahrzeug- (bzw. Sendungs-)Entität, die in den beiden relevanten Anfragen verwendet wird: der vorherigen Anfrage, die die in die eingefügte Lösung verwendete OptimizeToursResponse erzeugt hat, und der aktuellen Anfrage, die die eingefügte Lösung enthält. Die oben beschriebenen Prüfungen auf Einzigartigkeit reichen nicht aus, um diese Anforderung zu erfüllen.

considerRoadTraffic

boolean

Berücksichtigen Sie die Traffic-Schätzung bei der Berechnung der Felder ShipmentRoute 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

Bei „true“ werden Polylinien in Antwort-ShipmentRoutes eingefügt.

populateTransitionPolylines

boolean

Bei „true“ werden Polylinien und Routen-Tokens in der Antwort ShipmentRoute.transitions eingefügt.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Wenn dieser Wert 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 Anfragen mit langer Laufzeit ein deutlich höheres (aber immer noch geringes) Risiko besteht, dass sie unterbrochen werden.

useGeodesicDistances

boolean

Wenn „true“, werden die Entfernungen mit geodätischen Entfernungen anstelle von Google Maps-Entfernungen berechnet und die Reisezeiten mit geodätischen Entfernungen mit einer von geodesicMetersPerSecond definierten Geschwindigkeit.

label

string

Label, das zur Identifizierung dieser Anfrage verwendet werden kann und in OptimizeToursResponse.request_label zurückgegeben wird.

geodesicMetersPerSecond

number

Wenn useGeodesicDistances auf „true“ gesetzt ist, muss dieses Feld festgelegt werden. Es definiert die Geschwindigkeit, die zur Berechnung der Fahrzeiten verwendet wird. Der Wert muss mindestens 1,0 Meter/Sekunde betragen.

maxValidationErrors

integer

Kürzt die Anzahl der zurückgegebenen Validierungsfehler. Diese Fehler sind in der Regel an eine INVALID_ARGUMENT-Fehlernutzlast als BadRequest-Fehlerdetail angehängt (https://cloud.google.com/apis/design/errors#error_details), es sei denn, solvingMode=VALIDATE_ONLY: siehe das Feld OptimizeToursResponse.validation_errors. Der Standardwert ist 100 und der Höchstwert 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.