Method: projects.optimizeTours

Sendet eine OptimizeToursRequest mit einem ShipmentModel und gibt ein OptimizeToursResponse mit ShipmentRoutes zurück. Dabei handelt es sich um eine Reihe von Routen, die von Fahrzeugen ausgeführt werden sollen, 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 Vehicles Shipments zu. Genauer gesagt, wird jedem Fahrzeug eine Reihe von Visits zugewiesen, wobei eine Visit einer VisitRequest entspricht, bei der es sich um eine Abholung oder Lieferung für ein Shipment handelt.

Ziel ist es, eine Zuweisung von ShipmentRoute zu Vehicles zu ermöglichen, sodass die Gesamtkosten minimiert werden, wenn die Kosten in ShipmentModel viele Komponenten enthalten.

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 -standort für den Anruf.

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 wird, gibt der Server eine Antwort zurück, bevor das Zeitlimit oder das Zeitlimit für synchrone Anfragen des Servers erreicht ist, je nachdem, was früher eintritt.

Bei asynchronen Anfragen generiert der Server nach Möglichkeit eine Lösung, bevor das Zeitlimit überschritten wird.

Eine Dauer in Sekunden mit bis zu neun Nachkommastellen, die auf „s“ endet. Beispiel: "3.5s".

model

object (ShipmentModel)

Zu lösendes Versandmodell.

solvingMode

enum (SolvingMode)

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

searchMode

enum (SearchMode)

Suchmodus, der zum Lösen 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 ist eingeschränkt, wenn die erste Lösung erstellt wird. Alle Lieferungen, die nicht auf einer Route ausgeführt werden, werden in der ersten Lösung implizit übersprungen, können jedoch in aufeinanderfolgenden Lösungen ausgeführt werden.

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

  • Für alle Routen muss vehicleIndex im Bereich liegen und nicht dupliziert werden.
  • Bei allen Besuchen müssen shipmentIndex und visitRequestIndex im Bereich liegen.
  • Auf eine Sendung darf nur auf einer Route verwiesen werden.
  • Die Abholung einer Sendung mit Abholung muss vor der Lieferung erfolgen.
  • darf nicht mehr als eine Abhol- oder Lieferalternative einer Sendung ausgeführt werden.
  • steigen die Zeiten für alle Routen (d.h. vehicleStartTime <= visits[0].start_time <= visits[1].start_time ... <= vehicleEndTime).
  • darf eine Sendung nur in einem zulässigen Fahrzeug durchgeführt werden. Ein Fahrzeug ist zulässig, wenn Shipment.allowed_vehicle_indices leer ist oder sein vehicleIndex in Shipment.allowed_vehicle_indices enthalten ist.

Wenn die injizierte Lösung nicht machbar ist, wird nicht unbedingt ein Validierungsfehler zurückgegeben. Stattdessen wird möglicherweise ein Fehler zurückgegeben, der auf eine Nichtdurchführbarkeit hinweist.

injectedSolutionConstraint

object (InjectedSolutionConstraint)

Den Optimierungsalgorithmus einschränken, um eine endgültige Lösung zu finden, die einer früheren Lösung ähnelt. Sie können damit beispielsweise Teile von Routen fixieren, die bereits abgeschlossen wurden oder die noch fertiggestellt werden sollen, aber nicht geändert werden dürfen.

Wenn die injizierte Lösung nicht machbar ist, wird nicht unbedingt ein Validierungsfehler zurückgegeben. Stattdessen wird möglicherweise ein Fehler zurückgegeben, der auf eine Nichtdurchführbarkeit hinweist.

refreshDetailsRoutes[]

object (ShipmentRoute)

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

Seit 2020/11 wird damit nur die Polylinien nicht leerer Routen ausgefüllt und populatePolylines muss „true“ 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 keinen Einfluss auf das Verhalten. Polylinien werden weiterhin zwischen allen Besuchen auf allen nicht leeren Routen eingefügt, unabhängig davon, ob die entsprechenden 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 Versand- oder Fahrzeugindexe in der Anfrage seit Erstellung der Lösung geändert haben, z. B. weil Sendungen oder Fahrzeuge aus der Anfrage entfernt oder ihr hinzugefügt wurden.

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

Wenn ein vehicleLabel in der injizierten Lösung keinem Anfragefahrzeug entspricht, wird die entsprechende Route zusammen mit den Besuchen aus der Lösung entfernt. Wenn ein shipmentLabel in der injizierten Lösung keinem Versand der Anfrage entspricht, wird der entsprechende Besuch aus der Lösung entfernt. Wenn ein SkippedShipment.label in der injizierten Lösung keiner Sendung der Anfrage entspricht, wird die SkippedShipment aus der Lösung entfernt.

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

HINWEIS: Der Aufrufer muss darauf achten, dass jede Vehicle.label (resp. Shipment.label) identifiziert eindeutig eine Fahrzeugentität (bzw. Versandentität), die bei den beiden relevanten Anfragen verwendet wird: die vorherige Anfrage, die die in der eingefügten Lösung verwendete OptimizeToursResponse generiert hat, und die aktuelle Anfrage, die die eingeschleuste Lösung enthält. Die oben beschriebenen Eindeutigkeitsprüfungen reichen nicht aus, um diese Anforderung zu garantieren.

considerRoadTraffic

boolean

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

populatePolylines

boolean

Wenn „true“ festgelegt ist, werden Polylinien in Antwort-ShipmentRoutes ausgefüllt.

populateTransitionPolylines

boolean

Wenn „true“ festgelegt ist, werden Polylinien in der Antwort ShipmentRoute.transitions ausgefüllt.

allowLargeDeadlineDespiteInterruptionRisk

boolean

Wenn diese Richtlinie festgelegt ist, kann für die Anfrage eine Frist von bis zu 60 Minuten festgelegt werden (siehe https://grpc.io/blog/deadlines). Andernfalls beträgt die maximale Frist nur 30 Minuten. Beachten Sie, dass langlebige Anfragen ein deutlich größeres, aber dennoch geringes Unterbrechungsrisiko haben.

useGeodesicDistances

boolean

Ist dies der Fall, werden Entfernungen anhand geodätischer Entfernungen statt anhand von Google Maps-Entfernungen berechnet. Die Reisezeiten werden anhand geodätischer Entfernungen mit einer durch geodesicMetersPerSecond definierten Geschwindigkeit berechnet.

label

string

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

geodesicMetersPerSecond

number

Wenn useGeodesicDistances „true“ ist, muss dieses Feld festgelegt werden und definiert die Geschwindigkeit, die zur Berechnung der Fahrtzeit 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 an die Fehlernutzlast INVALID_ ARGUMENT als Fehlerdetail BadRequest angehängt (https://cloud.google.com/apis/design/errors#error_details), es sei denn, solveMode=VALIDATE_ONLY: siehe Feld OptimizeToursResponse.validation_errors. Der Standardwert ist 100,die maximale Anzahl ist 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