ShipmentModel

Ein Versandmodell enthält eine Reihe von Sendungen, die von einer Reihe von Fahrzeugen ausgeführt werden müssen, wobei die Gesamtkosten minimiert werden, die sich aus der Summe der folgenden Kosten zusammensetzen:

  • die Kosten für die Routenplanung der Fahrzeuge (Summe der Kosten pro Gesamtzeit, Kosten pro Fahrtzeit und Fixkosten für alle Fahrzeuge).
  • die Strafen für nicht ausgeführte Sendungen.
  • die Kosten für die gesamte Dauer der Sendungen
JSON-Darstellung
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
Felder
shipments[]

object (Shipment)

Sendungen, die im Modell ausgeführt werden müssen.

vehicles[]

object (Vehicle)

Fahrzeuge, die für Besuche verwendet werden können.

globalStartTime

string (Timestamp format)

Globaler Beginn und Ende des Modells: Zeiten außerhalb dieses Bereichs können nicht als gültig betrachtet werden.

Der Zeitraum des Modells darf nicht länger als ein Jahr sein. Das heißt, der globalEndTime und der globalStartTime müssen innerhalb von 31.536.000 Sekunden voneinander liegen.

Wenn Sie cost_per_*hour-Felder verwenden, sollten Sie dieses Fenster auf ein kleineres Intervall festlegen, um die Leistung zu steigern. Wenn Sie beispielsweise einen einzelnen Tag modellieren, sollten Sie die globalen Zeitlimits auf diesen Tag festlegen. Wenn der Wert nicht festgelegt ist, wird als Standardwert 00:00:00 UTC, 1. Januar 1970 (d. h. Sekunden: 0, Nanosekunden: 0) verwendet.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

globalEndTime

string (Timestamp format)

Wenn dieser Wert nicht festgelegt ist, wird als Standardwert 00:00:00 UTC, 1. Januar 1971 (d. h. Sekunden: 31536000, Nanosekunden: 0) verwendet.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

globalDurationCostPerHour

number

Die „globale Dauer“ des gesamten Plans ist die Differenz zwischen der frühesten effektiven Startzeit und der spätesten effektiven Endzeit aller Fahrzeuge. Nutzer können dieser Menge einen Kostenpreis pro Stunde zuweisen, um beispielsweise die schnellstmögliche Auftragsausführung zu optimieren. Diese Kosten müssen in derselben Einheit wie Shipment.penalty_cost angegeben sein.

durationDistanceMatrices[]

object (DurationDistanceMatrix)

Gibt die im Modell verwendeten Zeit- und Entfernungsmatrizen an. Wenn dieses Feld leer ist, werden je nach Wert des Felds useGeodesicDistances Google Maps- oder geodätische Entfernungen verwendet. Wenn es nicht leer ist, kann useGeodesicDistances nicht „wahr“ sein und weder durationDistanceMatrixSrcTags noch durationDistanceMatrixDstTags dürfen leer sein.

Typische Syntax:

  • Es gibt zwei Standorte: locA und locB.
  • 1 Fahrzeug, das seine Route an locA beginnt und an locA endet
  • 1 Anfrage für einen Abholtermin an Ort B.
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    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 locA beginnt und an locB endet, mit Matrix „schnell“.
  • 1 Fahrzeug, das seine Route an locB beginnt und an locB endet, mit Matrix „langsam“.
  • 1 Fahrzeug, das seine Route an locB beginnt und an locB endet, mit Matrix „schnell“.
  • 1 Anfrage für einen Abholtermin an locC.
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "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
    }
  }
}
durationDistanceMatrixSrcTags[]

string

Tags, die die Quellen der Zeit- und Entfernungsmatrizen definieren; durationDistanceMatrices(i).rows(j) definiert die Dauer und Entfernung von Besuchen mit dem Tag durationDistanceMatrixSrcTags(j) zu anderen Besuchen in Matrix i.

Tags entsprechen VisitRequest.tags oder Vehicle.start_tags. Ein bestimmter VisitRequest oder Vehicle muss genau mit einem Tag in diesem Feld übereinstimmen. Die Quell-, Ziel- und Matrix-Tags einer Vehicle können identisch sein. 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, darf auch durationDistanceMatrices nicht leer sein.

durationDistanceMatrixDstTags[]

string

Tags, die die Ziele der Zeit- und Entfernungsmatrizen definieren; durationDistanceMatrices(i).rows(j).durations(k) (bzw. durationDistanceMatrices(i).rows(j).meters(k)) definiert die Dauer (bzw. die Entfernung) der Fahrt von Besuchen mit dem Tag durationDistanceMatrixSrcTags(j) zu Besuchen mit dem Tag durationDistanceMatrixDstTags(k) in Matrix i.

Tags entsprechen VisitRequest.tags oder Vehicle.start_tags. Ein bestimmter VisitRequest oder Vehicle muss genau mit einem Tag in diesem Feld übereinstimmen. Die Quell-, Ziel- und Matrix-Tags einer Vehicle können identisch sein. 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, darf auch durationDistanceMatrices nicht leer sein.

transitionAttributes[]

object (TransitionAttributes)

Dem Modell hinzugefügte Übergangsattribute.

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

Kombinationen von nicht kompatiblen Versandtypen (siehe ShipmentTypeIncompatibility)

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

shipmentType-Anforderungen (siehe ShipmentTypeRequirement)

precedenceRules[]

object (PrecedenceRule)

Eine Reihe von Vorrangregeln, die im Modell erzwungen werden müssen.

maxActiveVehicles

integer

Die maximale Anzahl aktiver Fahrzeuge wird eingeschränkt. Ein Fahrzeug ist aktiv, wenn auf seiner Route mindestens ein Versand erfolgt. So lässt sich die Anzahl der Routen begrenzen, wenn es weniger Fahrer als Fahrzeuge gibt und die Fahrzeugflotte heterogen ist. Bei der Optimierung wird dann die beste Teilmenge der Fahrzeuge ausgewählt. Muss strikt positiv sein.

Versand

Der Versand eines einzelnen Artikels von einer Abholstelle zu einer Lieferstelle. Damit die Lieferung als ausgeführt gilt, muss ein einzelnes Fahrzeug einen der Abholorte aufsuchen (und seine Reservekapazitäten entsprechend verringern) und später einen der Lieferorte aufsuchen (und seine Reservekapazitäten entsprechend wieder erhöhen).

