Package google.maps.routeoptimization.v1

Index

RouteOptimization

Ein Dienst zur Optimierung von Fahrzeugtouren.

Gültigkeit bestimmter Feldtypen:

  • google.protobuf.Timestamp
    • Die Zeiten werden in Unix-Zeit angegeben: Sekunden seit 1970-01-01T00:00:00+00:00.
    • Sekunden muss in [0, 253402300799], d.h. in [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] angegeben werden.
    • Nanos müssen nicht festgelegt oder auf „0“ festgelegt sein.
  • google.protobuf.Duration
    • Sekunden muss in [0, 253402300799], d.h. in [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] angegeben werden.
    • Nanos müssen nicht festgelegt oder auf „0“ festgelegt sein.
  • google.type.LatLng
    • Breitengrad muss im Bereich [-90.0, 90.0] angegeben werden.
    • Längengrad muss im Bereich [-180.0, 180.0] angegeben werden.
    • mindestens einer der Werte für Breitengrad und Längengrad darf nicht null sein.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Es werden Fahrzeugtouren für eine oder mehrere OptimizeToursRequest-Nachrichten im Batch optimiert.

Diese Methode ist ein Vorgang mit langer Ausführungszeit. Die Eingaben zur Optimierung (OptimizeToursRequest-Nachrichten) und Ausgaben (OptimizeToursResponse-Nachrichten) werden im benutzerdefinierten Format in Cloud Storage gelesen/geschrieben. Wie bei der OptimizeTours-Methode enthält jede OptimizeToursRequest eine 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.

Autorisierungsbereiche

Erfordert den folgenden OAuth-Bereich:

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

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

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.

Autorisierungsbereiche

Erfordert den folgenden OAuth-Bereich:

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

AggregatedMetrics

Zusammengefasste Messwerte für ShipmentRoute (bzw. für OptimizeToursResponse für alle Transition- und/oder Visit-Elemente (bzw. für alle ShipmentRoute)).

Felder
performed_shipment_count

int32

Anzahl der durchgeführten Sendungen. Beachten Sie, dass ein Paket für Abholung und Lieferung nur einmal gezählt wird.

travel_duration

Duration

Gesamtreisedauer für eine Route oder Lösung.

wait_duration

Duration

Gesamtwartezeit für eine Route oder Lösung.

delay_duration

Duration

Gesamtverzögerungszeit für eine Route oder Lösung.

break_duration

Duration

Gesamtdauer der Unterbrechung für eine Route oder Lösung.

visit_duration

Duration

Gesamtbesuchsdauer für eine Route oder eine Lösung.

total_duration

Duration

Die Gesamtdauer sollte der Summe aller obigen Angaben entsprechen. Bei Routen entspricht er außerdem:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Gesamtstrecke für eine Route oder Lösung.

max_loads

map<string, VehicleLoad>

