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 physische Eigenschaften, die beim eine Route planen.
- Fahrzeuge: Die Eigenschaft
loadLimits
gibt die maximale Last an, die das Fahrzeug die das Fahrzeug bewältigen kann. Die NachrichtVehicle
ansehen (REST, gRPC) Dokumentation. - Lieferungen: Die Eigenschaft
loadDemands
gibt an, wie viel Ladung eine bestimmte und der Versand verbraucht. Die NachrichtShipment
ansehen (REST, gRPC) Dokumentation.
Mit diesen beiden Einschränkungen kann das Optimierungstool Sendungen so zuordnen, dass sie den Fahrzeugen möglichst genau entsprechen Ihre Flottenkapazität und Versandanforderungen.
Im weiteren Verlauf dieses Dokuments werden loadLimits
und loadDemands
ausführlich behandelt.
Lastanforderungen und -limits: Typen
Sie geben jede Lastnachfrage und Limitbeschränkung in Form eines Typs aus.
Sie können Ihre eigenen Ladetypen angeben, wie in den folgenden Beispielen gezeigt:
- Gewicht
- Volume
- lineare Messungen
- Namen der transportierten Gegenstände oder Geräte
In dieser Anleitung wird weightKg
als Beispieltyp verwendet.
Sowohl Shipment.loadDemands
als auch Vehicle.loadLimits
verwenden die Protokollzwischenspeicher.
map
-Typ mit string
-Schlüsseln, die die Ladetypen darstellen.
Shipment.loadDemands
-Werte verwenden die Load
-Nachricht (REST, gRPC).
Die Load
-Nachricht enthält eine einzelne amount
-Eigenschaft, die angibt, wie viel Kapazität
ist erforderlich, um die Lieferung in der angegebenen Art abzuschließen.
Vehicle.loadLimits
-Werte verwenden die LoadLimit
-Nachricht (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 verbraucht nur dann das loadLimits
des zugewiesenen Fahrzeugs, wenn
haben beide Schlüssel übereinstimmende Ladetypschlüssel. 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 implizit unbegrenzte weightKg
-Kapazität aufgrund des Fehlens eines
Belastungsgrenze von weightKg
, sodass das Fahrzeug nicht durch die
Gewichtsnachfrage.
Ladungstransfer zwischen Lieferungen und Fahrzeugen
Wenn Sendungen von Fahrzeugen abgeholt und zugestellt werden,
loadDemand
wird zwischen Lieferung und Fahrzeug übertragen. Sie können die
Ladestatus des Fahrzeugs in der OptimizeToursResponse
-Nachricht (REST,
gRPC)routes.transitions
-Eintrag für ein bestimmtes Fahrzeug. Die Reihenfolge ist
folgt:
- Die erforderliche Ladekapazität wird für die Sendung 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 und der Wert für „
vehicleLoads
“ des Fahrzeugs ist geringer um denloadDemand
der zugestellten 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.
Ein 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 einen Ladebedarf 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]
wurde zugestelltshipment[2]
wurde abgeholtshipment[2]
wurde zugestellt
Diese Bestellung verdeutlicht, dass drei Sendungen vom Fahrzeug in dieser
gleichzeitig, da ihr Gesamtwert die loadDemands
des Fahrzeugs übersteigt
loadLimits
.
Jeder visits
-Eintrag enthält die Änderung der Fahrzeugauslastung, die sich aus dem
Abschluss von Visit
. 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 z. B. eine weightKg
-Last von 60,
die kombinierte Lasten von shipment[0]
und shipment[1]
darstellen.
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.
Beschränkungen für das Limit beim weichen Laden
Wie bei den Zeitfenstern, die unter Zeitfenster für Abholung und Lieferung beschrieben sind,
Einschränkungen und Lastlimits haben 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 Properties softMaxLoad
und costPerUnitAboveSoftMax
drücken einen weichen Wert aus
für jede Einheit von softMaxLoad
ein
Kosten in Höhe von costPerUnitAboveSoftMax
.
Einschränkungen für das Limit beim weichen Laden werden auf vielfältige Weise genutzt, z. B.:
- Verteilen von Lieferungen über mehr Fahrzeuge als erforderlich wann es kostengünstig ist
- Sie drückt so aus, als würden die Fahrerinnen und Fahrer die Anzahl von Gegenständen ausdrücken, die sie bequem kaufen können. auf einer bestimmten Route abholen und liefern lassen
- das Laden von Fahrzeugen unterhalb ihrer maximalen Kapazität, um Verschleiß und geringere Wartungskosten
Beschränkungen für das harte und das weiche Laden können zusammen verwendet werden. Zum Beispiel könnte eine Die Lastengrenze kann das maximale Frachtgewicht angeben, das ein Fahrzeug sicher transportieren kann. oder die maximale Anzahl von Gegenständen, die gleichzeitig in ein Fahrzeug passen, während ein Grenzwert für weiche Last kann das Höchstgewicht oder die Anzahl der Artikel sein, die versteuert werden dass der Fahrer alles unterbringen kann.