JSON-Darstellung
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
Felder
displayName

string

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

pickups[]

object (VisitRequest)

Abholoptionen, die mit der Sendung verknüpft sind. Wenn nichts angegeben ist, muss das Fahrzeug nur einen Standort anfahren, der den Lieferungen entspricht.

deliveries[]

object (VisitRequest)

Mit der Sendung verknüpfte Lieferalternativen. Wenn nichts angegeben ist, muss das Fahrzeug nur einen Standort aufsuchen, der den Abholorten entspricht.

loadDemands

map (key: string, value: object (Load))

Anforderungen an die Ladung der Sendung (z. B. Gewicht, Volumen, Anzahl der Paletten usw.) Die Schlüssel in der Zuordnung sollten IDs sein, die den Typ der entsprechenden Ladung beschreiben, idealerweise auch mit den Einheiten. Beispiele: „weight_kg“, „volume_gallons“, „pallet_count“ usw. Wenn ein bestimmter Schlüssel nicht in der Zuordnung enthalten ist, wird die entsprechende Ladung als null betrachtet.

allowedVehicleIndices[]

integer

Die Fahrzeuge, die diese Lieferung durchführen können. Wenn das Feld leer ist, kann die Aktion von allen Fahrzeugen ausgeführt werden. Fahrzeuge werden in der vehicles-Liste der ShipmentModel anhand ihres Index angegeben.

costsPerVehicle[]

number

Gibt die Kosten an, die bei der Lieferung dieser Sendung mit jedem Fahrzeug anfallen. Falls angegeben, muss Folgendes vorhanden sein:

  • dieselbe Anzahl von Elementen wie costsPerVehicleIndices. costsPerVehicle[i] entspricht Fahrzeug costsPerVehicleIndices[i] des Modells.
  • Es muss dieselbe Anzahl von Elementen wie Fahrzeuge im Modell enthalten. Das i-te Element entspricht Fahrzeug i des Modells.

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

costsPerVehicleIndices[]

integer

Indizes der Fahrzeuge, für die costsPerVehicle gilt. Wenn das Feld nicht leer ist, muss es dieselbe Anzahl von Elementen wie costsPerVehicle enthalten. Ein Fahrzeugindex darf nicht mehrmals angegeben werden. Wenn ein Fahrzeug von costsPerVehicleIndices ausgeschlossen ist, sind die Kosten null.

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

Gibt die maximale absolute Umwegzeit im Vergleich zum kürzesten Weg von der Abholung zur Lieferung an. Wenn angegeben, muss der Wert nicht negativ sein und die Sendung muss mindestens eine Abholung und eine Zustellung enthalten.

Angenommen, t ist die kürzeste Zeit, die benötigt wird, um von der ausgewählten Abholoption direkt zur ausgewählten Lieferoption zu gelangen. Wenn Sie dann pickupToDeliveryAbsoluteDetourLimit festlegen, gilt Folgendes:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

Wenn für dieselbe Sendung sowohl relative als auch absolute Limits angegeben sind, wird für jedes mögliche Abhol-/Lieferpaar das strengere Limit verwendet. Seit Oktober 2017 werden Umwege nur unterstützt, wenn die Reisedauer nicht vom Fahrzeug abhängt.

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

pickupToDeliveryTimeLimit

string (Duration format)

Gibt die maximale Dauer vom Beginn der Abholung bis zum Beginn der Zustellung einer Sendung an. Wenn angegeben, muss der Wert nicht negativ sein und die Sendung muss mindestens eine Abholung und eine Zustellung enthalten. Das hängt nicht davon ab, welche Alternativen für die Abholung und Lieferung ausgewählt werden, und auch nicht von der Fahrzeuggeschwindigkeit. Dieser Wert kann zusammen mit Einschränkungen für die maximale Umleitung angegeben werden. Die Lösung berücksichtigt dann beide Spezifikationen.

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

shipmentType

string

Nicht leerer String, der den „Typ“ für diese Sendung angibt. Mit dieser Funktion können Sie Inkompatibilitäten oder Anforderungen zwischen shipment_types (siehe shipmentTypeIncompatibilities und shipmentTypeRequirements in ShipmentModel) definieren.

Unterscheidet sich von visitTypes, das für einen einzelnen Besuch angegeben wird: Alle Abholungen/Lieferungen, die zu derselben Sendung gehören, haben dieselbe shipmentType.

label

string

Gibt ein Label für diese Sendung an. Dieses Label wird in der Antwort im Feld shipmentLabel der entsprechenden ShipmentRoute.Visit angegeben.

ignore

boolean

Wenn „wahr“ festgelegt ist, wird diese Sendung übersprungen, aber es wird kein penaltyCost angewendet.

Wenn Sie einen Versand ignorieren, führt dies zu einem Validierungsfehler, wenn sich shipmentTypeRequirements im Modell befinden.

Es ist zulässig, eine Lieferung zu ignorieren, die in injectedFirstSolutionRoutes oder injectedSolutionConstraint ausgeführt wird. Der Solver entfernt die zugehörigen Abhol-/Lieferstopps aus der ausführenden Route. precedenceRules, die sich auf ignorierte Sendungen beziehen, werden ebenfalls ignoriert.

penaltyCost

number

Wenn die Sendung nicht abgeschlossen wird, wird diese Strafe auf die Gesamtkosten der Routen angerechnet. Ein Versand gilt als abgeschlossen, wenn eine der Abhol- und Lieferoptionen in Anspruch genommen wird. Die Kosten können in derselben Einheit angegeben werden, die für alle anderen kostenbezogenen Felder im Modell verwendet wird. Sie müssen positiv sein.

WICHTIG: Wenn diese Strafe nicht angegeben ist, gilt sie als unendlich, d.h. die Sendung muss abgeschlossen werden.

pickupToDeliveryRelativeDetourLimit

number

Gibt die maximale relative Umwegzeit im Vergleich zum kürzesten Weg von der Abholung zur Lieferung an. Wenn angegeben, muss der Wert nicht negativ sein und die Sendung muss mindestens eine Abholung und eine Zustellung enthalten.

