In diesem Leitfaden werden loadDemands
und loadLimits
und ihre Beziehung zu den einzelnen Produkten beschrieben.
Sonstiges.
Wie unter Einschränkungen für Abhol- und Lieferzeiträume erwähnt, ist das Feld
OptimizeToursRequest
-Nachricht (REST, gRPC) enthält eine Reihe von
Properties festlegen, die Einschränkungen für das zu optimierende Problem angeben. Mehrere
OptimizeToursRequest
-Attribute stehen für Lasteinschränkungen.
Fahrzeuge und Sendungen haben physikalische Eigenschaften, die bei der Routenplanung berücksichtigt werden müssen.
- Fahrzeuge: Die Eigenschaft
loadLimits
gibt die maximale Last an, die das Fahrzeug die das Fahrzeug bewältigen kann. Die NachrichtVehicle
ansehen (REST, gRPC) Dokumentation. - Sendungen: Mit der Property
loadDemands
wird angegeben, wie viel Last eine bestimmte Sendung beansprucht. Weitere Informationen finden Sie in der Dokumentation zurShipment
-Nachricht (REST, gRPC).
Zusammen ermöglichen diese beiden Einschränkungen dem Optimierer, Sendungen Fahrzeugen so zuzuweisen, dass sie am besten zu Ihrer Flotte und den Versandanforderungen passen.
Im weiteren Verlauf dieses Dokuments werden loadLimits
und loadDemands
ausführlich behandelt.
Lastanforderungen und -limits: Typen
Sie geben jede Lastnachfrage und Limitbeschränkung in Bezug auf einen Typ aus.
Sie können eigene Ladetypen angeben, z. B.:
- Gewicht
- Volume
- lineare Maße
- Namen der transportierten Gegenstände oder Ausrüstung
In dieser Anleitung wird weightKg
als Beispieltyp verwendet.
Sowohl Shipment.loadDemands
als auch Vehicle.loadLimits
verwenden den map
-Typ von Protocol Buffers mit string
-Schlüsseln, die die Arten der Auslastung darstellen.
Für Shipment.loadDemands
-Werte wird die Load
-Nachricht verwendet (REST, gRPC).
Die Load
-Nachricht enthält eine einzelne amount
-Eigenschaft, die angibt, wie viel Kapazität für die Durchführung der Sendung vom angegebenen Typ erforderlich ist.
Für Vehicle.loadLimits
-Werte wird die LoadLimit
-Nachricht verwendet (REST, gRPC). Die Nachricht LoadLimit
hat mehrere Eigenschaften, wobei maxLoad
enthalten ist
für die maximale Traglast des Fahrzeugs im angegebenen Typ.
Die loadDemands
einer Sendung beansprucht die loadLimits
des zugewiesenen Fahrzeugs nur, wenn die beiden über übereinstimmende Schlüssel für den Ladetyp verfügen. Beispiel: Eine Lieferung mit
loadDemands
von:
"loadDemands": {
"weightKg": {
"amount": 50
}
}
erfordert 50 Ladeeinheiten vom Typ weightKg
, damit die Lieferung
abgeschlossen. Ein Fahrzeug mit loadLimits
von:
"loadLimits": {
"weightKg": {
"maxLoad": 100
}
}
möglicherweise die Lieferung abschließen, da die maxLoad
des Fahrzeugs
Der Typ „weightKg
“ ist größer oder gleich dem loadDemands
der Sendung in
den Typ weightKg
. Ein Fahrzeug mit loadLimits
von:
"loadLimits": {
"equipmentRackStorage": {
"maxLoad": 10
}
}
hat aufgrund des Fehlens eines weightKg
-Nutzlastlimits implizit eine unbegrenzte weightKg
-Kapazität. Das Fahrzeug ist also nicht durch das Gewicht der Sendung eingeschränkt.
Ladungsumschlag zwischen Sendungen und Fahrzeugen
Wenn Sendungen von Fahrzeugen abgeholt und zugestellt werden, wird die loadDemand
der Sendung zwischen der Sendung und dem Fahrzeug übertragen. Die Ladung des Fahrzeugs finden Sie im routes.transitions
-Eintrag der OptimizeToursResponse
-Nachricht (REST, gRPC) für ein bestimmtes Fahrzeug. Die Reihenfolge ist so
folgt:
- Die erforderliche Ladekapazität wird für den Versand als
loadDemand
definiert. - Die Sendung wird vom zugewiesenen Fahrzeug und der
vehicleLoads
erhöht sich um dieloadDemand
der Sendung. Dieses Übertragung wird in der Antwort durch positivevisits.loadDemands
dargestellt . - Das Fahrzeug liefert die Sendung aus und die
vehicleLoads
des Fahrzeugs verringert sich um den Wert derloadDemand
der gelieferten Sendung. Diese Übertragung ist in der Antwortnachricht durch negativevisits.loadDemands
dargestellt.
Der Wert für „vehicleLoads
“ eines Fahrzeugs darf zu keinem Zeitpunkt den angegebenen Wert für „loadLimits
“ überschreiten
auf seiner Route.
Vollständiges Beispiel mit Lastanforderungen und -limits
Beispielanfrage mit Lastanforderungen und Limits
{ "populatePolylines": false, "populateTransitionPolylines": false, "model": { "globalStartTime": "2023-01-13T16:00:00Z", "globalEndTime": "2023-01-14T16:00:00Z", "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": 50 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 15.0, "loadDemands": { "weightKg": { "amount": 10 } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "pickups": [ { "arrivalLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "duration": "150s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": 80 } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": 100 } } } ] } }
Die Beispielanfrage enthält mehrere auf Auslastung bezogene Parameter:
shipments[0]
hat eine Lastanforderung von 50weightKg
.- „
shipments[1]
“ hat eine Lastanforderung von 10weightKg
. - „
shipments[2]
“ hat einen Ladebedarf von 80weightKg
. vehicles[0]
hat ein Ladelimit von 100weightKg
.
Eine Antwort auf die Anfrage mit Ladeanforderungen und Limits
{ "routes": [ { "vehicleStartTime": "2023-01-13T16:00:00Z", "vehicleEndTime": "2023-01-13T16:43:27Z", "visits": [ { "isPickup": true, "startTime": "2023-01-13T16:00:00Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "50" } } }, { "shipmentIndex": 1, "isPickup": true, "startTime": "2023-01-13T16:02:30Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "10" } } }, { "startTime": "2023-01-13T16:08:55Z", "detour": "150s", "loadDemands": { "weightKg": { "amount": "-50" } } }, { "shipmentIndex": 1, "startTime": "2023-01-13T16:16:37Z", "detour": "343s", "loadDemands": { "weightKg": { "amount": "-10" } } }, { "shipmentIndex": 2, "isPickup": true, "startTime": "2023-01-13T16:27:07Z", "detour": "1627s", "loadDemands": { "weightKg": { "amount": "80" } } }, { "shipmentIndex": 2, "startTime": "2023-01-13T16:36:26Z", "detour": "0s", "loadDemands": { "weightKg": { "amount": "-80" } } } ], "transitions": [ { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:00:00Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "0s", "waitDuration": "0s", "totalDuration": "0s", "startTime": "2023-01-13T16:02:30Z", "vehicleLoads": { "weightKg": { "amount": "50" } } }, { "travelDuration": "235s", "travelDistanceMeters": 795, "waitDuration": "0s", "totalDuration": "235s", "startTime": "2023-01-13T16:05:00Z", "vehicleLoads": { "weightKg": { "amount": "60" } } }, { "travelDuration": "212s", "travelDistanceMeters": 791, "waitDuration": "0s", "totalDuration": "212s", "startTime": "2023-01-13T16:13:05Z", "vehicleLoads": { "weightKg": { "amount": "10" } } }, { "travelDuration": "380s", "travelDistanceMeters": 1190, "waitDuration": "0s", "totalDuration": "380s", "startTime": "2023-01-13T16:20:47Z", "vehicleLoads": { "weightKg": {} } }, { "travelDuration": "409s", "travelDistanceMeters": 1371, "waitDuration": "0s", "totalDuration": "409s", "startTime": "2023-01-13T16:29:37Z", "vehicleLoads": { "weightKg": { "amount": "80" } } }, { "travelDuration": "171s", "travelDistanceMeters": 665, "waitDuration": "0s", "totalDuration": "171s", "startTime": "2023-01-13T16:40:36Z", "vehicleLoads": { "weightKg": {} } } ], "metrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "routeCosts": { "model.vehicles.cost_per_kilometer": 48.12, "model.vehicles.cost_per_hour": 28.966666666666665 }, "routeTotalCost": 77.086666666666659 } ], "metrics": { "aggregatedRouteMetrics": { "performedShipmentCount": 3, "travelDuration": "1407s", "waitDuration": "0s", "delayDuration": "0s", "breakDuration": "0s", "visitDuration": "1200s", "totalDuration": "2607s", "travelDistanceMeters": 4812, "maxLoads": { "weightKg": { "amount": "80" } } }, "usedVehicleCount": 1, "earliestVehicleStartTime": "2023-01-13T16:00:00Z", "latestVehicleEndTime": "2023-01-13T16:43:27Z", "totalCost": 77.086666666666659, "costs": { "model.vehicles.cost_per_hour": 28.966666666666665, "model.vehicles.cost_per_kilometer": 48.12 } } }
Die hinzugefügten Lasteinschränkungen wirken sich auf die Reihenfolge von visits
aus:
shipment[0]
wurde abgeholtshipment[1]
wurde abgeholtshipment[0]
wurde zugestelltshipment[1]
wird ausgeliefertshipment[2]
wird abgeholtshipment[2]
wurde zugestellt
Dieser Auftrag zeigt, dass drei Sendungen nicht gleichzeitig mit dem Fahrzeug ausgeführt werden können, da ihre Gesamt-loadDemands
die loadLimits
des Fahrzeugs übersteigt.
Jeder visits
-Eintrag enthält die Änderung der Fahrzeuglast, die durch die Ausführung der Visit
verursacht wurde. Positive Lastwerte stellen das Laden der Sendung während
negative Werte stehen für das Entladen der Sendung.
Jeder transitions
-Eintrag enthält die Gesamtladung des Fahrzeugs während
Transition
. transitions[2]
hat beispielsweise eine weightKg
-Auslastung von 60, was der kombinierten Auslastung von shipment[0]
und shipment[1]
entspricht.
Zu den Messwertobjekten routes[0].metrics
und metrics.aggregatedRouteMetrics
gehören
eine maxLoads
-Property. Der Wert für den Typ weightKg
ist 80 und steht für
Teil der Route des Fahrzeugs, über den shipments[2]
an seine
Lieferort.
Einschränkungen für weiche Ladelimits
Wie bei den Zeitfenstern, die im Abschnitt Einschränkungen für Zeitfenster für Abhol- und Liefertermine beschrieben sind, gibt es auch für Ladelimits harte und weiche Varianten. Die
Das Attribut maxLoad
der LoadLimit
-Nachricht drückt eine harte Einschränkung aus: die
Das Fahrzeug darf keine Last tragen, die den Wert für maxLoad
im angegebenen Wert überschreitet.
Typ. Die Eigenschaften softMaxLoad
und costPerUnitAboveSoftMax
drücken eine weiche Einschränkung aus. Für jede Einheit, die softMaxLoad
überschreitet, fallen Kosten in Höhe von costPerUnitAboveSoftMax
an.
Weiche Grenzwerte für die Auslastung haben mehrere Verwendungsmöglichkeiten, z. B.:
- Verteilen von Lieferungen über mehr Fahrzeuge als erforderlich wann es kostengünstig ist
- die Fahrer ihre Präferenz für die Anzahl der Artikel angeben können, die sie auf einer bestimmten Route bequem abholen und zustellen können
- Fahrzeuge unter ihrer maximalen physischen Kapazität beladen, um Verschleiß zu begrenzen und Wartungskosten zu senken
Beschränkungen für das harte und das weiche Laden können zusammen verwendet werden. Ein strenges Ladelimit kann beispielsweise das maximale Gewicht der Ladung sein, die ein Fahrzeug sicher tragen kann, oder die maximale Anzahl von Artikeln, die gleichzeitig in ein Fahrzeug passen. Ein weiches Ladelimit kann das maximale Gewicht oder die maximale Anzahl von Artikeln sein, die es dem Fahrer erschweren, alles in das Fahrzeug zu bringen.