Ladeanforderungen und -limits

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 Nachricht Vehicle ansehen (REST, gRPC) Dokumentation.
  • Lieferungen: Die Eigenschaft loadDemands gibt an, wie viel Ladung eine bestimmte und der Versand verbraucht. Die Nachricht Shipment 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 Bezug auf einen Typ aus.

Sie können Ihre eigenen Ladetypen angeben, wie in den folgenden Beispielen gezeigt:

  • Gewicht
  • Volume
  • lineare Messungen
  • Namen der transportierten Gegenstände oder Ausrüstung

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 die 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 Ladungsgrenze 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 so folgt:

  1. Die erforderliche Ladekapazität wird für die Sendung als loadDemand definiert.
  2. Die Sendung wird vom zugewiesenen Fahrzeug und der vehicleLoads erhöht sich um die loadDemand der Sendung. Dieses Übertragung wird in der Antwort durch positive visits.loadDemands dargestellt angezeigt.
  3. Das Fahrzeug liefert die Sendung und der Wert für „vehicleLoads“ des Fahrzeugs ist geringer um den loadDemand der zugestellten Sendung. Diese Übertragung ist in der Antwortnachricht durch negative visits.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 50 weightKg.
  • shipments[1]“ hat eine Lastanforderung von 10 weightKg.
  • shipments[2]“ hat einen Ladebedarf von 80 weightKg.
  • vehicles[0] hat ein Ladelimit von 100 weightKg.

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:

  1. shipment[0] wurde abgeholt
  2. shipment[1] wurde abgeholt
  3. shipment[0] wurde zugestellt
  4. shipment[1] wurde zugestellt
  5. shipment[2] wurde abgeholt
  6. shipment[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.