Angenommen, t ist die kürzeste Zeit, die benötigt wird, um von der ausgewählten Abholoption direkt zur ausgewählten Lieferoption zu gelangen. Wenn Sie dann pickupToDeliveryRelativeDetourLimit festlegen, gilt Folgendes:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

Wenn für dieselbe Sendung sowohl relative als auch absolute Limits angegeben sind, wird für jedes mögliche Abhol-/Lieferpaar das strengere Limit verwendet. Seit Oktober 2017 werden Umwege nur unterstützt, wenn die Reisedauer nicht vom Fahrzeug abhängt.

VisitRequest

Anfrage für einen Besuch, der mit einem Fahrzeug durchgeführt werden kann: Es hat einen (oder zwei, siehe unten) geografischen Standort, Öffnungszeiten, die durch Zeitfenster dargestellt werden, und eine Dienstleistungsdauer (Zeit, die das Fahrzeug nach der Ankunft für die Abholung oder Abgabe von Waren benötigt).

JSON-Darstellung
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
Felder
arrivalLocation

object (LatLng)

Der geografische Standort, an dem das Fahrzeug bei dieser VisitRequest ankommt. Wenn das Versandmodell Zeit-/Entfernungsmatrizen enthält, darf arrivalLocation nicht angegeben werden.

arrivalWaypoint

object (Waypoint)

Der Wegpunkt, an dem das Fahrzeug ankommt, wenn es diese VisitRequest ausführt. Wenn das Versandmodell Zeit-/Entfernungsmatrizen enthält, darf arrivalWaypoint nicht angegeben werden.

departureLocation

object (LatLng)

Der geografische Standort, an dem das Fahrzeug nach Abschluss dieser VisitRequest abfährt. Kann weggelassen werden, wenn sie mit arrivalLocation identisch ist. Wenn das Versandmodell Zeit-/Entfernungsmatrizen enthält, darf departureLocation nicht angegeben werden.

departureWaypoint

object (Waypoint)

Der Wegpunkt, von dem aus das Fahrzeug nach Abschluss dieser VisitRequest abfährt. Kann weggelassen werden, wenn sie mit arrivalWaypoint identisch ist. Wenn das Versandmodell Zeit-/Entfernungsmatrizen enthält, darf departureWaypoint nicht angegeben werden.

tags[]

string

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

timeWindows[]

object (TimeWindow)

Zeitfenster, die die Ankunftszeit bei einem Besuch einschränken. Hinweis: Ein Fahrzeug kann außerhalb des Zeitfensters für die Ankunftszeit abfahren. Das bedeutet, dass Ankunftszeit und Dauer nicht innerhalb eines Zeitfensters liegen müssen. Dies kann zu Wartezeiten führen, wenn das Fahrzeug vor TimeWindow.start_time ankommt.

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

Die Zeitfenster dürfen sich nicht überschneiden, d. h., sie dürfen nicht aneinander angrenzen. Außerdem müssen sie in aufsteigender Reihenfolge angegeben werden.

costPerHourAfterSoftEndTime und softEndTime können nur festgelegt werden, wenn es nur ein Zeitfenster gibt.

duration

string (Duration format)

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

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

cost

number

Kosten für die Erledigung 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 sein und dürfen nicht negativ sein.

loadDemands

map (key: string, value: object (Load))

Ladeanforderungen dieser Besuchsanfrage. Dieses Feld funktioniert genauso wie das Feld Shipment.load_demands, nur dass es nur für diese VisitRequest statt für die gesamte Shipment gilt. Die hier aufgeführten Anforderungen werden den in Shipment.load_demands aufgeführten Anforderungen hinzugefügt.

visitTypes[]

string

Gibt die Arten der Besuche an. So kann zusätzliche Zeit für ein Fahrzeug für diesen Besuch eingeplant werden (siehe Vehicle.extra_visit_duration_for_visit_type).

Ein Typ kann nur einmal vorkommen.

label

string

Gibt ein Label für diese VisitRequest an. Dieses Label wird in der Antwort als visitLabel im entsprechenden ShipmentRoute.Visit angegeben.

LatLng

Ein Objekt, das ein Paar aus Breiten- und Längengrad darstellt. Es wird als Paar von Double-Werten ausgedrückt, die für den Breitengrad und den Längengrad stehen. Sofern nicht anders angegeben, muss es dem World Geodetic System 1984 (WGS 84) entsprechen. Die Werte müssen innerhalb normalisierter Bereiche liegen.

JSON-Darstellung
{
  "latitude": number,
  "longitude": number
}
Felder
latitude

number

Der Breitengrad in Grad. Er muss im Bereich [-90,0, +90,0] liegen.

longitude

number

Der Längengrad in Grad. Er muss im Bereich [-180,0, +180,0] liegen.

Zwischenstopp

Kapselt einen Wegpunkt ein. Wegpunkte markieren die Ankunfts- und Abfahrtsorte von Besuchsanfragen sowie die Start- und Endpunkte von Fahrzeugen.

JSON-Darstellung
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
Felder
sideOfRoad

boolean

Optional. Gibt an, dass das Fahrzeug am Standort dieses Wegpunkts an einer bestimmten Straßenseite halten soll. Wenn Sie diesen Wert festlegen, führt die Route durch den Standort, damit das Fahrzeug an der Straßenseite anhalten kann, die vom Standort aus gesehen auf der rechten Seite der Straße liegt. Diese Option funktioniert nicht für den Mobilitätsmodus „ZU FUSS“.

Union-Feld location_type. Verschiedene Möglichkeiten, einen Standort darzustellen. Für location_type ist nur einer der folgenden Werte zulässig:
location

object (Location)

Ein Punkt, der anhand von geografischen Koordinaten angegeben ist, einschließlich einer optionalen Richtung.

placeId

string

Die POI-Orts-ID, die mit dem Wegpunkt verknüpft ist.

Standort

Umfasst einen Standort (einen geografischen Punkt und eine optionale Überschrift).

JSON-Darstellung
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
Felder
latLng

object (LatLng)

Die geografischen Koordinaten des Wegpunkts.

heading

integer

Die Kompassrichtung, die der Verkehrsflussrichtung entspricht. Mit diesem Wert wird die Straßenseite angegeben, die für die Abholung und Rückgabe verwendet werden soll. Die Werte für die Richtung können zwischen 0 und 360 liegen. 0 gibt dabei die Richtung „Nördlich“ an, 90 die Richtung „Östlich“ usw.