Maximale Last, die auf der gesamten Route (entsprechend der Lösung) für jede der Mengen auf dieser Route (bzw. Lösung) erreicht wurde, berechnet als Maximalwert über alle Transition.vehicle_loads (entsprechend. ShipmentRoute.metrics.max_loads.

BatchOptimizeToursMetadata

Dieser Typ hat keine Felder.

Vorgangsmetadaten für BatchOptimizeToursRequest-Aufrufe.

BatchOptimizeToursRequest

Anfrage zur Batchoptimierung von Touren als asynchronen Vorgang Jede Eingabedatei sollte ein OptimizeToursRequest enthalten und jede Ausgabedatei enthält ein OptimizeToursResponse. Die Anfrage enthält Informationen zum Lesen/Schreiben und Parsen der Dateien. Alle Ein- und Ausgabedateien sollten sich im selben Projekt befinden.

Felder
parent

string

Erforderlich. Zielprojekt und Standort zum Anrufen festlegen.

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

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

model_configs[]

AsyncModelConfig

Erforderlich. Eingabe-/Ausgabeinformationen für jedes Kaufmodell, z. B. Dateipfade und Datenformate.

AsyncModelConfig

Informationen zur asynchronen Lösung eines Optimierungsmodells.

Felder
display_name

string

Optional. Benutzerdefinierter Modellname, kann von Nutzern als Alias verwendet werden, um Modelle im Blick zu behalten.

input_config

InputConfig

Erforderlich. Informationen zum Eingabemodell.

output_config

OutputConfig

Erforderlich. Die gewünschten Informationen zum Ausgabeort.

BatchOptimizeToursResponse

Dieser Typ hat keine Felder.

Antwort auf eine BatchOptimizeToursRequest. Dies wird im lang andauernden Vorgang zurückgegeben, nachdem der Vorgang abgeschlossen ist.

BreakRule

Regeln zum Erstellen von Pausen für ein Fahrzeug (z. B. Mittagspausen) Eine Pause ist ein zusammenhängender Zeitraum, in dem das Fahrzeug in seiner aktuellen Position inaktiv bleibt und keine Besuche durchführen kann. Es kann zu einer Unterbrechung kommen:

  • der Fahrt zwischen zwei Besichtigungen (einschließlich der Zeit direkt vor oder direkt nach einem Besuch, aber nicht in der Mitte eines Besuchs). In diesem Fall wird die Laufzeit zwischen den Besuchen verlängert.
  • oder vor dem Start des Fahrzeugs (das Fahrzeug darf nicht mitten in einer Pause starten). In diesem Fall hat dies keinen Einfluss auf die Startzeit des Fahrzeugs.
  • oder nach dem Ende des Fahrzeugs (Dito, mit der Endzeit des Fahrzeugs).
Felder
break_requests[]

BreakRequest

Reihenfolge der Pausen Siehe BreakRequest-Nachricht.

frequency_constraints[]

FrequencyConstraint

Möglicherweise gelten mehrere FrequencyConstraint. Sie müssen alle mit den BreakRequest dieser BreakRule erfüllt sein. Siehe FrequencyConstraint.

BreakRequest

Die Reihenfolge der Pausen, d.h. deren Anzahl und Reihenfolge, für jedes Fahrzeug muss im Voraus bekannt sein. Die wiederholten BreakRequests definieren diese Sequenz in der Reihenfolge, in der sie auftreten müssen. Ihre Zeitfenster (earliest_start_time / latest_start_time) können sich überschneiden, müssen aber mit der Bestellung kompatibel sein (es ist aktiviert).

Felder
earliest_start_time

Timestamp

Erforderlich. Die Untergrenze (einschließlich) zu Beginn der Unterbrechung.

latest_start_time

Timestamp

Erforderlich. Obergrenze (einschließlich) zu Beginn der Unterbrechung.

min_duration

Duration

Erforderlich. Die Mindestdauer der Unterbrechung. Muss positiv sein.

FrequencyConstraint

Die Häufigkeit und Dauer der oben angegebenen Pausen kann weiter eingeschränkt werden, indem eine Mindesthäufigkeit für Pausen erzwungen wird, z. B. „Alle 12 Stunden muss eine Pause von mindestens 1 Stunde stattfinden“. Wenn dies so interpretiert werden kann, dass in einem fließenden Zeitfenster von 12 Stunden mindestens eine Pause von mindestens einer Stunde vorhanden ist, würde dieses Beispiel so interpretiert werden: FrequencyConstraint:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

Das Timing und die Dauer der Pausen in der Lösung berücksichtigen alle diese Einschränkungen zusätzlich zu den Zeitfenstern und Mindestdauern, die bereits in BreakRequest angegeben sind.

Ein FrequencyConstraint kann in der Praxis auch für nicht aufeinanderfolgende Unterbrechungen gelten. Im folgenden Zeitplan wird beispielsweise das Beispiel „1h alle 12h“ berücksichtigt:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Felder
min_break_duration

Duration

Erforderlich. Minimale Pausendauer für diese Einschränkung. Nicht negativ. Siehe Beschreibung von FrequencyConstraint.

max_inter_break_duration

Duration

Erforderlich. Maximal zulässige Spanne für ein Zeitintervall auf der Route, das nicht zumindest teilweise eine Unterbrechung von duration >= min_break_duration enthält. Muss positiv sein.

DataFormat

Datenformate für Eingabe- und Ausgabedateien.

Enums
DATA_FORMAT_UNSPECIFIED Ungültiger Wert. Das Format darf nicht UNSPECIFIED sein.
JSON JavaScript Object Notation.
PROTO_TEXT Textformat „Protokollzwischenspeicher“. Siehe https://protobuf.dev/reference/protobuf/textformat-spec/

DistanceLimit

Ein Limit für die maximale Strecke, die zurückgelegt werden kann. Sie kann entweder hart oder weich sein.

Wenn ein „weiches Limit“ definiert ist, müssen sowohl soft_max_meters als auch cost_per_kilometer_above_soft_max definiert und nicht negativ sein.

Felder
max_meters

int64

Ein hartes Limit, das die Entfernung auf höchstens „max_meters“ beschränkt. Das Limit darf nicht negativ sein.

soft_max_meters

int64

Ein weiches Limit erzwingt kein maximales Entfernungslimit. Wenn es jedoch überschritten wird, entstehen Kosten, die zu den im Modell definierten Kosten mit derselben Einheit addiert werden.

Wenn definiert, muss „soft_max_meters“ kleiner als „max_meters“ sein und darf nicht negativ sein.

cost_per_kilometer_above_soft_max

double

Es fallen Kosten pro Kilometer an, wenn die Entfernung über dem Limit von soft_max_meters liegt. Die zusätzlichen Kosten sind 0, wenn die Entfernung unter dem Limit liegt. Andernfalls wird die Formel zur Berechnung der Kosten wie folgt verwendet:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Die Kosten dürfen nicht negativ sein.

GcsDestination

Der Google Cloud Storage-Speicherort, in den die Ausgabedatei(en) geschrieben wird.

Felder
uri

string

Erforderlich. Google Cloud Storage-URI.

GcsSource

Der Google Cloud Storage-Speicherort, aus dem die Eingabedatei gelesen wird.

Felder
uri

string

Erforderlich. URI eines Google Cloud Storage-Objekts im Format gs://bucket/path/to/object.

InjectedSolutionConstraint

Eine in die Anfrage eingefügte Lösung, einschließlich Informationen darüber, welche Besuche und wie sie eingeschränkt werden müssen.

Felder
routes[]

ShipmentRoute

Routen der einzuführenden Lösung. Einige Routen werden in der ursprünglichen Lösung möglicherweise weggelassen. Die Routen und übersprungenen Sendungen müssen die für injected_first_solution_routes aufgeführten grundlegenden Gültigkeitsannahmen erfüllen.

skipped_shipments[]

SkippedShipment

Lieferungen der Injektionslösung übersprungen. Einige davon werden in der ursprünglichen Lösung möglicherweise weggelassen. Siehe Feld routes.

constraint_relaxations[]

ConstraintRelaxation

Gibt für keine oder mehr Fahrzeuggruppen an, wann und wie stark die Einschränkungen gelockert werden sollen. Wenn dieses Feld leer ist, sind alle nicht leeren Fahrzeugrouten vollständig eingeschränkt.

ConstraintRelaxation

Gibt für eine Gruppe von Fahrzeugen an, bei welchen Schwellenwerten die Einschränkungen für Besuche auf welcher Ebene gelockert werden. Lieferungen im Feld skipped_shipment können nicht übersprungen werden und können daher nicht ausgeführt werden.

Felder
relaxations[]

Relaxation

Alle Lockerungen der Besuchsbeschränkung, die für Besuche auf Routen mit Fahrzeugen in vehicle_indices gelten.

vehicle_indices[]

int32

Gibt die Fahrzeugindexe an, für die die relaxations für die Besuchsbeschränkung gilt. Wenn das Feld leer ist, wird dies als Standardwert betrachtet und die relaxations gilt für alle Fahrzeuge, die nicht in anderen constraint_relaxations angegeben sind. Es kann höchstens eine Standardeinstellung geben, d.h., in höchstens einem Feld zum Lockern der Einschränkung darf vehicle_indices leer sein. Ein Fahrzeugindex kann nur einmal aufgeführt werden, auch wenn sich mehrere constraint_relaxations befinden.

Ein Fahrzeugindex wird genauso wie ShipmentRoute.vehicle_index kartiert, wenn interpret_injected_solutions_using_labels „wahr“ ist (siehe Kommentar zu fields).

Entspannung

Wenn relaxations leer ist, sind Startzeit und Reihenfolge aller Besuche am routes vollständig beschränkt, und in diese Routen können keine neuen Besuche eingefügt oder hinzugefügt werden. Außerdem sind die Start- und Endzeit eines Fahrzeugs in routes vollständig begrenzt, es sei denn, das Fahrzeug ist leer, d.h. es wurden keine Durchfahrten durchgeführt und used_if_route_is_empty im Modell auf „false“ gesetzt.

relaxations(i).level gibt das Entspannungsniveau der Einschränkung an, das auf einen Besuch #j angewendet wird, der folgende Kriterien erfüllt:

  • route.visits(j).start_time >= relaxations(i).threshold_time UND
  • j + 1 >= relaxations(i).threshold_visit_count

Ebenso wird das Starten des Fahrzeugs auf relaxations(i).level gelockert, wenn folgende Bedingungen erfüllt sind:

  • vehicle_start_time >= relaxations(i).threshold_time UND
  • relaxations(i).threshold_visit_count == 0 und das Ende des Fahrzeugs wird auf relaxations(i).level gelockert, wenn Folgendes erfüllt:
  • vehicle_end_time >= relaxations(i).threshold_time UND
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Wenn ein Entspannungsgrad angewendet wird, wenn ein Besuch die threshold_visit_count ODER die threshold_time trifft, fügen Sie zwei relaxations mit derselben level hinzu: eine mit nur threshold_visit_count und die andere mit nur threshold_time. Wenn ein Besuch die Bedingungen mehrerer relaxations erfüllt, gilt die strengste Stufe. Infolgedessen nimmt der Entspannungsgrad vom Start über die Routenbesichtigungen bis zum Ende der Route weniger ab.

Die Zeitangaben und die Abfolge von Routenbesuchen, die die Schwellenwertbedingungen einer beliebigen relaxations nicht erfüllen, sind vollständig eingeschränkt. In diese Abfolgen können keine Besuche eingefügt werden. Wenn das Start- oder Ende eines Fahrzeugs die Bedingungen einer Entspannung nicht erfüllt, wird die Zeit festgesetzt, es sei denn, das Fahrzeug ist leer.

Felder
level

Level

Die Stufe der Einschränkungslockerung, die gilt, wenn die Bedingungen bei oder nach threshold_time UND mindestens threshold_visit_count erfüllt sind.

threshold_time

Timestamp

Der Zeitpunkt, zu dem oder nach dem die level-Sperrung angewendet werden kann.

threshold_visit_count

int32

Anzahl der Besuche, bei denen oder nach der level Lockerung angewendet werden kann. Wenn threshold_visit_count 0 ist oder nicht festgelegt ist, kann die level direkt beim Starten des Fahrzeugs angewendet werden.

Wenn der Wert route.visits_size() + 1 lautet, kann die level nur auf die Fahrzeugseite angewendet werden. Wenn sie mehr als route.visits_size() + 1 ist, wird level überhaupt nicht auf diese Route angewendet.

Ebene

Drückt die verschiedenen einschränkenden Entspannungsstufen aus, die für einen Besuch angewendet werden und die folgenden, wenn die Schwellenwertbedingungen erfüllt sind.

Die folgende Aufzählung bezieht sich auf die zunehmende Entspannung.

Enums
LEVEL_UNSPECIFIED

Implizites Standardentspannungsniveau: Keine Beschränkungen werden gelockert, d.h. alle Besuche sind vollständig eingeschränkt.

Dieser Wert darf in level nicht explizit verwendet werden.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Startzeiten und Start- und Endzeiten der Fahrzeuge werden gelockert, aber jeder Besuch bleibt an dasselbe Fahrzeug gebunden und die Besuchsabfolge muss beobachtet werden: Zwischen den beiden oder davor kann kein Besuch eingefügt werden.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD Wie RELAX_VISIT_TIMES_AFTER_THRESHOLD, aber die Besuchssequenz ist auch gelockert: Besuche bleiben einfach an das Fahrzeug gebunden.
RELAX_ALL_AFTER_THRESHOLD Wie „RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD“, aber das Fahrzeug ist auch entspannt: Besuche sind zum oder nach dem Grenzwert völlig kostenlos und können unter Umständen nicht ausgeführt werden.

InputConfig

Geben Sie eine Eingabe für [BatchOptimizeTours][google.maps.routeOptimization.v1.RouteOptimizationService.BatchOptimizeTours] an.

Felder
data_format

DataFormat

Erforderlich. Das Format der Eingabedaten.

Union-Feld source. Erforderlich. Für source ist nur einer der folgenden Werte zulässig:
gcs_source

GcsSource

Ein Google Cloud Storage-Speicherort. Dies muss ein einzelnes Objekt (eine Datei) sein.

Standort

Zusammenfassung eines Standorts (ein geografischer Punkt und eine optionale Ausrichtung)

Felder
lat_lng

LatLng

Die geografischen Koordinaten des Wegpunkts

heading

int32

Die Kompassrichtung, die der Verkehrsrichtung zugeordnet ist. Mit diesem Wert wird die Seite der Straße angegeben, die als Start- und Zielseite verwendet werden soll. Die Richtungswerte können zwischen 0 und 360 liegen, wobei 0 eine Richtung nach Norden, 90 eine Richtung nach Osten usw. angibt.

OptimizeToursRequest

Anfrage, die an einen Lösungspartner für die Touroptimierung gesendet wird, der das zu lösende Versandmodell sowie Optimierungsparameter definiert.

Felder
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.

timeout

Duration

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.

model

ShipmentModel

Zu lösendes Versandmodell.

solving_mode

SolvingMode

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

search_mode

SearchMode

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

injected_first_solution_routes[]

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 vehicle_index im Bereich liegen und nicht dupliziert werden.
  • Bei allen Besuchen müssen shipment_index und visit_request_index 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. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • 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 vehicle_index 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.

injected_solution_constraint

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.

refresh_details_routes[]

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 populate_polylines muss „true“ sein.

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

Dieses Feld darf nicht zusammen mit injected_first_solution_routes oder injected_solution_constraint 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.

interpret_injected_solutions_using_labels

bool

Falls wahr:

Diese Interpretation gilt für die Felder injected_first_solution_routes, injected_solution_constraint und refresh_details_routes. 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 vehicle_label in der injizierten Lösung keinem Anfragefahrzeug entspricht, wird die entsprechende Route zusammen mit den Besuchen aus der Lösung entfernt. Wenn ein shipment_label 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.

consider_road_traffic

bool

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

populate_polylines

bool

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

populate_transition_polylines

bool

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

allow_large_deadline_despite_interruption_risk

bool

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.

use_geodesic_distances

bool

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 geodesic_meters_per_second definierten Geschwindigkeit berechnet.

label

string

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

geodesic_meters_per_second

double

Wenn use_geodesic_distances „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.

max_validation_errors

int32

Kürzt die Anzahl der zurückgegebenen Validierungsfehler. Diese Fehler werden normalerweise als BadRequest-Fehlerdetail (https://cloud.google.com/apis/design/errors#error_details) an die Nutzlast des Fehlers INVALID_ ARGUMENT angehängt, es sei denn, lösung_mode=VALIDATE_ONLY: siehe Feld OptimizeToursResponse.validation_errors. Der Standardwert ist 100,die maximale Anzahl ist 10.000.

SearchMode

Modus, der das Suchverhalten definiert und Kompromisse bei der Latenz im Vergleich zur Lösungsqualität eingeht. In allen Modi wird das Zeitlimit für globale Anfragen erzwungen.

Enums
SEARCH_MODE_UNSPECIFIED Nicht angegebener Suchmodus, entspricht RETURN_FAST.
RETURN_FAST Beenden Sie die Suche, nachdem Sie die erste gute Lösung gefunden haben.
CONSUME_ALL_AVAILABLE_TIME Investieren Sie Ihre gesamte verfügbare Zeit in die Suche nach besseren Lösungen.

SolvingMode

Definiert, wie der Solver die Anfrage verarbeiten soll. Wenn die Anfrage ungültig ist, wird in allen Modi außer VALIDATE_ONLY der Fehler INVALID_REQUEST angezeigt. Unter max_validation_errors können Sie die Anzahl der zurückgegebenen Fehler begrenzen.

Enums
DEFAULT_SOLVE Lösen Sie das Modell.
VALIDATE_ONLY Validiert nur das Modell, ohne es zu lösen: Es werden möglichst viele OptimizeToursResponse.validation_errors ausgefüllt.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Es werden nur Werte für OptimizeToursResponse.validation_errors oder OptimizeToursResponse.skipped_shipments gefüllt. Der Rest der Anfrage wird nicht beantwortet (status und routes sind in der Antwort nicht festgelegt). Wenn bei injected_solution_constraint-Routen Inkompatibilitäten festgestellt werden, werden diese in das Feld OptimizeToursResponse.validation_errors eingetragen und OptimizeToursResponse.skipped_shipments bleibt leer.

WICHTIG: Hier werden nicht alle nicht durchführbaren Sendungen zurückgeschickt, sondern nur die, die bei der Vorverarbeitung als nicht durchführbar eingestuft wurden.

OptimizeToursResponse

Reaktion nach Lösung eines Optimierungsproblems für Touren mit den Routen für jedes Fahrzeug, den übersprungenen Lieferungen und den Gesamtkosten der Lösung.

Felder
routes[]

ShipmentRoute

Für jedes Fahrzeug berechnete Routen; die i-te Route entspricht dem i-ten Fahrzeug im Modell.

request_label

string

Kopie von OptimizeToursRequest.label, wenn in der Anfrage ein Label angegeben wurde.

skipped_shipments[]

SkippedShipment

Die Liste aller übersprungenen Sendungen.

validation_errors[]

OptimizeToursValidationError

Liste aller Validierungsfehler, die wir unabhängig voneinander ermitteln konnten. Siehe die Erläuterung „MULTIPLE ERRORS“ (MEHRERE FEHLER) für die Nachricht OptimizeToursValidationError.

metrics

Metrics

Messwerte zu Dauer, Entfernung und Nutzung für diese Lösung.

Messwerte

Gesamtmesswerte, aggregiert über alle Routen.

Felder
aggregated_route_metrics

AggregatedMetrics

Über die Routen aggregiert. Jeder Messwert ist die Summe (oder der Höchstwert bei Ladevorgängen) über alle ShipmentRoute.metrics-Felder mit demselben Namen.

skipped_mandatory_shipment_count

int32

Anzahl der übersprungenen obligatorischen Sendungen.

used_vehicle_count

int32

Anzahl der verwendeten Fahrzeuge. Hinweis: Wenn eine Fahrzeugroute leer und Vehicle.used_if_route_is_empty „true“ ist, gilt das Fahrzeug als verwendet.

earliest_vehicle_start_time

Timestamp

Die früheste Startzeit für ein gebrauchtes Fahrzeug, berechnet als Mindestwert für alle gebrauchten Fahrzeuge von ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Die späteste Endzeit für ein gebrauchtes Fahrzeug, berechnet als Maximalwert für alle gebrauchten Fahrzeuge von ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Kosten der Lösung, aufgeschlüsselt nach kostenbezogenen Anfragefeldern. Die Schlüssel sind Proto-Pfade, die sich auf die OptimizeToursRequest-Eingabe beziehen, z. B. „model.shipments.pickups.cost“. Die Werte sind die vom entsprechenden Kostenfeld generierten Gesamtkosten, die über die gesamte Lösung aggregiert werden. Mit anderen Worten, cost["model.shipments.pickups.cost"] ist die Summe aller Abholkosten der Lösung. Alle im Modell definierten Kosten sind hier im Detail enthalten. Ausgenommen hiervon sind Kosten für TransitionAttributes, die seit 2022/01 nur in aggregierter Form erfasst werden.

total_cost

double

Gesamtkosten der Lösung. Die Summe aller Werte in der Kostenkarte.

OptimizeToursValidationError

Beschreibt einen Fehler, der beim Validieren eines OptimizeToursRequest aufgetreten ist.

Felder
code

int32

Ein Validierungsfehler wird durch das Paar (code, display_name) definiert, das immer vorhanden ist.

Die anderen Felder (unten) liefern mehr Kontext zum Fehler.

MEHRERE FEHLER: Bei mehreren Fehlern wird bei der Validierung versucht, mehrere Fehler auszugeben. Ähnlich wie ein Compiler ist dies ein nicht perfekter Prozess. Einige Validierungsfehler sind schwerwiegend, was bedeutet, dass die gesamte Validierung abgebrochen wird. Das ist unter anderem bei display_name="UNSPECIFIED"-Fehlern der Fall. Einige können dazu führen, dass bei der Validierung andere Fehler übersprungen werden.

Stabilität: code und display_name sollten sehr stabil sein. Es können jedoch im Laufe der Zeit neue Codes und Anzeigenamen angezeigt werden, was dazu führen kann, dass eine bestimmte (ungültige) Anfrage zu einem anderen Paar (code, display_name) führt, weil der neue Fehler das alte ausgeblendet hat (siehe "MEHRERE FEHLER").

REFERENZ: Eine Liste aller Paare (Code, Name):

  • UNSPECIFIED = 0;
  • VALIDATION_TIMEOUT_ERROR = 10; Die Validierung konnte nicht innerhalb der Frist abgeschlossen werden.
  • REQUEST_OPTIONS_ERROR = 12;

    • REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
    • REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
    • REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
    • REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_small = 1205;
    • REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
    • REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE = 1207;
    • REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
    • REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
    • REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
    • REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
    • REQUEST_OPTIONS_TRAFFIC_ACTIVE_WITHOUT_GLOBAL_START_TIME = 1214;
    • REQUEST_OPTIONS_TRAFFIC_ACTIVE_WITH_PRECEDENCES = 1215;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
    • REQUEST_OPTIONS_TRAFFIC_PREFILL_ACTIVE_WITHOUT_TRAFFIC = 1217;
  • INJECTED_SOLUTION_ERROR = 20;
    • INJECTED_SOLUTION_MISSING_LABEL = 2000;
    • INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
    • INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
    • INJECTED_SOLUTION_INFEASIBLE_AFTER_GETTING_TRAVEL_TIMES = 2003;
    • INJECTED_SOLUTION_TRANSITION_INCONSISTENT_WITH_ACTUAL_TRAVEL = 2004;
    • INJECTED_SOLUTION_CONCURRENT_SOLUTION_TYPES = 2005;
    • INJECTED_SOLUTION_MORE_THAN_ONE_PER_TYPE = 2006;
    • INJECTED_SOLUTION_REFRESH_WITHOUT_POPULATE = 2008;
    • INJECTED_SOLUTION_CONSTRAINED_ROUTE_PORTION_INFEASIBLE = 2010;
  • SHIPMENT_MODEL_ERROR = 22;
    • SHIPMENT_MODEL_TOO_LARGE = 2200;
    • SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
    • SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
    • SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
    • SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
    • SHIPMENT_MODEL_MAX_ACTIVE_VEHICLES_NOT_POSITIVE = 2206;
    • SHIPMENT_MODEL_DURATION_MATRIX_TOO_LARGE = 2207;
  • INDEX_ERROR = 24;
  • TAG_ERROR = 26;
  • TIME_WINDOW_ERROR = 28;
    • TIME_WINDOW_INVALID_START_TIME = 2800;
    • TIME_WINDOW_INVALID_END_TIME = 2801;
    • TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
    • TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
    • TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
    • TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
    • TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2.807;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME = 2808;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
    • TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME = 2810;
    • TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
    • TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
    • TIME_WINDOW_SOFT_START_TIME_AFTER_END_TIME = 2814;
    • TIME_WINDOW_START_TIME_AFTER_SOFT_END_TIME = 2815;
    • TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
    • TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS = 2817;
    • TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
    • TRANSITION_ATTRIBUTES_ERROR = 30;
    • TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
    • TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
    • TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
    • TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
    • TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
    • TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
    • TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
    • TRANSITION_ATTRIBUTES_Delay_DURATION_NEGATIVE_OR_NAN = 3008;
    • TRANSITION_ATTRIBUTES_RULE_DURATION_EXCEEDS_GLOBAL_DURATION = 3.009;
  • AMOUNT_ERROR = 31;
    • AMOUNT_NEGATIVE_VALUE = 3.100;
  • LOAD_LIMIT_ERROR = 33;
    • LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
    • LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
    • LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
    • LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
    • LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
    • LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
    • LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
  • INTERVAL_ERROR = 34;
    • INTERVAL_MIN_EXCEEDS_MAX = 3401;
    • INTERVAL_NEGATIVE_MIN = 3402;
    • INTERVAL_NEGATIVE_MAX = 3403;
    • INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
    • INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
  • DISTANCE_LIMIT_ERROR = 36;
    • DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
    • DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
    • STRECK_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
    • DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
    • DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
    • DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
  • DURATION_LIMIT_ERROR = 38;
    • DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3.800;
    • DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3.801;
    • DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
    • DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3.803;
    • DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3.804;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3.805;
    • DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_square_HOUR = 3.807;
    • DURATION_LIMIT_COST_PER_square_HOUR_WITHOUT_QUADRATIC_SOFT_MAX = 3.808;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
    • DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
    • DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE = 3812;
    • DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3.813;
    • DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3.814;
    • DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3.815;
  • SHIPMENT_ERROR = 40;
    • SHIPMENT_PD_LIMIT_WITHOUT_PICKUP_AND_DELIVERY = 4014;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
    • SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4001;
    • SHIPMENT_PD_RELATIVE_DETOUR_LIMIT_INVALID = 4015;
    • SHIPMENT_PD_DETOUR_LIMIT_AND_EXTRA_VISIT_DURATION = 4016;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
    • SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
    • SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
    • SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
    • SHIPMENT_INVALID_PENALTY_COST = 4006;
    • SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
    • SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
    • SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
    • SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
    • SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
    • SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
  • VEHICLE_ERROR = 42;
    • VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
    • VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
    • VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
    • VEHICLE_EMPTY_START_TAG = 4203;
    • VEHICLE_DUPLICATE_START_TAG = 4204;
    • VEHICLE_EMPTY_END_TAG = 4205;
    • VEHICLE_DUPLICATE_END_TAG = 4206;
    • VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
    • VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
    • VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
    • VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
    • VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
    • VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
    • VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
    • VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
    • VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
    • VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
    • VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
    • VEHICLE_INVALID_COST_PER_HOUR = 4218;
    • VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
    • VEHICLE_INVALID_FIXED_COST = 4220;
    • VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
    • VEHICLE_TRAVEL_DURATION_MULTIPLE_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4223;
    • VEHICLE_MATRIX_INDEX_WITH_SHIPMENT_PD_DETOUR_LIMITS = 4224;
    • VEHICLE_MINUTES_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
  • VISIT_REQUEST_ERROR = 44;
    • VISIT_REQUEST_EMPTY_TAG = 4400;
    • VISIT_REQUEST_DUPLICATE_TAG = 4401;
    • VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
    • VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
  • PRECEDENCE_ERROR = 46;
  • BREAK_ERROR = 48;
    • BREAK_RULE_EMPTY = 4800;
    • BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
    • BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
    • BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
    • BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
    • BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
    • BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
    • BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
    • BREAK_REQUEST_NON_SCHEDULABLE = 4808;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
    • BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
    • BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4812;
    • BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
    • BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
    • BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
  • SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
    • SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
    • SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
    • SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
    • SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
    • SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
  • SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
    • SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
    • SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
    • SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
    • SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
    • SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
    • SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
    • SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
    • SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
  • VEHICLE_OPERATOR_ERROR = 54;
    • VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
    • VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
    • VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
    • VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
    • VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
  • DURATION_SECONDS_MATRIX_ERROR = 56;
    • DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5.600;
    • DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5.601;
display_name

string

Der Anzeigename des Fehlers.

fields[]

FieldReference

Ein Fehlerkontext kann (meist 0, 1) oder mehr Felder umfassen. Wenn Sie sich beispielsweise auf Fahrzeug Nr. 4 und Lieferung Nr. 2 die erste Abholung beziehen, könnte das folgendermaßen aussehen:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Die Kardinalität von fields sollte sich jedoch für einen bestimmten Fehlercode nicht ändern.

error_message

string

Für Menschen lesbarer String, der den Fehler beschreibt. Es gibt eine 1:1-Zuordnung zwischen code und error_message (wenn der Code != "UNSPECIFIED").

Stabilität: Nicht stabil: Die Fehlermeldung für eine bestimmte code kann sich im Laufe der Zeit ändern (hoffentlich zur Klarstellung). Verwende stattdessen display_name und code.

offending_values

string

Kann die Werte des Felds bzw. der Felder enthalten. Diese Funktion ist nicht immer verfügbar. Sie sollten sich nicht darauf verlassen und sie nur für die manuelle Fehlerbehebung von Modellen verwenden.

FieldReference

Gibt einen Kontext für den Validierungsfehler an. Ein FieldReference bezieht sich immer auf ein bestimmtes Feld in dieser Datei und folgt derselben hierarchischen Struktur. So können wir beispielsweise Element 2 von start_time_windows von Fahrzeug 5 mit folgendem Format angeben:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Entitäten der obersten Ebene wie OptimizeToursRequest oder ShipmentModel werden jedoch weggelassen, um eine Überfüllung der Nachricht zu vermeiden.

Felder
name

string

Name des Felds, z.B. „Fahrzeuge“.

sub_field

FieldReference

Bei Bedarf rekursiv verschachteltes Unterfeld.

Union-Feld index_or_key.

Für index_or_key ist nur einer der folgenden Werte zulässig:

index

int32

Index des Felds bei Wiederholung.

key

string

Key, wenn das Feld eine Karte ist.

OutputConfig

Geben Sie ein Ziel für [BatchOptimizeTours][google.maps.routeOptimization.v1.RouteOptimizationService.BatchOptimizeTours]-Ergebnisse an.

Felder
data_format

DataFormat

Erforderlich. Das Ausgabedatenformat.

Union-Feld destination. Erforderlich. Für destination ist nur einer der folgenden Werte zulässig:
gcs_destination

GcsDestination

Der Google Cloud Storage-Speicherort, in den die Ausgabe geschrieben wird.

Versand

Die Lieferung eines einzelnen Artikels von einer Abholung bis zu einer Lieferung. Damit eine Sendung als durchgeführt gilt, muss ein bestimmtes Fahrzeug einen seiner Abholorte aufsuchen (und seine Kapazitäten entsprechend verringern) und dann später einen seiner Lieferorte aufsuchen (und dann entsprechend sein freies Fassungsvermögen wieder aufstocken).

Felder
display_name

string

Der benutzerdefinierte Anzeigename der Sendung. Sie kann bis zu 63 Zeichen lang sein und UTF-8-Zeichen enthalten.

pickups[]

VisitRequest

Satz von Alternativen zur Abholung, die der Sendung zugeordnet sind. Wenn nicht angegeben, muss das Fahrzeug nur einen Ort aufsuchen, der den Lieferungen entspricht.

deliveries[]

VisitRequest

Die mit der Sendung verbundenen Lieferalternativen. Wenn nicht angegeben, muss das Fahrzeug nur zu einem Standort fahren, der den Abholungen entspricht.

load_demands

map<string, Load>

Belastbarkeit der Sendung (z. B. Gewicht, Volumen, Anzahl der Paletten usw.) Die Schlüssel in der Karte sollten Kennungen sein, die den Typ des entsprechenden Ladevorgangs beschreiben, idealerweise auch die Einheiten. Beispiel: "weight_kg", "volume_gallons", "pallet_count" usw. Wenn ein bestimmter Schlüssel nicht auf der Karte erscheint, wird die entsprechende Ladung als null betrachtet.

allowed_vehicle_indices[]

int32

Die Fahrzeuge, die diesen Versand durchführen können. Ist das Feld leer, kann die Funktion von allen Fahrzeugen ausgeführt werden. Fahrzeuge sind über ihren Index in der vehicles-Liste der ShipmentModel angegeben.

costs_per_vehicle[]

double

Gibt die Kosten an, die anfallen, wenn diese Sendung von dem jeweiligen Fahrzeug geliefert wird. Wenn angegeben, muss ENTWEDER:

  • hat die gleiche Anzahl von Elementen wie costs_per_vehicle_indices. costs_per_vehicle[i] entspricht dem Fahrzeug costs_per_vehicle_indices[i] des Modells.
  • wie viele Elemente es im Modell gibt. Das i-te Element entspricht Fahrzeug Nr. i des Modells.

Diese Kosten müssen in derselben Einheit wie penalty_cost angegeben werden und dürfen nicht negativ sein. Lassen Sie dieses Feld leer, wenn keine solchen Kosten vorliegen.

costs_per_vehicle_indices[]

int32

Indexe der Fahrzeuge, für die costs_per_vehicle gilt. Wenn es nicht leer ist, muss es dieselbe Anzahl von Elementen haben wie costs_per_vehicle. Ein Fahrzeugindex darf nur einmal angegeben werden. Wenn ein Fahrzeug aus „costs_per_vehicle_indices“ ausgeschlossen ist, fallen keine Kosten an.

pickup_to_delivery_absolute_detour_limit

Duration

Gibt die maximale absolute Umleitungszeit im Vergleich zum kürzesten Weg von der Abholung zur Lieferung an. Falls angegeben, darf sie nicht negativ sein und die Sendung muss mindestens eine Abholung und eine Lieferung enthalten.

Geben Sie beispielsweise die kürzeste Zeit an, die nötig ist, um von der ausgewählten Abholoption direkt zur ausgewählten Lieferoption zu wechseln. Wenn Sie dann pickup_to_delivery_absolute_detour_limit festlegen, wird Folgendes erzwungen:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Wenn für dieselbe Sendung sowohl relative als auch absolute Grenzwerte angegeben sind, wird für jedes mögliche Paar aus Abholung und Lieferung die stärker einschränkende Begrenzung verwendet. Seit 2017/10 werden Umleitungen nur noch unterstützt, wenn die Reisedauer nicht von Fahrzeugen abhängt.

pickup_to_delivery_time_limit

Duration

Gibt die maximale Dauer vom Beginn der Abholung bis zum Beginn der Lieferung einer Sendung an. Falls angegeben, darf sie nicht negativ sein und die Sendung muss mindestens eine Abholung und eine Lieferung enthalten. Dies hängt weder von den Alternativen für Abhol- und Lieferoptionen noch von der Fahrzeuggeschwindigkeit ab. Dies kann zusammen mit den maximalen Umleitungsbeschränkungen angegeben werden: Die Lösung berücksichtigt beide Spezifikationen.

shipment_type

string

Ein nicht leerer String, der einen „Typ“ für diese Sendung angibt. Mit dieser Funktion können Inkompatibilitäten oder Anforderungen zwischen shipment_types definiert werden (siehe shipment_type_incompatibilities und shipment_type_requirements in ShipmentModel).

Abweichend von visit_types, das für einen einzelnen Besuch angegeben wird: Für alle Abhol-/Lieferungen, die zur selben Sendung gehören, wird dieselbe shipment_type verwendet.

label

string

Gibt ein Label für diese Sendung an. Dieses Label wird in der Antwort im shipment_label der entsprechenden ShipmentRoute.Visit gemeldet.

ignore

bool

Wenn „true“ festgelegt ist, kannst du diese Lieferung überspringen, aber kein penalty_cost anwenden.

Wenn eine Sendung ignoriert wird, tritt ein Validierungsfehler auf, wenn shipment_type_requirements im Modell vorhanden ist.

Das Ignorieren einer Sendung, die in injected_first_solution_routes oder injected_solution_constraint ausgeführt wird, ist zulässig. Der Solver entfernt die entsprechenden Besuche für Abholung/Lieferung aus der Route, die die jeweilige Bestellung ausführt. precedence_rules, die auf ignorierte Sendungen verweisen, werden ebenfalls ignoriert.

penalty_cost

double

Wenn der Versand nicht abgeschlossen wird, wird die Strafgebühr zu den Gesamtkosten der Routen hinzugefügt. Eine Sendung gilt als abgeschlossen, wenn eine der Optionen für Abholung und Lieferung genutzt wird. Die Kosten können in derselben Einheit ausgedrückt werden, die für alle anderen kostenbezogenen Felder im Modell verwendet wird, und müssen positiv sein.

WICHTIG: Wenn Sie keine Angabe machen, gilt der Abzug als unendlich, d.h., der Versand muss abgeschlossen sein.

pickup_to_delivery_relative_detour_limit

double

Gibt die maximale relative Umleitungszeit im Vergleich zum kürzesten Weg von der Abholung zur Lieferung an. Falls angegeben, darf sie nicht negativ sein und die Sendung muss mindestens eine Abholung und eine Lieferung enthalten.

Geben Sie beispielsweise die kürzeste Zeit an, die nötig ist, um von der ausgewählten Abholoption direkt zur ausgewählten Lieferoption zu wechseln. Wenn Sie dann pickup_to_delivery_relative_detour_limit festlegen, wird Folgendes erzwungen:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Wenn für dieselbe Sendung sowohl relative als auch absolute Grenzwerte angegeben sind, wird für jedes mögliche Paar aus Abholung und Lieferung die stärker einschränkende Begrenzung verwendet. Seit 2017/10 werden Umleitungen nur noch unterstützt, wenn die Reisedauer nicht von Fahrzeugen abhängt.

Laden

Bei einem Besuch kann ein vordefinierter Betrag zur Fahrzeugladung hinzugefügt werden, wenn es sich um eine Abholung handelt, oder subtrahiert, wenn es sich um eine Lieferung handelt. In dieser Nachricht wird ein solcher Betrag definiert. load_demands ansehen.

Felder
amount

int64

Die Belastung des Fahrzeugs, das den entsprechenden Besuch durchführt, variiert. Da es sich um eine Ganzzahl handelt, wird den Nutzern empfohlen, eine geeignete Einheit zu wählen, um Genauigkeitsverlust zu vermeiden. Muss ≥ 0 sein.

VisitRequest

Anfrage für einen Besuch, der von einem Fahrzeug durchgeführt werden kann: Er hat einen geografischen Standort (oder zwei, siehe unten), die Öffnungs- und Schließzeiten, die durch Zeitfenster dargestellt werden, sowie eine Servicedauer, d. h. die Zeit, die das Fahrzeug bei der Abholung oder Abgabe der Ware verbracht hat.

Felder
arrival_location

LatLng

Der Standort, an dem das Fahrzeug bei der Durchführung dieses VisitRequest-Vorgangs ankommt. Wenn das Versandmodell über Entfernungsmatrizen für die Dauer verfügt, darf arrival_location nicht angegeben werden.

arrival_waypoint

Waypoint

Der Wegpunkt, an dem das Fahrzeug bei der Durchführung dieses VisitRequest-Vorgangs ankommt. Wenn das Versandmodell über Entfernungsmatrizen für die Dauer verfügt, darf arrival_waypoint nicht angegeben werden.

departure_location

LatLng

Der Standort, an dem das Fahrzeug nach Abschluss dieses VisitRequest-Vorgangs abfährt. Kann weggelassen werden, wenn er mit arrival_location identisch ist. Wenn das Versandmodell über Entfernungsmatrizen für die Dauer verfügt, darf departure_location nicht angegeben werden.

departure_waypoint

Waypoint

Der Wegpunkt, an dem das Fahrzeug nach Abschluss dieses VisitRequest-Vorgangs abfährt. Kann weggelassen werden, wenn er mit arrival_waypoint identisch ist. Wenn das Versandmodell über Entfernungsmatrizen für die Dauer verfügt, darf departure_waypoint nicht angegeben werden.

tags[]

string

Gibt Tags an, die an die Besuchsanfrage angehängt sind. Leere oder doppelte Strings sind nicht zulässig.

time_windows[]

TimeWindow

Zeitfenster, die die Ankunftszeit bei einem Besuch einschränken Beachten Sie, dass ein Fahrzeug möglicherweise außerhalb des Ankunftszeitfensters abfährt, d.h., Ankunftszeit und Dauer müssen nicht innerhalb eines Zeitfensters liegen. Sollte das Fahrzeug vor dem TimeWindow.start_time ankommen, kann es zu Wartezeiten kommen.

Wenn TimeWindow fehlt, kann das Fahrzeug diesen Besuch jederzeit durchführen.

Zeitfenster müssen disjunkt sein, d. h., sie müssen nicht mit einem anderen Zeitfenster überlappen oder aneinander angrenzen. Außerdem müssen sie in aufsteigender Reihenfolge sein.

cost_per_hour_after_soft_end_time und soft_end_time können nur festgelegt werden, wenn ein einzelnes Zeitfenster besteht.

duration

Duration

Dauer des Besuchs, d.h. die Zeit, die das Fahrzeug zwischen Ankunft und Abfahrt verbracht hat (wird zur möglichen Wartezeit addiert; siehe time_windows).

cost

double

Kosten für die Bereitstellung dieser Besuchsanfrage auf einer Fahrzeugroute. So können Sie für jede alternative Abholung oder Lieferung einer Sendung unterschiedliche Kosten bezahlen. Diese Kosten müssen in derselben Einheit wie Shipment.penalty_cost angegeben werden und dürfen nicht negativ sein.

load_demands

map<string, Load>

Anforderungen dieser Besuchsanfrage laden. Er entspricht dem Feld „Shipment.load_demands“, mit dem Unterschied, dass es nur für dieses Feld (VisitRequest) und nicht für das gesamte Feld „Shipment“ gilt. Die hier aufgeführten Anforderungen werden zu den in Shipment.load_demands aufgeführten Anforderungen hinzugefügt.

visit_types[]

string

Gibt die Arten des Besuchs an. Damit lässt sich die zusätzliche Zeit einplanen, die ein Fahrzeug für diesen Besuch benötigt (siehe Vehicle.extra_visit_duration_for_visit_type).

Ein Typ kann nur einmal angezeigt werden.

label

string

Gibt ein Label für diesen VisitRequest an. Dieses Label wird in der Antwort als visit_label im entsprechenden ShipmentRoute.Visit gemeldet.

ShipmentModel

Ein Versandmodell besteht aus einer Reihe von Sendungen, die von einer Gruppe von Fahrzeugen ausgeführt werden müssen, wobei die Gesamtkosten minimiert werden, die sich aus der Summe aus folgenden Komponenten ergeben:

  • die Kosten für die Routenplanung der Fahrzeuge (Summe der Kosten pro Gesamtzeit, Kosten pro Fahrtzeit und Fixkosten für alle Fahrzeuge).
  • nicht ausgeführte Versandstrafen.
  • die Kosten der globalen Dauer der Lieferungen
Felder
shipments[]

Shipment

Satz von Lieferungen, die im Modell ausgeführt werden müssen.

vehicles[]

Vehicle

Gruppe von Fahrzeugen, die für Besuche verwendet werden können.

global_start_time

Timestamp

Globale Start- und Endzeit des Modells: Zeiten außerhalb dieses Bereichs können nicht als gültig angesehen werden.

Die Zeitspanne des Modells muss kürzer als ein Jahr sein, d. h., global_end_time und global_start_time müssen nicht mehr als 3.153.6000 Sekunden voneinander abweichen.

Wenn Sie cost_per_*hour-Felder verwenden, können Sie dieses Zeitfenster auf ein kleineres Intervall einstellen, um die Leistung zu steigern. Wenn Sie beispielsweise einen einzelnen Tag modellieren, sollten Sie die globalen Zeitlimits auf diesen Tag festlegen. Wenn kein Wert festgelegt ist, wird standardmäßig 00:00:00 UTC, 1. Januar 1970 (Sekunden: 0, Nanos: 0) verwendet.

global_end_time

Timestamp

Wenn kein Wert festgelegt ist, wird standardmäßig 00:00:00 UTC, 1. Januar 1971 (Sekunden: 31536000, Nanos: 0) verwendet.

global_duration_cost_per_hour

double

Die „globale Dauer“ des Gesamtplans ist die Differenz zwischen der frühesten effektiven Startzeit und der spätesten effektiven Endzeit aller Fahrzeuge. Nutzer können dieser Menge Kosten pro Stunde zuweisen, um sie beispielsweise im Hinblick auf den frühesten Abschluss eines Jobs zu optimieren. Diese Kosten müssen in derselben Einheit wie Shipment.penalty_cost angegeben werden.

duration_distance_matrices[]

DurationDistanceMatrix

Gibt die im Modell verwendeten Dauer- und Distanzmatrizen an. Wenn dieses Feld leer ist, werden stattdessen Google Maps oder geodätische Entfernungen verwendet, abhängig vom Wert des Felds use_geodesic_distances. Wenn es nicht leer ist, kann use_geodesic_distances nicht wahr sein und weder duration_distance_matrix_src_tags noch duration_distance_matrix_dst_tags dürfen leer sein.

Typische Syntax:

  • Es gibt zwei Standorte: locA und locB.
  • 1 Fahrzeug, das seine Route an locationA beginnt und an locA endet.
  • 1 Anfrage für einen Abholtermin am Standort „Standort“.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Es gibt drei Standorte: locA, locB und locC.
  • 1 Fahrzeug, das seine Route an Standort A startet und an Ort B endet, wobei die Matrix „schnell“ verwendet wird.
  • 1 Fahrzeug, das seine Route an Standort B beginnt und an Standort B endet, wobei die Matrix „langsam“ verwendet wird.
  • 1 Fahrzeug, das seine Route an Standort B beginnt und an Standort B endet, wobei die Matrix „schnell“ verwendet wird.
  • 1 Anfrage zur Abholung bei locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Tags, mit denen die Quellen der Dauer- und Entfernungsmatrizen definiert werden; duration_distance_matrices(i).rows(j) definiert die Dauer und Entfernung von Besuchen mit dem Tag duration_distance_matrix_src_tags(j) zu anderen Besuchen in der Matrix i.

Tags entsprechen VisitRequest.tags oder Vehicle.start_tags. Eine VisitRequest oder Vehicle muss genau mit einem Tag in diesem Feld übereinstimmen. Beachte, dass die Quell-, Ziel- und Matrix-Tags einer Vehicle identisch sein können. Ebenso können die Quell- und Ziel-Tags einer VisitRequest identisch sein. Alle Tags müssen sich unterscheiden und dürfen keine leeren Strings sein. Wenn dieses Feld nicht leer ist, dann darf duration_distance_matrices nicht leer sein.

duration_distance_matrix_dst_tags[]

string

Tags, die die Ziele der Dauer- und Distanzmatrizen definieren; duration_distance_matrices(i).rows(j).durations(k) (entsprechend duration_distance_matrices(i).rows(j).meters(k)) definiert die Dauer (bzw. die Entfernung) der Reise von Besuchen mit dem Tag duration_distance_matrix_src_tags(j) bis zu Besuchen mit Tag duration_distance_matrix_dst_tags(k) in der Matrix i.

Tags entsprechen VisitRequest.tags oder Vehicle.start_tags. Eine VisitRequest oder Vehicle muss genau mit einem Tag in diesem Feld übereinstimmen. Beachte, dass die Quell-, Ziel- und Matrix-Tags einer Vehicle identisch sein können. Ebenso können die Quell- und Ziel-Tags einer VisitRequest identisch sein. Alle Tags müssen sich unterscheiden und dürfen keine leeren Strings sein. Wenn dieses Feld nicht leer ist, dann darf duration_distance_matrices nicht leer sein.

transition_attributes[]

TransitionAttributes

Übergangsattribute wurden dem Modell hinzugefügt.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Gruppen mit inkompatiblen „shipment_types“-Elementen (siehe ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Gruppen mit shipment_type-Anforderungen (siehe ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Satz von Prioritätsregeln, die im Modell erzwungen werden müssen.

max_active_vehicles

int32

Beschränkt die maximale Anzahl aktiver Fahrzeuge. Ein Fahrzeug ist aktiv, wenn auf seiner Route mindestens ein Versand durchgeführt wird. Diese Option kann verwendet werden, um die Anzahl der Routen zu begrenzen, falls es weniger Fahrer als Fahrzeuge gibt und der Fahrzeugflotte heterogen ist. Im Rahmen der Optimierung wird dann die beste Teilmenge von Fahrzeugen ausgewählt. Muss ausschließlich positiv sein.

DurationDistanceMatrix

Gibt eine Matrix für Dauer und Entfernung von den Start- und Startorten des Besuchs und der Startorte der Fahrzeuge an.

Felder
rows[]

Row

Gibt die Zeilen der Dauer- und Distanzmatrix an. Es muss genauso viele Elemente wie ShipmentModel.duration_distance_matrix_src_tags enthalten.

vehicle_start_tag

string

Tag, das definiert, für welche Fahrzeuge diese Dauer- und Distanzmatrix gilt. Wenn das Feld leer ist, gilt das für alle Fahrzeuge und es kann nur eine einzelne Matrix geben.

Jeder Start eines Fahrzeugs muss genau mit einer Matrix übereinstimmen, d.h., genau eines der Felder start_tags muss mit dem vehicle_start_tag einer Matrix (und nur dieser Matrix) übereinstimmen.

Alle Matrizen müssen eine andere vehicle_start_tag haben.

Row

Gibt eine Zeile der Matrix für Dauer und Entfernung an.

Felder
durations[]

Duration

Dauerwerte für eine bestimmte Zeile. Es muss genauso viele Elemente wie ShipmentModel.duration_distance_matrix_dst_tags enthalten.

meters[]

double

Entfernungswerte für eine bestimmte Zeile. Wenn sich keine Kosten oder Einschränkungen auf Entfernungen im Modell beziehen, kann dieses Feld leer bleiben. Andernfalls muss es so viele Elemente wie durations enthalten.

PrecedenceRule

Eine Prioritätsregel zwischen zwei Ereignissen (jedes Ereignis ist die Abholung oder Lieferung einer Sendung): Das „zweite“ Ereignis muss mindestens offset_duration nach Beginn des „ersten“ Ereignisses beginnen.

Mehrere Rangfolgen können sich auf dieselben (oder verwandte) Ereignisse beziehen, z.B. „Abholung B erfolgt nach Lieferung von A“ und „Abholung C erfolgt nach Abholung von B“.

Außerdem gelten Rangfolgen nur dann, wenn beide Lieferungen ausgeführt werden. Andernfalls werden sie ignoriert.

Felder
first_is_delivery

bool

Gibt an, ob das „erste“ Ereignis eine Auslieferung ist.

second_is_delivery

bool

Gibt an, ob das „zweite“ Ereignis eine Auslieferung ist.

offset_duration

Duration

Abstand zwischen dem „ersten“ und dem „zweiten“ Ereignis Sie kann negativ sein.

first_index

int32

Versandindex des „ersten“ Ereignisses. Dieses Feld muss angegeben werden.

second_index

int32

Versandindex des „zweiten“ Ereignisses. Dieses Feld muss angegeben werden.

ShipmentRoute

Die Route eines Fahrzeugs kann entlang der Zeitachse so zerlegt werden (wir gehen davon aus, dass es n Besuche gibt):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Beachten Sie, dass wir einen Unterschied zwischen Folgendem haben:

  • „pünktliche Ereignisse“ wie Start und Ende des Fahrzeugs sowie Beginn und Ende jedes Besuchs (Ankunft und Abfahrt). Sie finden in einer bestimmten Sekunde statt.
  • Zeitintervallen wie die Besuche selbst und der Übergang zwischen den Besuchen. Obwohl Zeitintervalle manchmal eine Dauer von null haben, d.h. Beginn und Ende zur selben Sekunde, haben sie häufig eine positive Dauer.

Invarianten:

  • Bei n Besuchen gibt es n+1 Übergänge.
  • Ein Besuch ist immer von einem vor ihm stattfindenden Übergang (derselbe Index) und einem darauffolgenden Übergang (Index + 1) umgeben.
  • Nach dem Starten des Fahrzeugs folgt immer der Übergang Nr. 0.
  • Dem Fahrzeugende geht immer der Übergang #n voraus.

Beim Heranzoomen passiert Folgendes bei Transition und Visit:

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Hier erfährst du, wie REISEN, BRECHEN, VERZÖGERUNG und WARTE bei einer Übergangsphase arrangiert werden können.

  • Sie überschneiden sich nicht.
  • Die VERZÖGERUNG ist eindeutig und muss ein zusammenhängender Zeitraum direkt vor dem nächsten Besuch (oder dem Ende des Fahrzeugs) sein. Daher reicht es aus, die Verzögerungsdauer zu kennen, um ihre Start- und Endzeit zu kennen.
  • Die BREAKS sind zusammenhängende Zeiträume, die sich nicht überschneiden. In der Antwort werden Beginn und Dauer jeder Unterbrechung angegeben.
  • TRAVEL und WAIT sind „auf Abruf verfügbar“: Sie können während dieses Übergangs mehrmals unterbrochen werden. Die Kunden können davon ausgehen, dass die Reise „so bald wie möglich“ erfolgt und dass „Warten“ die verbleibende Zeit belegt.

Ein (komplexes) Beispiel:

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Felder
vehicle_index

int32

Fahrzeug, das die Route ausführt und anhand seines Index in der Quelle ShipmentModel identifiziert wird.

vehicle_label

string

Label des Fahrzeugs, das diese Route durchführt; entspricht ShipmentModel.vehicles(vehicle_index).label, falls angegeben.

vehicle_start_time

Timestamp

Uhrzeit, zu der das Fahrzeug seine Route beginnt.

vehicle_end_time

Timestamp

Uhrzeit, zu der das Fahrzeug seine Route beendet hat.

visits[]

Visit

Eine geordnete Abfolge von Besuchen, die eine Route darstellen. Visits[i] ist der i-te Besuch der Route. Wenn dieses Feld leer ist, gilt das Fahrzeug als nicht verwendet.

transitions[]

Transition

Sortierte Liste der Übergänge für die Route.

has_traffic_infeasibilities

bool

Wenn OptimizeToursRequest.consider_road_traffic auf „true“ gesetzt ist, gibt dieses Feld an, dass Inkonsistenzen bei den Routenzeiten anhand von verkehrsbasierten Schätzungen der Fahrtdauer vorhergesagt werden. Unter Umständen ist nicht genügend Zeit, um verkehrsbedingte Fahrt, Verspätungen und Pausen zwischen den Besuchen, vor dem ersten Besuch oder nach dem letzten Besuch abzuschließen, während die Besuchs- und Fahrzeugzeitfenster weiterhin eingehalten werden. Beispiel:

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

Die Ankunft bei „next_visit“ erfolgt wahrscheinlich später als im aktuellen Zeitfenster, da die geschätzte Reisezeit travel_duration(previous_visit, next_visit) aufgrund der Verkehrslage höher ist. Außerdem kann es sein, dass sich eine Pause mit einem Besuch überschneidet, da die geschätzte Reisezeit zunimmt und die Zeitfenster für die Besuchs- bzw. Pausenzeit zu lang sind.

route_polyline

EncodedPolyline

Die codierte Polyliniendarstellung der Route. Dieses Feld wird nur gefüllt, wenn OptimizeToursRequest.populate_polylines auf „true“ gesetzt ist.

breaks[]

Break

Für das Fahrzeug, das diese Route durchführt, sind Pausen geplant. Die breaks-Sequenz stellt Zeitintervalle dar, die jeweils bei der entsprechenden start_time beginnen und duration Sekunden dauern.

metrics

AggregatedMetrics

Messwerte zu Dauer, Entfernung und Last für diese Route. Die Felder von AggregatedMetrics werden je nach Kontext über alle ShipmentRoute.transitions oder ShipmentRoute.visits summiert.

route_costs

map<string, double>

Kosten der Route, aufgeschlüsselt nach kostenbezogenen Anfragefeldern. Die Schlüssel sind Proto-Pfade, die sich auf die OptimizeToursRequest-Eingabe beziehen, z. B. „model.shipments.pickups.cost“. Die Werte sind die vom entsprechenden Kostenfeld generierten Gesamtkosten, die über die gesamte Route aggregiert werden. Mit anderen Worten, cost["model.shipments.pickups.cost"] ist die Summe aller Abholkosten auf der Route. Alle im Modell definierten Kosten sind hier im Detail enthalten. Ausgenommen hiervon sind Kosten für TransitionAttributes, die seit 2022/01 nur in aggregierter Form erfasst werden.

route_total_cost

double

Gesamtkosten der Route. Die Summe aller Kosten in der Kostenübersicht.

Pause

Daten, die die Ausführung einer Werbeunterbrechung darstellen.

Felder
start_time

Timestamp

Beginn einer Pause.

duration

Duration

Dauer einer Pause.

EncodedPolyline

Die codierte Darstellung einer Polylinie. Weitere Informationen zur Codierung von Polylinien finden Sie hier: https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Felder
points

string

String, der die codierten Punkte der Polylinie darstellt.

Übergänge

Übergang zwischen zwei Ereignissen auf der Route. Weitere Informationen finden Sie in der Beschreibung von ShipmentRoute.

Wenn das Fahrzeug keine start_location und/oder end_location hat, sind die entsprechenden Fahrtmesswerte 0.

Felder
travel_duration

Duration

Reisedauer während dieses Übergangs.

travel_distance_meters

double

Die bei der Umstellung zurückgelegte Strecke.

traffic_info_unavailable

bool

Wenn Traffic über OptimizeToursRequest.consider_road_traffic angefordert wird und die Verkehrsinformationen für Transition nicht abgerufen werden konnten, wird dieser boolesche Wert auf „true“ gesetzt. Das kann vorübergehend (seltener Schluckauf bei den Echtzeit-Traffic-Servern) oder dauerhaft (keine Daten für diesen Standort) sein.

delay_duration

Duration

Summe der auf diesen Übergang angewendeten Verzögerungsdauern. Falls vorhanden, beginnt die Verspätung genau delay_duration Sekunden vor dem nächsten Ereignis (Besuch oder Ende des Fahrzeugs). TransitionAttributes.delay ansehen.

break_duration

Duration

Summe der Dauer der Pausen während dieses Übergangs, falls vorhanden. Details zum Beginn und zur Dauer der einzelnen Pausen sind in ShipmentRoute.breaks gespeichert.

wait_duration

Duration

Wartezeit während dieses Übergangs. Die Wartezeit entspricht der Inaktivitätszeit und beinhaltet keine Pausenzeit. Beachten Sie auch, dass diese Wartezeit in mehrere nicht aufeinanderfolgende Intervalle aufgeteilt werden kann.

total_duration

Duration

Gesamtdauer der Umstellung (zur Übersichtlichkeit). Er ist gleich:

  • nächster Besuch start_time (oder vehicle_end_time, wenn dies der letzte Übergang ist) - dieser Übergang start_time;
  • Wenn ShipmentRoute.has_traffic_infeasibilities „false“ ist, gilt zusätzlich Folgendes: `total_duration = trip_duration + refund_duration
  • „break_duration“ + „wait_duration“.
start_time

Timestamp

Beginn dieser Umstellung.

route_polyline

EncodedPolyline

Die codierte Polyliniendarstellung der Route, der während des Übergangs gefolgt wird. Dieses Feld wird nur gefüllt, wenn populate_transition_polylines auf „true“ gesetzt ist.

vehicle_loads

map<string, VehicleLoad>

Fahrzeugladevorgänge während dieses Übergangs für jeden Typ, der entweder in den Vehicle.load_limits dieses Fahrzeugs angezeigt wird oder einen Shipment.load_demands-Wert ungleich null bei einer Sendung auf dieser Route hat.

Die Lasten während des ersten Übergangs sind die Startlasten der Fahrzeugroute. Nach jedem Besuch werden die load_demands des Besuchs entweder addiert oder subtrahiert, um die Ladevorgänge für den nächsten Übergang zu erhalten. Das hängt davon ab, ob es sich bei dem Besuch um eine Abholung oder eine Lieferung handelt.

VehicleLoad

Meldet die tatsächliche Auslastung des Fahrzeugs an einem bestimmten Punkt auf der Route für einen bestimmten Typ (siehe Transition.vehicle_loads).

Felder
amount

int64

Die Last des Fahrzeugs für den jeweiligen Typ. Die Lasteinheit wird normalerweise durch den Typ angegeben. Transition.vehicle_loads ansehen.

Aufrufen

Ein Besuch, der während einer Route durchgeführt wurde. Dieser Besuch entspricht einer Abholung oder Lieferung einer Shipment.

Felder
shipment_index

int32

Index des Felds shipments in der Quelle ShipmentModel.

is_pickup

bool

Wenn „true“ festgelegt ist, entspricht der Besuch einer Abholung von Shipment. Andernfalls entspricht sie einer Auslieferung.

visit_request_index

int32

Index von VisitRequest im Abhol- oder Lieferfeld von Shipment (siehe is_pickup).

start_time

Timestamp

Startzeit des Besuchs Es kann sein, dass das Fahrzeug früher als erwartet am Zielort ankommt. Die Zeiten entsprechen dem ShipmentModel.

load_demands

map<string, Load>

Die gesamte Nachfrage nach Besuchen in Form der Summe der Sendung und der load_demands der Besuchsanforderung. Die Werte sind negativ, wenn es sich bei dem Besuch um eine Lieferung handelt. Es werden Anforderungen für denselben Typ wie der Transition.loads gemeldet (siehe dieses Feld).

detour

Duration

Zusätzliche Umleitungszeit aufgrund der Lieferungen auf der Route vor dem Besuch und der potenziellen Wartezeit infolge der Zeitfenster. Wenn es sich bei dem Besuch um eine Lieferung handelt, wird die Umleitung aus dem entsprechenden Abholtermin berechnet und ist gleich:

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

Andernfalls wird er aus dem Fahrzeug start_location berechnet und ist gleich:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Kopie des entsprechenden Shipment.label, falls in Shipment angegeben.

visit_label

string

Kopie des entsprechenden VisitRequest.label, falls in VisitRequest angegeben.

ShipmentTypeIncompatibility

Gibt Inkompatibilitäten zwischen Sendungen abhängig von ihrem „shipment_type“-Attribut an. Inkompatible Sendungen auf derselben Route können aufgrund des Inkompatibilitätsmodus nur eingeschränkt angezeigt werden.

Felder
types[]

string

Liste der inkompatiblen Typen. Zwei Sendungen mit unterschiedlichen shipment_types sind „inkompatibel“.

incompatibility_mode

IncompatibilityMode

Modus, der auf die Inkompatibilität angewendet wurde.

IncompatibilityMode

Modi, mit denen festgelegt wird, wie inkompatible Sendungen auf derselben Route erscheinen können.

Enums
INCOMPATIBILITY_MODE_UNSPECIFIED Nicht angegebener Inkompatibilitätsmodus. Dieser Wert sollte niemals verwendet werden.
NOT_PERFORMED_BY_SAME_VEHICLE In diesem Modus können sich zwei Sendungen mit inkompatiblen Typen nie auf dasselbe Fahrzeug teilen.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

Bei zwei Sendungen mit inkompatiblen Typen mit dem Inkompatibilitätsmodus „NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY“:

  • Wenn beide Optionen „Nur Abholen“ (keine Lieferungen) oder nur Lieferungen (keine Abholungen) sind, können sie sich nicht im selben Fahrzeug teilen.
  • Hat eine der Sendungen eine Lieferung und die andere eine Abholung, können sich die beiden Sendungen dasselbe Fahrzeug teilen, wenn die erste Sendung zugestellt wird, bevor die zweite abgeholt wird.

ShipmentTypeRequirement

Gibt die Anforderungen zwischen Sendungen basierend auf dem Versandtyp „shipment_type“ an. Die Einzelheiten der Anforderung werden durch den Anforderungsmodus definiert.

Felder
required_shipment_type_alternatives[]

string

Liste alternativer Versandarten, die für die dependent_shipment_types erforderlich sind.

dependent_shipment_types[]

string

Für alle Sendungen mit einem Typ im Feld „dependent_shipment_types“ ist mindestens eine Sendung vom Typ required_shipment_type_alternatives auf derselben Route erforderlich.

HINWEIS: Anforderungsketten, bei denen ein shipment_type von sich selbst abhängt, sind nicht zulässig.

requirement_mode

RequirementMode

Der Modus wurde auf die Anforderung angewendet.

RequirementMode

Modi, die die Darstellung abhängiger Lieferungen auf einer Route definieren.

Enums
REQUIREMENT_MODE_UNSPECIFIED Nicht angegebener Anforderungsmodus. Dieser Wert sollte niemals verwendet werden.
PERFORMED_BY_SAME_VEHICLE In diesem Modus müssen sich alle „abhängigen“ Sendungen im selben Fahrzeug wie mindestens eine ihrer „erforderlichen“ Sendungen befinden.
IN_SAME_VEHICLE_AT_PICKUP_TIME

Im IN_SAME_VEHICLE_AT_PICKUP_TIME-Modus müssen alle „abhängigen“ Sendungen zum Zeitpunkt der Abholung mindestens eine „erforderliche“ Sendung im Fahrzeug haben.

Bei einer „abhängigen“ Abholung muss daher eines der folgenden Kriterien erfüllt sein:

  • eine Lieferung nur für eine Lieferung erforderlich, die auf dem Weg nach dem Ziel geliefert wird, oder
  • Eine „erforderliche“ Sendung, die auf der Route zuvor abgeholt werden muss und wenn es für die „erforderliche“ Lieferung eine Lieferung gibt, muss diese Lieferung nach der Abholung der abhängigen Sendung erfolgen.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Wie zuvor, mit der Ausnahme, dass die „abhängigen“ Sendungen zum Zeitpunkt der Lieferung eine „erforderliche“ Sendung im Fahrzeug haben müssen.

SkippedShipment

Gibt Details zu nicht ausgeführten Sendungen in einer Lösung an. Bei einfachen Fällen und/oder wenn wir die Ursache für das Überspringen ermitteln können, geben wir hier den Grund an.

Felder
index

int32

Der Index entspricht dem Index der Sendung in der Quelle ShipmentModel.

label

string

Kopie des entsprechenden Shipment.label, falls in Shipment angegeben.

reasons[]

Reason

Eine Liste mit Gründen, warum die Sendung übersprungen wurde. Siehe Kommentar oben: Reason.

Grund

Wenn wir erklären können, warum die Lieferung übersprungen wurde, werden hier die Gründe aufgeführt. Wenn der Grund nicht für alle Fahrzeuge gleich ist, hat reason mehr als 1 Element. Für eine übersprungene Lieferung darf es keine doppelten Gründe geben, d.h. alle Felder mit Ausnahme von example_vehicle_index sind identisch. Beispiel:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

Die übersprungene Sendung ist nicht mit allen Fahrzeugen kompatibel. Die Gründe können für alle Fahrzeuge unterschiedlich sein, aber mindestens für ein Fahrzeug wird die Kapazität für „Äpfel“ überschritten (einschließlich Fahrzeug 1), die Kapazität für „Pears“ bei mindestens einem Fahrzeug würde überschritten (einschließlich Fahrzeug 3) und mindestens eines Fahrzeugs (einschließlich Fahrzeug 1) wird überschritten.

Felder
code

Code

Weitere Informationen finden Sie in den Kommentaren zum Code.

example_exceeded_capacity_type

string

Wenn der Ursachencode DEMAND_EXCEEDS_VEHICLE_CAPACITY lautet, wird ein überschrittener Kapazitätstyp dokumentiert.

example_vehicle_index

int32

Wenn der Grund mit einer Inkompatibilität eines Versandfahrzeugs zusammenhängt, enthält dieses Feld den Index eines relevanten Fahrzeugs.

Code

Code zur Identifizierung des Grundtyps. Die Reihenfolge hier ist bedeutungslos. Insbesondere gibt sie keinen Hinweis darauf, ob ein bestimmter Grund in der Lösung vor einem anderen angezeigt wird, sofern beide Gründe zutreffen.

Enums
CODE_UNSPECIFIED Dies sollte niemals verwendet werden. Wenn wir nicht nachvollziehen können, warum eine Sendung übersprungen wurde, senden wir einfach eine leere Begründungsanfrage zurück.
NO_VEHICLE Das Modell hat kein Fahrzeug, das alle Lieferungen unmöglich macht.
DEMAND_EXCEEDS_VEHICLE_CAPACITY Die Nachfrage nach der Sendung überschreitet die Kapazität eines Fahrzeugs bei einigen Kapazitätstypen. Einer davon ist example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

Die Mindestentfernung, die für diesen Versand erforderlich ist, d.h. vom start_location des Fahrzeugs zu den Abhol- und/oder Lieferorten der Sendung und zum Zielort des Fahrzeugs überschreitet die route_distance_limit.

Beachten Sie, dass wir für diese Berechnung die geodätischen Entfernungen verwenden.

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Die für diesen Versand erforderliche Mindestzeit, einschließlich Fahrt-, Wartezeit und Servicezeit, überschreitet die route_duration_limit des Fahrzeugs.

Hinweis: Die Reisezeit wird im Best-Case-Szenario berechnet, nämlich als geodätische Entfernung × 36 m/s (ungefähr 130 km/Stunde).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT Wie oben, aber es wird nur die minimale Fahrtzeit und die travel_duration_limit des Fahrzeugs verglichen.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Das Fahrzeug kann diese Sendung im Best-Case-Szenario nicht ausführen (siehe CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT für Zeitberechnung), wenn es zum frühesten Startzeitpunkt beginnt: Die Gesamtzeit würde dazu führen, dass das Fahrzeug nach seiner spätesten Endzeit endet.
VEHICLE_NOT_ALLOWED Das Feld „allowed_vehicle_indices“ der Sendung ist nicht leer und dieses Fahrzeug gehört nicht dazu.

TimeWindow

Zeitfenster beschränken die Zeit eines Ereignisses, z. B. die Ankunftszeit bei einem Besuch oder die Start- und Endzeit eines Fahrzeugs.

Feste Zeitfenstergrenzen, start_time und end_time, erzwingen die früheste und späteste Zeit des Ereignisses, z. B. start_time <= event_time <= end_time. Die Untergrenze des weichen Zeitfensters (soft_start_time) drückt aus, dass das Ereignis am oder nach soft_start_time eintritt, wobei Kosten proportional dazu anfallen, wie lange vor soft_start_time das Ereignis eintritt. Die Obergrenze für das weiche Zeitfenster (soft_end_time) drückt aus, dass das Ereignis am oder vor soft_end_time eintritt. Dabei fallen Kosten proportional zur Dauer nach soft_end_time nach dem Eintreten des Ereignisses an. start_time, end_time, soft_start_time und soft_end_time müssen innerhalb der globalen Zeitlimits (siehe ShipmentModel.global_start_time und ShipmentModel.global_end_time) liegen und Folgendes berücksichtigen:

  0 <= `start_time` <= `soft_start_time` <= `end_time` and
  0 <= `start_time` <= `soft_end_time` <= `end_time`.
Felder
start_time

Timestamp

Der Beginn des harten Zeitfensters. Wenn keine Vorgabe erfolgt, wird er auf ShipmentModel.global_start_time gesetzt.

end_time

Timestamp

Das Ende des festen Zeitfensters. Wenn keine Vorgabe erfolgt, wird er auf ShipmentModel.global_end_time gesetzt.

soft_start_time

Timestamp

Die Softstartzeit des Zeitfensters.

soft_end_time

Timestamp

Das weiche Ende des Zeitfensters.

cost_per_hour_before_soft_start_time

double

Kosten pro Stunde, die zu den anderen Kosten im Modell hinzugefügt werden, wenn das Ereignis vor soft_start_time eintritt. Sie werden wie folgt berechnet:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Diese Kosten müssen positiv sein und das Feld kann nur festgelegt werden, wenn soft_start_time festgelegt wurde.

cost_per_hour_after_soft_end_time

double

Kosten pro Stunde, die zu den anderen Kosten im Modell hinzugefügt werden, wenn das Ereignis nach dem soft_end_time eintritt. Sie werden so berechnet:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Diese Kosten müssen positiv sein und das Feld kann nur festgelegt werden, wenn soft_end_time festgelegt wurde.

TransitionAttributes

Gibt Attribute für Übergänge zwischen zwei aufeinanderfolgenden Besuchen einer Route an. Mehrere TransitionAttributes können für denselben Übergang gelten: In diesem Fall addieren sich alle zusätzlichen Kosten und es gilt die strengste Beschränkung oder das strengste Limit (gemäß der natürlichen UND-Semantik).

Felder
src_tag

string

Tags, die die Übergänge (src->dst) definieren, für die diese Attribute gelten.

Ein Besuch oder Start eines Fahrzeugs stimmt überein, wenn VisitRequest.tags oder Vehicle.start_tags entweder src_tag oder nicht excluded_src_tag enthält (je nachdem, welches dieser Felder nicht leer ist).

excluded_src_tag

string

src_tag ansehen. src_tag und excluded_src_tag dürfen nicht leer sein.

dst_tag

string

Ein Zielbesuch oder Fahrzeugende stimmt überein, wenn VisitRequest.tags oder Vehicle.end_tags entweder dst_tag oder nicht excluded_dst_tag enthält (je nachdem, welches dieser Felder nicht leer ist).

excluded_dst_tag

string

dst_tag ansehen. dst_tag und excluded_dst_tag dürfen nicht leer sein.

cost

double

Gibt die Kosten für die Durchführung dieses Übergangs an. Dies ist dieselbe Einheit wie alle anderen Kosten im Modell und darf nicht negativ sein. Sie wird auf alle anderen bestehenden Kosten angewendet.

cost_per_kilometer

double

Gibt die Kosten pro Kilometer an, die auf die bei diesem Übergang zurückgelegte Strecke angewendet werden. Er addiert alle Vehicle.cost_per_kilometer, die für „Fahrzeuge“ angegeben sind.

distance_limit

DistanceLimit

Gibt einen Grenzwert für die Strecke an, die bei diesem Übergang zurückgelegt wird.

Ab dem 06.06.2021 werden nur weiche Limits unterstützt.

delay

Duration

Gibt eine Verzögerung an, die bei der Durchführung dieser Umstellung auftritt.

Diese Verzögerung tritt immer nach dem Abschluss des Quellbesuchs und vor dem Start des Zielbesuchs auf.

Fahrzeug

Modelliert ein Fahrzeug in einem Versandproblem. Zur Lösung eines Versandproblems wird eine Route für dieses Fahrzeug erstellt, die zwischen start_location beginnt und um end_location endet. Eine Route ist eine Folge von Durchfahrten (siehe ShipmentRoute).

Felder
display_name

string

Der benutzerdefinierte Anzeigename des Fahrzeugs. Sie kann bis zu 63 Zeichen lang sein und UTF-8-Zeichen enthalten.

travel_mode

TravelMode

Die Mobilitätsform, die sich auf die vom Fahrzeug genutzten Straßen und die Geschwindigkeit auswirkt. Siehe auch travel_duration_multiple.

start_location

LatLng

Geografischer Standort, an dem das Fahrzeug startet, bevor Sendungen abgeholt werden. Wenn nicht angegeben, startet das Fahrzeug bei der ersten Abholung. Wenn das Versandmodell Matrizen für Dauer und Entfernung hat, darf start_location nicht angegeben werden.

start_waypoint

Waypoint

Wegpunkt, der einen geografischen Standort darstellt, an dem das Fahrzeug startet, bevor Sendungen abgeholt werden. Wenn weder start_waypoint noch start_location angegeben ist, startet das Fahrzeug bei der ersten Abholung. Wenn das Versandmodell Matrizen für Dauer und Entfernung hat, darf start_waypoint nicht angegeben werden.

end_location

LatLng

Geografischer Standort, an dem das Fahrzeug endet, nachdem die letzten VisitRequest abgeschlossen wurden. Wenn nicht angegeben, endet die ShipmentRoute des Fahrzeugs sofort, wenn die letzten VisitRequest abgeschlossen sind. Wenn das Versandmodell Matrizen für Dauer und Entfernung hat, darf end_location nicht angegeben werden.

end_waypoint

Waypoint

Wegpunkt, der einen geografischen Standort darstellt, an dem das Fahrzeug endet, nachdem die letzte VisitRequest abgeschlossen ist. Wenn weder end_waypoint noch end_location angegeben ist, endet die ShipmentRoute des Fahrzeugs sofort, wenn die letzte VisitRequest abgeschlossen ist. Wenn das Versandmodell Matrizen für Dauer und Entfernung hat, darf end_waypoint nicht angegeben werden.

start_tags[]

string

Gibt Tags an, die am Start der Route des Fahrzeugs angehängt sind.

Leere oder doppelte Strings sind nicht zulässig.

end_tags[]

string

Gibt Tags an, die am Ende der Route des Fahrzeugs angehängt sind.

Leere oder doppelte Strings sind nicht zulässig.

start_time_windows[]

TimeWindow

Zeitfenster, in denen das Fahrzeug von seinem Startort abfährt. Sie müssen innerhalb der globalen Zeitlimits liegen (siehe ShipmentModel.global_*-Felder). Wenn keine Vorgabe erfolgt, gelten außer den globalen Zeitlimits keine weiteren Einschränkungen.

Zeitfenster, die zu demselben wiederkehrenden Feld gehören, müssen getrennt sein, d. h. es darf sich kein Zeitfenster mit einem anderen überschneiden oder aneinandergrenzen. Sie müssen in chronologischer Reihenfolge angegeben werden.

cost_per_hour_after_soft_end_time und soft_end_time können nur festgelegt werden, wenn ein einzelnes Zeitfenster besteht.

end_time_windows[]

TimeWindow

Zeitfenster, in denen das Fahrzeug seinen Zielort erreichen kann. Sie müssen innerhalb der globalen Zeitlimits liegen (siehe ShipmentModel.global_*-Felder). Wenn keine Vorgabe erfolgt, gelten außer den globalen Zeitlimits keine weiteren Einschränkungen.

Zeitfenster, die zu demselben wiederkehrenden Feld gehören, müssen getrennt sein, d. h. es darf sich kein Zeitfenster mit einem anderen überschneiden oder aneinandergrenzen. Sie müssen in chronologischer Reihenfolge angegeben werden.

cost_per_hour_after_soft_end_time und soft_end_time können nur festgelegt werden, wenn ein einzelnes Zeitfenster besteht.

unloading_policy

UnloadingPolicy

Ausstiegsrichtlinie für das Fahrzeug erzwungen.

load_limits

map<string, LoadLimit>

Die Kapazität des Fahrzeugs (z. B. Gewicht, Volumen, Anzahl der Paletten) Die Schlüssel in der Zuordnung sind die Kennungen des Ladetyps, die mit den Schlüsseln des Feldes Shipment.load_demands übereinstimmen. Wenn ein bestimmter Schlüssel in dieser Zuordnung fehlt, wird die entsprechende Kapazität als unbegrenzt betrachtet.

cost_per_hour

double

Fahrzeugkosten: Alle Kosten addieren sich und müssen in derselben Einheit wie Shipment.penalty_cost angegeben werden.

Kosten pro Stunde der Route des Fahrzeugs. Diese Kosten werden auf die Gesamtzeit der Route angerechnet und umfassen Fahrt-, Wartezeit und Besuchszeit. Die Verwendung von cost_per_hour statt nur cost_per_traveled_hour kann zu einer zusätzlichen Latenz führen.

cost_per_traveled_hour

double

Kosten pro Fahrtstunde auf der Route des Fahrzeugs. Diese Kosten werden nur auf die Fahrtzeit auf der Route (d. h. die in ShipmentRoute.transitions angegebene) berechnet. Wartezeiten und Besuchszeit werden nicht berücksichtigt.

cost_per_kilometer

double

Kosten pro Kilometer der Fahrzeugroute. Diese Kosten werden auf die im ShipmentRoute.transitions gemeldete Entfernung angewendet und gelten nicht für Entfernungen, die implizit von der arrival_location zur departure_location einer einzelnen VisitRequest zurückgelegt wurden.

fixed_cost

double

Wenn dieses Fahrzeug zur Abwicklung einer Sendung verwendet wird, fallen Festpreise an.

used_if_route_is_empty

bool

Dieses Feld gilt nur für Fahrzeuge, auf deren Route keine Sendungen möglich sind. Sie gibt an, ob das Fahrzeug in diesem Fall als gebraucht gelten soll.

Wenn der Wert „true“ ist, fährt das Fahrzeug vom Start- zum Zielort, auch wenn keine Lieferungen anstehen. Außerdem werden die Zeit- und Entfernungskosten berücksichtigt, die sich aus der Start- -> Endfahrt ergeben.

Andernfalls fährt er nicht von seinem Start- zum Zielort und es sind keine break_rule und keine Verspätung (ab TransitionAttributes) für dieses Fahrzeug geplant. In diesem Fall enthält die ShipmentRoute des Fahrzeugs mit Ausnahme des Fahrzeugindex und des Fahrzeugs keine Informationen.

route_duration_limit

DurationLimit

Der Grenzwert wird auf die Gesamtdauer der Route des Fahrzeugs angewendet. In einer bestimmten OptimizeToursResponse ist die Routendauer eines Fahrzeugs die Differenz zwischen seinen vehicle_end_time und vehicle_start_time.

travel_duration_limit

DurationLimit

Der Grenzwert wird auf die Reisedauer auf der Route des Fahrzeugs angewendet. In einer gegebenen OptimizeToursResponse ist die Reisedauer der Route die Summe aller ihrer transitions.travel_duration.

route_distance_limit

DistanceLimit

Der Grenzwert wird auf die Gesamtstrecke auf der Route des Fahrzeugs angewendet. In einer gegebenen OptimizeToursResponse ist die Routenentfernung die Summe aller ihrer transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Gibt eine Karte von „visit_types“-Strings zu „durations“-Werten an. Die Dauer ist die Zeit, die zusätzlich zu VisitRequest.duration bei Besuchen mit dem angegebenen visit_types erfasst werden soll. Durch diese zusätzliche Besuchsdauer fallen Kosten an, wenn cost_per_hour angegeben ist. Schlüssel (z.B. visit_types) dürfen keine leeren Strings sein.

Wenn eine Besuchsanfrage mehrere Typen umfasst, wird für jeden Typ in der Karte eine Dauer hinzugefügt.

break_rule

BreakRule

Beschreibt den Pausenplan, der für dieses Fahrzeug erzwungen werden soll. Wenn das Feld leer ist, werden für dieses Fahrzeug keine Pausen geplant.

label

string

Gibt ein Label für dieses Fahrzeug an. Dieses Label wird in der Antwort als vehicle_label der entsprechenden ShipmentRoute gemeldet.

ignore

bool

Wenn „true“ festgelegt ist, muss used_if_route_is_empty „false“ sein und dieses Fahrzeug bleibt nicht verwendet.

Wenn eine Sendung von einem ignorierten Fahrzeug in injected_first_solution_routes ausgeführt wird, wird sie in der ersten Lösung übersprungen, kann aber in der Antwort kostenlos ausgeführt werden.

Wenn eine Sendung von einem ignorierten Fahrzeug in injected_solution_constraint ausgeführt wird und damit verbundene Abhol-/Liefervorgänge im Fahrzeug verbleiben (d.h. nicht auf Stufe RELAX_ALL_AFTER_THRESHOLD gelockert wird), wird sie in der Antwort übersprungen. Wenn das Feld „allowed_vehicle_indices“ einer Sendung nicht leer ist und alle zulässigen Fahrzeuge ignoriert werden, wird sie in der Antwort übersprungen.

travel_duration_multiple

double

Gibt einen multiplikativen Faktor an, mit dem die Fahrtzeiten dieses Fahrzeugs verlängert oder verkürzt werden können. Wenn Sie diesen Wert beispielsweise auf 2,0 setzen, ist dieses Fahrzeug langsamer und hat doppelt so lange Fahrtzeiten wie für Standardfahrzeuge. Dieser Faktor wirkt sich nicht auf die Besuchsdauer aus. Wenn cost_per_hour oder cost_per_traveled_hour angegeben ist, wirkt sich dies auf die Kosten aus. Dieser muss im Bereich [0,001; 1000,0] liegen. Wenn nichts festgelegt ist, entspricht das Fahrzeug dem Standard.Dieser Vielfachewert wird als 1, 0 betrachtet.

WARNUNG: Fahrtzeiten werden auf die nächste Sekunde gerundet, nachdem dieses Vielfache angewendet wurde, aber bevor numerische Operationen ausgeführt werden. Daher kann ein kleiner Vielfaches zu einem Genauigkeitsverlust führen.

Siehe auch extra_visit_duration_for_visit_type unten.

DurationLimit

Limit für die maximale Dauer der Route eines Fahrzeugs. Sie kann entweder hart oder weich sein.

Wenn ein Feld für ein weiches Limit definiert ist, müssen sowohl der Grenzwert für den weichen als auch die zugehörigen Kosten zusammen definiert werden.

Felder
max_duration

Duration

Ein hartes Limit, das die Dauer auf höchstens „max_duration“ beschränkt.

soft_max_duration

Duration

Ein weiches Limit, das kein maximales Dauerlimit erzwingt, aber wenn es verletzt wird, verursacht Kosten für die Route. Diese Kosten summieren sich zu den anderen im Modell definierten Kosten mit derselben Einheit.

Wenn definiert, darf soft_max_duration nicht negativ sein. Wenn auch „max_duration“ definiert ist, muss soft_max_duration kleiner als „max_duration“ sein.

quadratic_soft_max_duration

Duration

Ein weiches Limit, das kein maximales Dauerlimit erzwingt, aber wenn es verletzt wird, verursacht eine quadratische Dauer für die Route. Diese Kosten summieren sich zu den anderen im Modell definierten Kosten mit derselben Einheit.

Wenn definiert, darf quadratic_soft_max_duration nicht negativ sein. Wenn auch max_duration definiert ist, muss quadratic_soft_max_duration kleiner als max_duration sein und die Differenz darf nicht größer als einen Tag sein:

max_duration - quadratic_soft_max_duration <= 86400 seconds

cost_per_hour_after_soft_max

double

Kosten pro Stunde, wenn der Grenzwert von soft_max_duration überschritten wird. Die zusätzlichen Kosten sind 0, wenn die Dauer unter dem Grenzwert liegt. Andernfalls hängen die Kosten wie folgt von der Dauer ab:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Die Kosten dürfen nicht negativ sein.

cost_per_square_hour_after_quadratic_soft_max

double

Es fallen Kosten pro Quadratstunde an, wenn der Grenzwert von quadratic_soft_max_duration überschritten wird.

Die zusätzlichen Kosten sind 0, wenn die Dauer unter dem Grenzwert liegt. Andernfalls hängen die Kosten wie folgt von der Dauer ab:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Die Kosten dürfen nicht negativ sein.

LoadLimit

Definiert eine Belastungsgrenze für ein Fahrzeug, z. B. „Dieser Lkw darf nur bis zu 3.500 kg tragen“. load_limits ansehen.

Felder
soft_max_load

int64

Ein weiches Limit der Last. cost_per_unit_above_soft_max ansehen.

cost_per_unit_above_soft_max

double

Wenn die Ladung auf der Route dieses Fahrzeugs soft_max_load überschreitet, gilt die folgende Kostenstrafe (nur einmal pro Fahrzeug): (Last – soft_max_load) × cost_per_unit_above_soft_max. Alle Kosten müssen addiert werden und müssen sich in derselben Einheit wie Shipment.penalty_cost befinden.

start_load_interval

Interval

Das akzeptable Ladeintervall des Fahrzeugs zu Beginn der Route.

end_load_interval

Interval

Das akzeptable Lastintervall des Fahrzeugs am Ende der Route.

max_load

int64

Die maximal akzeptable Last.

Intervall

Intervall akzeptabler Lastbeträge.

Felder
min

int64

Eine akzeptable Mindestlast. Muss ≥ 0 sein. Wenn beide angegeben werden, muss minmax sein.

max

int64

Eine maximal akzeptable Last. Muss ≥ 0 sein. Wenn keine Angabe gemacht wird, wird die maximale Last durch diese Nachricht nicht eingeschränkt. Wenn beide angegeben werden, muss minmax sein.

TravelMode

Mobilitätsformen, die von Fahrzeugen genutzt werden können.

Dabei sollte es sich um eine Teilmenge der „Routes Preferred API“-Mobilitätsformen der Google Maps Platform handeln. Weitere Informationen finden Sie unter https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.

Enums
TRAVEL_MODE_UNSPECIFIED Nicht angegebene Mobilitätsform, entspricht DRIVING.
DRIVING Mobilitätsform, die der Route entspricht (Auto, ...).
WALKING Mobilitätsform für Fußgängerroute.

UnloadingPolicy

Richtlinie zum Entladen eines Fahrzeugs. Gilt nur für Sendungen mit Abhol- und Lieferservice.

Andere Lieferungen können unabhängig von unloading_policy überall auf der Route kostenlos erfolgen.

Enums
UNLOADING_POLICY_UNSPECIFIED Nicht angegebene Entladerichtlinien. Lieferungen müssen erst nach der entsprechenden Abholung erfolgen.
LAST_IN_FIRST_OUT Lieferungen müssen in umgekehrter Reihenfolge der Abholung erfolgen
FIRST_IN_FIRST_OUT Lieferungen müssen in der gleichen Bestellung erfolgen wie Abholungen

Zwischenstopp

Verkapselt einen Wegpunkt. Mit Wegpunkten werden der Ankunfts- und Abfahrtsort von VisitRequests sowie der Start- und Endpunkt von Fahrzeugen markiert.

Felder
side_of_road

bool

Optional. Gibt an, dass das Fahrzeug an der Position dieses Wegpunkts bevorzugt an einer bestimmten Straßenseite halten soll. Wenn Sie diesen Wert festlegen, verläuft die Route so durch den Ort, dass das Fahrzeug an der Straßenseite anhalten kann, die zur Mitte der Straße hin geneigt ist. Diese Option funktioniert nicht bei der Mobilitätsform "Fußweg".

Union-Feld location_type. Verschiedene Möglichkeiten zur Darstellung eines Standorts. Für location_type ist nur einer der folgenden Werte zulässig:
location

Location

Ein Punkt, der mithilfe geografischer Koordinaten angegeben wird, einschließlich einer optionalen Ausrichtung.

place_id

string

Die mit dem Wegpunkt verknüpfte Orts-ID des POI.