TimeWindow

Zeitfenster begrenzen die Zeit eines Ereignisses, z. B. die Ankunftszeit bei einem Besuch oder den Beginn und das Ende eines Fahrzeugs.

Die festen Zeitfenstergrenzen startTime und endTime erzwingen den frühesten und spätesten Zeitpunkt des Ereignisses, sodass startTime <= event_time <= endTime. Die untere Grenze des weichen Zeitfensters, softStartTime, gibt an, dass das Ereignis am oder nach softStartTime stattfinden soll. Die Kosten sind dabei proportional dazu, wie lange vor dem weichen Startzeitpunkt das Ereignis eintritt. Die obere Grenze des weichen Zeitfensters, softEndTime, gibt an, dass das Ereignis am oder vor softEndTime stattfinden soll. Die Kosten sind proportional dazu, wie lange nach softEndTime das Ereignis eintritt. startTime, endTime, softStartTime und softEndTime müssen innerhalb der globalen Zeitlimits liegen (siehe ShipmentModel.global_start_time und ShipmentModel.global_end_time) und Folgendes einhalten:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
JSON-Darstellung
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
Felder
startTime

string (Timestamp format)

Der Beginn des Zeitfensters. Wenn nicht angegeben, wird ShipmentModel.global_start_time verwendet.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

endTime

string (Timestamp format)

Das Ende des Zeitfensters. Wenn nicht angegeben, wird ShipmentModel.global_end_time verwendet.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

softStartTime

string (Timestamp format)

Die Startzeit des Zeitfensters.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

softEndTime

string (Timestamp format)

Das ungefähre Ende des Zeitfensters.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

costPerHourBeforeSoftStartTime

number

Diese Kosten pro Stunde werden den anderen Kosten im Modell hinzugefügt, wenn das Ereignis vor dem „softStartTime“ eintritt. Sie werden so berechnet:

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

Diese Kosten müssen positiv sein. Das Feld kann nur festgelegt werden, wenn „softStartTime“ festgelegt wurde.

costPerHourAfterSoftEndTime

number

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

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

Diese Kosten müssen positiv sein. Das Feld kann nur festgelegt werden, wenn softEndTime festgelegt wurde.

Fahrzeug

Stellt ein Fahrzeug mit einem Versandproblem dar. Wenn Sie ein Versandproblem beheben, wird für dieses Fahrzeug eine Route von startLocation nach endLocation erstellt. Eine Route besteht aus einer Folge von Besuchen (siehe ShipmentRoute).

JSON-Darstellung
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
Felder
displayName

string

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

travelMode

enum (TravelMode)

Die Mobilitätsform, die sich auf die für das Fahrzeug nutzbaren Straßen und die Geschwindigkeit auswirkt. Siehe auch travelDurationMultiple.

routeModifiers

object (RouteModifiers)

Eine Reihe von Bedingungen, die erfüllt sein müssen und sich auf die Berechnung von Routen für das betreffende Fahrzeug auswirken.

startLocation

object (LatLng)

Geografische Position, an der das Fahrzeug startet, bevor es Sendungen abholt. Wenn keine Angabe erfolgt, beginnt das Fahrzeug bei der ersten Abholung. Wenn das Versandmodell Zeit- und Entfernungsmatrizen hat, darf startLocation nicht angegeben werden.

startWaypoint

object (Waypoint)

Wegpunkt, der einen geografischen Standort darstellt, an dem das Fahrzeug startet, bevor es Sendungen abholt. Wenn weder startWaypoint noch startLocation angegeben ist, beginnt das Fahrzeug bei der ersten Abholung. Wenn das Versandmodell Zeit- und Entfernungsmatrizen hat, darf startWaypoint nicht angegeben werden.

endLocation

object (LatLng)

Geografische Position, an der das Fahrzeug endet, nachdem es seine letzte VisitRequest abgeschlossen hat. Wenn nicht angegeben, endet die ShipmentRoute des Fahrzeugs sofort, wenn es seine letzte VisitRequest abgeschlossen hat. Wenn das Versandmodell Zeit- und Entfernungsmatrizen hat, darf endLocation nicht angegeben werden.

endWaypoint

object (Waypoint)

Wegpunkt, der einen geografischen Ort darstellt, an dem das Fahrzeug anhält, nachdem es seine letzte VisitRequest abgeschlossen hat. Wenn weder endWaypoint noch endLocation angegeben ist, endet die ShipmentRoute des Fahrzeugs sofort, wenn es seine letzte VisitRequest abgeschlossen hat. Wenn das Versandmodell Zeit- und Entfernungsmatrizen hat, darf endWaypoint nicht angegeben werden.

startTags[]

string

Gibt Tags an, die am Anfang der Route des Fahrzeugs angebracht sind.

Leere oder doppelte Strings sind nicht zulässig.

endTags[]

string

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

Leere oder doppelte Strings sind nicht zulässig.

startTimeWindows[]

object (TimeWindow)

Zeitfenster, in denen das Fahrzeug den Startort verlassen kann. Sie müssen innerhalb der globalen Zeitlimits liegen (siehe ShipmentModel.global_*-Felder). Wenn keine Angabe erfolgt, gibt es neben diesen globalen Zeitlimits keine weiteren Einschränkungen.

Zeitfenster, die zum selben wiederholten Feld gehören, dürfen sich nicht überschneiden. Sie müssen also nicht aneinandergrenzen und in chronologischer Reihenfolge angeordnet sein.

costPerHourAfterSoftEndTime und softEndTime können nur festgelegt werden, wenn es nur ein Zeitfenster gibt.

endTimeWindows[]

object (TimeWindow)

Zeitfenster, in denen das Fahrzeug am Zielort ankommen kann. Sie müssen innerhalb der globalen Zeitlimits liegen (siehe ShipmentModel.global_*-Felder). Wenn keine Angabe erfolgt, gibt es neben diesen globalen Zeitlimits keine weiteren Einschränkungen.

Zeitfenster, die zum selben wiederholten Feld gehören, dürfen sich nicht überschneiden. Sie müssen also nicht aneinandergrenzen und in chronologischer Reihenfolge angeordnet sein.

costPerHourAfterSoftEndTime und softEndTime können nur festgelegt werden, wenn es nur ein Zeitfenster gibt.

unloadingPolicy

enum (UnloadingPolicy)

Für das Fahrzeug gilt eine Richtlinie für das Entladen.

loadLimits

map (key: string, value: object (LoadLimit))

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

costPerHour

number

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

Kosten pro Stunde der Fahrzeugroute. Diese Kosten werden auf die Gesamtzeit der Route angewendet und umfassen Fahrtzeit, Wartezeit und Besuchszeit. Die Verwendung von costPerHour anstelle von nur costPerTraveledHour kann zu einer zusätzlichen Latenz führen.

costPerTraveledHour

number

Kosten pro zurückgelegte Stunde der Fahrzeugroute. Diese Kosten werden nur auf die Fahrzeit der Route angewendet (d.h. die in ShipmentRoute.transitions angegebene Fahrzeit) und schließen Wartezeit und Besuchszeit aus.

costPerKilometer

number

Kosten pro Kilometer der Fahrzeugroute. Diese Kosten werden auf die in der ShipmentRoute.transitions angegebene Entfernung angewendet und nicht auf eine implizit zurückgelegte Entfernung vom arrivalLocation zum departureLocation einer einzelnen VisitRequest.

fixedCost

number

Pauschalkosten, die anfallen, wenn dieses Fahrzeug für die Bearbeitung einer Sendung verwendet wird.

usedIfRouteIsEmpty

boolean

Dieses Feld gilt nur für Fahrzeuge, deren Route keine Sendungen umfasst. Gibt an, ob das Fahrzeug in diesem Fall als gebraucht betrachtet werden soll oder nicht.

Wenn „wahr“ festgelegt ist, fährt das Fahrzeug vom Start- zum Zielort, auch wenn es keine Sendungen abwickelt. Die Zeit- und Entfernungskosten für die Fahrt vom Start- zum Zielort werden berücksichtigt.

Andernfalls fährt es nicht vom Start- zum Zielort und für dieses Fahrzeug sind keine breakRule oder Verzögerungen (von TransitionAttributes) geplant. In diesem Fall enthält die ShipmentRoute des Fahrzeugs keine Informationen mit Ausnahme des Fahrzeugindexes und des Labels.

routeDurationLimit

object (DurationLimit)

Limit für die Gesamtdauer der Route des Fahrzeugs. In einem bestimmten OptimizeToursResponse ist die Routendauer eines Fahrzeugs die Differenz zwischen vehicleEndTime und vehicleStartTime.

travelDurationLimit

object (DurationLimit)

Beschränkung, die auf die Fahrtdauer der Route des Fahrzeugs angewendet wird. In einer bestimmten OptimizeToursResponse ist die Fahrzeit der Route die Summe aller transitions.travel_duration.

routeDistanceLimit

object (DistanceLimit)

Beschränkung, die auf die Gesamtstrecke der Route des Fahrzeugs angewendet wird. In einer bestimmten OptimizeToursResponse ist die Streckenlänge die Summe aller transitions.travel_distance_meters.

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

Hier wird eine Zuordnung von Strings vom Typ „visitTypes“ zu Zeiträumen angegeben. Die Dauer ist die Zeit, die zusätzlich zu VisitRequest.duration bei Besuchen mit der angegebenen visitTypes benötigt wird. Wenn costPerHour angegeben ist, fallen für diese zusätzliche Besuchsdauer Kosten an. Schlüssel (z.B. visitTypes) dürfen keine leeren Strings sein.

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

breakRule

object (BreakRule)

Beschreibt den Pausenplan, der für dieses Fahrzeug gelten 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 vehicleLabel der entsprechenden ShipmentRoute angegeben.

ignore

boolean

Wenn „true“ angegeben ist, muss usedIfRouteIsEmpty „false“ sein. Dieses Fahrzeug wird nicht verwendet.

Wenn ein Versand von einem in injectedFirstSolutionRoutes ignorierten Fahrzeug durchgeführt wird, wird er in der ersten Lösung übersprungen, kann aber in der Antwort ausgeführt werden.

Wenn ein Versand von einem ignorierten Fahrzeug in injectedSolutionConstraint durchgeführt wird und die zugehörige Abholung/Lieferung am Fahrzeug verbleiben muss (d.h. nicht auf Stufe RELAX_ALL_AFTER_THRESHOLD gelockert wird), wird sie in der Antwort übersprungen. Wenn eine Sendung ein nicht leeres Feld allowedVehicleIndices hat und alle zulässigen Fahrzeuge ignoriert werden, wird sie in der Antwort übersprungen.

travelDurationMultiple

number

Gibt einen Multiplikator an, mit dem die Fahrtzeiten dieses Fahrzeugs erhöht oder verringert werden können. Wenn Sie diesen Wert beispielsweise auf 2,0 festlegen, ist dieses Fahrzeug langsamer und die Fahrzeiten sind doppelt so lang wie bei Standardfahrzeugen. Dieser Multiplikator hat keine Auswirkungen auf die Besuchsdauer. Wenn costPerHour oder costPerTraveledHour angegeben ist, wirkt sich das auf die Kosten aus. Er muss im Bereich [0,001, 1.000,0] liegen. Wenn dieser Wert nicht festgelegt ist, ist das Fahrzeug standardmäßig und dieser Multiplikator wird als 1, 0 betrachtet.

WARNUNG: Die Fahrtzeiten werden nach Anwendung dieses Multiplikators, aber vor der Ausführung numerischer Vorgänge auf die nächste Sekunde gerundet. Ein kleiner Multiplikator kann daher zu einem Genauigkeitsverlust führen.

Weitere Informationen finden Sie unter extraVisitDurationForVisitType unten.

TravelMode

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

Diese sollten eine Teilmenge der bevorzugten Mobilitätsarten der Google Maps Platform Routes API sein. 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 Wegbeschreibung für Pkw entspricht (Auto, …).
WALKING Mobilitätsform, die der Wegbeschreibung für Fußgänger entspricht.

RouteModifiers

Umfasst eine Reihe optionaler Bedingungen, die bei der Berechnung von Fahrzeugrouten erfüllt werden müssen. Dies entspricht RouteModifiers in der Google Maps Platform Routes Preferred API. Weitere Informationen finden Sie unter https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

JSON-Darstellung
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
Felder
avoidTolls

boolean

Gibt an, ob Mautstraßen nach Möglichkeit vermieden werden sollen. Es werden Routen bevorzugt, die keine Mautstraßen enthalten. Gilt nur für motorisierte Fortbewegungsmittel.

avoidHighways

boolean

Gibt an, ob Autobahnen nach Möglichkeit vermieden werden sollen. Vorzug wird Routen gegeben, die keine Autobahnen enthalten. Gilt nur für motorisierte Fortbewegungsmittel.

avoidFerries

boolean

Gibt an, ob Fähren nach Möglichkeit vermieden werden sollen. Vorzug wird Routen eingeräumt, die keine Fahrten mit Fähren enthalten. Gilt nur für motorisierte Fortbewegungsmittel.

avoidIndoor

boolean

Optional. Gibt an, ob Routen in Innenräumen nach Möglichkeit vermieden werden sollen. Vorzug haben Routen, die keine Indoor-Navigation enthalten. Gilt nur für den WALKING-Reisemodus.

UnloadingPolicy

Richtlinie zum Entladen eines Fahrzeugs. Gilt nur für Sendungen, die sowohl eine Abholung als auch eine Lieferung umfassen.

Andere Sendungen können unabhängig von unloadingPolicy an jeder beliebigen Stelle auf der Route erfolgen.

Enums
UNLOADING_POLICY_UNSPECIFIED Keine Angabe zu Entladerichtlinien; Lieferungen müssen direkt nach den entsprechenden Abholungen erfolgen.
LAST_IN_FIRST_OUT Die Lieferungen müssen in umgekehrter Reihenfolge der Abholungen erfolgen.
FIRST_IN_FIRST_OUT Die Lieferungen müssen in derselben Reihenfolge wie die Abholungen erfolgen.

LoadLimit

Definiert ein Ladelimit für ein Fahrzeug, z. B. „Dieser Lkw darf nur bis zu 3.500 kg laden“. loadLimits ansehen.

JSON-Darstellung
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string
}
Felder
softMaxLoad

string (int64 format)

Ein weiches Limit für die Auslastung. costPerUnitAboveSoftMax ansehen.

costPerUnitAboveSoftMax

number

Wenn die Auslastung auf der Route dieses Fahrzeugs softMaxLoad überschreitet, gilt (nur einmal pro Fahrzeug) die folgende Kostenpauschale: (Auslastung – softMaxLoad) * costPerUnitAboveSoftMax. Alle Kosten werden addiert und müssen in derselben Einheit wie Shipment.penalty_cost angegeben werden.

startLoadInterval

object (Interval)

Das zulässige Ladeintervall des Fahrzeugs zu Beginn der Route.

endLoadInterval

object (Interval)

Das zulässige Ladeintervall des Fahrzeugs am Ende der Route.

maxLoad

string (int64 format)

Die maximal zulässige Auslastung.

Intervall

Intervall der zulässigen Lademengen.

JSON-Darstellung
{
  "min": string,
  "max": string
}
Felder
min

string (int64 format)

Eine akzeptable Mindestauslastung. Muss ≥ 0 sein. Wenn beide angegeben sind, muss min ≤ max sein.

max

string (int64 format)

Eine maximal zulässige Auslastung. Muss ≥ 0 sein. Wenn keine Angabe gemacht wird, ist die maximale Auslastung durch diese Nachricht nicht eingeschränkt. Wenn beide angegeben sind, muss min ≤ max sein.

DurationLimit

Ein Limit, das die maximale Dauer der Route eines Fahrzeugs definiert. Sie kann hart oder weich sein.

Wenn ein Feld für den flexiblen Grenzwert definiert ist, müssen sowohl der Grenzwert für den flexiblen Maximalwert als auch die zugehörigen Kosten gemeinsam definiert werden.

JSON-Darstellung
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
Felder
maxDuration

string (Duration format)

Ein starres Limit, das die Dauer auf maximal maxDuration beschränkt.

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

softMaxDuration

string (Duration format)

Ein weiches Limit, das keine maximale Dauer vorschreibt, aber bei dessen Überschreitung Kosten für die Route anfallen. Diese Kosten werden mit anderen im Modell definierten Kosten mit derselben Einheit addiert.

Falls angegeben, darf softMaxDuration nicht negativ sein. Wenn auch „maxDuration“ definiert ist, muss softMaxDuration kleiner als „maxDuration“ sein.

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

quadraticSoftMaxDuration

string (Duration format)

Ein weiches Limit, das keine maximale Dauer vorschreibt, aber bei dessen Überschreitung für die Route Kosten anfallen, die quadratisch mit der Dauer ansteigen. Diese Kosten werden mit anderen im Modell definierten Kosten mit derselben Einheit addiert.

Falls angegeben, darf quadraticSoftMaxDuration nicht negativ sein. Wenn auch maxDuration definiert ist, muss quadraticSoftMaxDuration kleiner als maxDuration sein und der Unterschied darf nicht mehr als einen Tag betragen:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

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

costPerHourAfterSoftMax

number

Kosten pro Stunde, die anfallen, wenn der Grenzwert von softMaxDuration überschritten wird. Die zusätzlichen Kosten betragen 0, wenn die Dauer unter der Schwelle liegt. Andernfalls hängen die Kosten von der Dauer ab:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

Die Kosten dürfen nicht negativ sein.

costPerSquareHourAfterQuadraticSoftMax

number

Kosten pro Quadratkilometer und Stunde, die anfallen, wenn der Grenzwert von quadraticSoftMaxDuration überschritten wird.

Die zusätzlichen Kosten betragen 0, wenn die Dauer unter der Schwelle liegt. Andernfalls hängen die Kosten von der Dauer ab:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

Die Kosten dürfen nicht negativ sein.

DistanceLimit

Ein Limit, das die maximale zurückgelegte Strecke definiert. Sie kann hart oder weich sein.

Wenn ein weiches Limit definiert ist, müssen sowohl softMaxMeters als auch costPerKilometerAboveSoftMax definiert sein und nicht negativ sein.

JSON-Darstellung
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
Felder
maxMeters

string (int64 format)

Eine feste Grenze, die die Entfernung auf maxMeters begrenzt. Das Limit darf nicht negativ sein.

softMaxMeters

string (int64 format)

Ein weiches Limit, das keine maximale Entfernung vorschreibt, aber bei einem Verstoß zu Kosten führt, die sich mit anderen im Modell definierten Kosten mit derselben Einheit addieren.

Falls definiert, muss „softMaxMeters“ kleiner als „maxMeters“ sein und darf nicht negativ sein.

costPerKilometerBelowSoftMax

number

Angefallene Kosten pro Kilometer, bis zu softMaxMeters, mit der Formel:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

Diese Kosten werden in routeDistanceLimit nicht unterstützt.

costPerKilometerAboveSoftMax

number

Kosten pro Kilometer, wenn die Entfernung das Limit von softMaxMeters überschreitet. Die zusätzlichen Kosten betragen 0, wenn die Entfernung unter dem Grenzwert liegt. Andernfalls wird die folgende Formel zur Berechnung der Kosten verwendet:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

Die Kosten dürfen nicht negativ sein.

BreakRule

Regeln zum Generieren von Pausen für ein Fahrzeug (z.B. Mittagspausen). Eine Pause ist ein zusammenhängender Zeitraum, in dem das Fahrzeug an seiner aktuellen Position inaktiv bleibt und keine Besuche durchführen kann. Unterbrechungen können in folgenden Fällen auftreten:

  • während der Fahrt zwischen zwei Besuchen (einschließlich der Zeit direkt vor oder direkt nach einem Besuch, aber nicht in der Mitte eines Besuchs), in diesem Fall wird die entsprechende Fahrtzeit zwischen den Besuchen verlängert,
  • oder vor dem Start des Fahrzeugs (das Fahrzeug wird möglicherweise nicht mitten in einer Pause gestartet), in diesem Fall hat es keinen Einfluss auf die Startzeit des Fahrzeugs.
  • oder nach dem Ende des Fahrzeugs (ebenfalls mit der Endzeit des Fahrzeugs).
JSON-Darstellung
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
Felder
breakRequests[]

object (BreakRequest)

Abfolge von Pausen. Weitere Informationen finden Sie in der Nachricht BreakRequest.

frequencyConstraints[]

object (FrequencyConstraint)

Es können mehrere FrequencyConstraint gelten. Sie müssen alle durch die BreakRequest dieses BreakRule erfüllt werden. Siehe FrequencyConstraint.

BreakRequest

Die Abfolge der Pausen (d.h. ihre Anzahl und Reihenfolge), die für jedes Fahrzeug gelten, muss im Voraus bekannt sein. Die wiederholten BreakRequest definieren diese Sequenz in der Reihenfolge, in der sie auftreten müssen. Die Zeitfenster (earliestStartTime / latestStartTime) dürfen sich überschneiden, müssen aber mit der Bestellung kompatibel sein (dies wird geprüft).

JSON-Darstellung
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
Felder
earliestStartTime

string (Timestamp format)

Erforderlich. Untere Grenze (einschließlich) des Beginns der Pause.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

latestStartTime

string (Timestamp format)

Erforderlich. Obergrenze (einschließlich) für den Beginn der Pause.

Ein Zeitstempel im Format RFC3339 UTC "Zulu" mit einer Auflösung im Nanosekundenbereich und bis zu neun Nachkommastellen. Beispiele: "2014-10-02T15:01:23Z" und "2014-10-02T15:01:23.045123456Z".

minDuration

string (Duration format)

Erforderlich. Mindestdauer der Werbeunterbrechung. Muss positiv sein.

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

FrequencyConstraint

Die Häufigkeit und Dauer der oben genannten Pausen kann weiter eingeschränkt werden, indem eine Mindestpausenfrequenz erzwungen wird, z. B. „Alle 12 Stunden muss eine Pause von mindestens einer Stunde eingelegt werden“. Angenommen, dies kann als „Innerhalb eines gleitenden Zeitfensters von 12 Stunden muss es mindestens eine Pause von mindestens einer Stunde geben“ interpretiert werden, würde dieses Beispiel in die folgende FrequencyConstraint übersetzt:

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

Bei der Zeit und Dauer der Werbeunterbrechungen in der Lösung werden alle diese Einschränkungen berücksichtigt, zusätzlich zu den Zeitfenstern und Mindestdauern, die bereits in der BreakRequest angegeben sind.

Ein FrequencyConstraint kann in der Praxis auch auf nicht aufeinanderfolgende Pausen angewendet werden. Im folgenden Zeitplan wird beispielsweise das Beispiel „1 Stunde alle 12 Stunden“ 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
JSON-Darstellung
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
Felder
minBreakDuration

string (Duration format)

Erforderlich. Mindestdauer der Unterbrechung für diese Einschränkung. Nicht negativ. Siehe Beschreibung von FrequencyConstraint.

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

maxInterBreakDuration

string (Duration format)

Erforderlich. Maximale zulässige Spanne eines Zeitintervalls auf der Route, das nicht mindestens teilweise eine Pause von duration >= minBreakDuration umfasst. Muss positiv sein.

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

DurationDistanceMatrix

Gibt eine Matrix mit Dauer und Entfernung vom Start- und Endpunkt des Besuchs zum Start- und Endpunkt des Fahrzeugs an.

JSON-Darstellung
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
Felder
rows[]

object (Row)

Gibt die Zeilen der Matrix für Dauer und Entfernung an. Es muss dieselbe Anzahl an Elementen wie ShipmentModel.duration_distance_matrix_src_tags haben.

vehicleStartTag

string

Tag, das angibt, für welche Fahrzeuge diese Matrix mit Dauer und Entfernung gilt. Wenn das Feld leer ist, gilt dies für alle Fahrzeuge und es kann nur eine einzige Matrix geben.

Jeder Fahrzeugstart muss genau einer Matrix entsprechen, d.h. genau eines der startTags-Felder muss mit der vehicleStartTag einer Matrix (und nur dieser Matrix) übereinstimmen.

Alle Matrizen müssen eine unterschiedliche vehicleStartTag haben.

Zeile

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

JSON-Darstellung
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
Felder
durations[]

string (Duration format)

Dauerwerte für eine bestimmte Zeile. Es muss dieselbe Anzahl an Elementen wie ShipmentModel.duration_distance_matrix_dst_tags haben.

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

meters[]

number

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.

TransitionAttributes

Gibt Attribute von Übergängen zwischen zwei aufeinanderfolgenden Besuchen auf einer Route an. Für dieselbe Umstellung können mehrere TransitionAttributes gelten. In diesem Fall werden alle zusätzlichen Kosten addiert und die strengste Einschränkung oder das strengste Limit angewendet (entsprechend der natürlichen „AND“-Semantik).

JSON-Darstellung
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
Felder
srcTag

string

Tags, die die (src->dst)-Übergänge definieren, auf die diese Attribute angewendet werden.

Ein Quellbesuch oder Fahrzeugstart wird nur dann abgeglichen, wenn VisitRequest.tags oder Vehicle.start_tags entweder srcTag oder keine excludedSrcTag enthält (je nachdem, welches dieser beiden Felder nicht leer ist).

excludedSrcTag

string

srcTag ansehen. Genau eine von srcTag und excludedSrcTag darf nicht leer sein.

dstTag

string

Ein Zielbesuch oder ein Fahrzeugende stimmt genau dann überein, wenn VisitRequest.tags oder Vehicle.end_tags entweder dstTag oder nicht excludedDstTag enthält (je nachdem, welches dieser beiden Felder nicht leer ist).

excludedDstTag

string

dstTag ansehen. Genau eine von dstTag und excludedDstTag darf nicht leer sein.

cost

number

Gibt die Kosten für die Durchführung dieser Umwandlung an. Dieser Wert hat dieselbe Einheit wie alle anderen Kosten im Modell und darf nicht negativ sein. Sie wird auf alle anderen bestehenden Kosten aufgeschlagen.

costPerKilometer

number

Gibt einen Kostenpreis pro Kilometer an, der auf die zurückgelegte Strecke bei diesem Übergang angewendet wird. Sie wird zu allen Vehicle.cost_per_kilometer addiert, die für Fahrzeuge angegeben sind.

distanceLimit

object (DistanceLimit)

Gibt ein Limit für die zurückgelegte Strecke bei diesem Übergang an.

Seit Juni 2021 werden nur noch Softlimits unterstützt.

delay

string (Duration format)

Gibt eine Verzögerung an, die beim Ausführen dieses Übergangs auftritt.

Diese Verzögerung tritt immer nach dem Ende des Quellbesuchs und vor Beginn des Zielbesuchs auf.

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

ShipmentTypeIncompatibility

Gibt Inkompatibilitäten zwischen Sendungen an, die sich aus ihrem shipmentType ergeben. Die Anzeige inkompatibler Sendungen auf derselben Route ist je nach Inkompatibilitätsmodus eingeschränkt.

JSON-Darstellung
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
Felder
types[]

string

Liste der inkompatiblen Typen. Zwei Sendungen mit unterschiedlichen shipment_types-Werten sind „nicht kompatibel“.

incompatibilityMode

enum (IncompatibilityMode)

Modus, der auf die Inkompatibilität angewendet wird.

IncompatibilityMode

Modi, die festlegen, wie die Anzeige inkompatibler Sendungen auf derselben Route eingeschränkt wird.

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

Bei zwei Sendungen mit inkompatiblen Typen im NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY-Inkompatibilitätsmodus:

  • Wenn es sich bei beiden um Abholungen (keine Lieferungen) oder Lieferungen (keine Abholungen) handelt, können sie nicht dasselbe Fahrzeug nutzen.
  • Wenn eine der Sendungen zugestellt und die andere abgeholt werden soll, können die beiden Sendungen dasselbe Fahrzeug nutzen, sofern die erste Sendung zugestellt wird, bevor die zweite abgeholt wird.

ShipmentTypeRequirement

Hiermit werden Anforderungen an Sendungen basierend auf ihrem shipmentType angegeben. Die Details der Anforderung werden durch den Anforderungsmodus definiert.

JSON-Darstellung
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
Felder
requiredShipmentTypeAlternatives[]

string

Liste der alternativen Versandtypen, die für die dependentShipmentTypes erforderlich sind.

dependentShipmentTypes[]

string

Für alle Sendungen mit einem Typ im Feld dependentShipmentTypes muss auf derselben Route mindestens eine Sendung vom Typ requiredShipmentTypeAlternatives besucht werden.

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

requirementMode

enum (RequirementMode)

Modus, der auf die Anforderung angewendet wird.

RequirementMode

Modi, die das Aussehen abhängiger Sendungen 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 alle „abhängigen“ Sendungen dasselbe Fahrzeug wie mindestens eine ihrer „erforderlichen“ Sendungen nutzen.
IN_SAME_VEHICLE_AT_PICKUP_TIME

Im Modus IN_SAME_VEHICLE_AT_PICKUP_TIME muss sich zum Zeitpunkt der Abholung in jedem Fahrzeug mindestens eine „erforderliche“ Sendung befinden.

Für die Abholung einer „abhängigen“ Sendung muss daher Folgendes angegeben sein:

  • Eine „erforderliche“ Lieferung, die auf dem Weg nach oder
  • Eine „erforderliche“ Sendung, die auf der Route vor der abhängigen Sendung abgeholt wurde. Wenn die „erforderliche“ Sendung eine Zustellung hat, muss diese Zustellung nach der Abholung der abhängigen Sendung erfolgen.
IN_SAME_VEHICLE_AT_DELIVERY_TIME Wie bisher, mit der Ausnahme, dass die „abhängigen“ Sendungen zum Zeitpunkt der Lieferung eine „erforderliche“ Sendung im Fahrzeug haben müssen.

PrecedenceRule

Eine Vorrangregel zwischen zwei Ereignissen (jedes Ereignis ist die Abholung oder Zustellung einer Sendung): Das „zweite“ Ereignis muss mindestens offsetDuration nach Beginn des „ersten“ Ereignisses beginnen.

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

Außerdem gelten Vorrangregeln nur, wenn beide Sendungen ausgeführt werden. Andernfalls werden sie ignoriert.

JSON-Darstellung
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
Felder
firstIsDelivery

boolean

Gibt an, ob das erste Ereignis eine Übermittlung ist.

secondIsDelivery

boolean

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

offsetDuration

string (Duration format)

Die Zeitverschiebung zwischen dem ersten und dem zweiten Ereignis. Sie kann negativ sein.

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

firstIndex

integer

Versandindex des ersten Ereignisses. Dieses Feld muss angegeben werden.

secondIndex

integer

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