Paramètres du modèle de coûts

Développeurs de l'Espace économique européen (EEE)

Le message OptimizeToursRequest (REST, gRPC) contient un certain nombre de propriétés liées aux coûts. Ensemble, ces paramètres de coût représentent le modèle de coût de la requête. Le modèle de coût capture de nombreux objectifs d'optimisation de haut niveau de la requête, tels que :

  • Prioriser les itinéraires Vehicle plus rapides par rapport aux itinéraires plus courts, ou inversement
  • Déterminer si le coût de la diffusion d'un Shipment est justifié par la valeur de la finalisation du Shipment
  • Effectuer des collectes et des livraisons dans des créneaux horaires uniquement lorsque cela est rentable

Exemple de requête avec les coûts

{
  "model": {
    "globalStartTime": "2023-01-13T16:00:00-08:00",
    "globalEndTime": "2023-01-14T16:00:00-08:00",
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 100.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 5.0
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "pickups": [
          {
            "arrivalLocation": {
              "latitude": 37.794465,
              "longitude": -122.394839
            },
            "duration": "150s"
          }
        ],
        "penaltyCost": 50.0
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0
      }
    ]
  }
}
    

Propriétés de coût Vehicle

Le message Vehicle (REST, gRPC) comporte plusieurs propriétés de coût :

  • Vehicle.cost_per_hour : représente le coût d'exploitation d'un véhicule par heure, y compris les temps de trajet, d'attente, de visite et de pause.
  • Vehicle.cost_per_kilometer : représente le coût par kilomètre parcouru par le véhicule.
  • Vehicle.cost_per_traveled_hour : représente le coût d'exploitation d'un véhicule uniquement en transit, à l'exclusion des temps d'attente, de visite et de pause.

Ces paramètres de coût permettent à l'optimiseur de faire des compromis entre le temps et la distance parcourue. Les coûts engendrés par l'itinéraire optimisé apparaissent dans le message de réponse sous la forme metrics.costs :

À mesure que costPerHour augmente, l'optimiseur tente de trouver des itinéraires plus rapides qui ne sont pas forcément les plus courts. Dans cet exemple, l'itinéraire le plus rapide est également le plus court. Les modifications apportées aux paramètres de coût ont donc peu d'effet.

Propriétés de coût Shipment

Le message Shipment (REST, gRPC) comporte également plusieurs paramètres de coût :

  • Shipment.penalty_cost représente le coût encouru en cas d'annulation de l'expédition. Si vous ne définissez pas le paramètre penalty_cost d'un envoi, celui-ci devient obligatoire. Cela signifie qu'il ne sera ignoré que s'il ne peut pas être effectué en raison des contraintes spécifiées.
  • Shipment.VisitRequest.cost représente le coût d'un enlèvement ou d'une livraison spécifiques. Il est principalement utilisé pour permettre des compromis de coûts entre plusieurs options d'enlèvement ou de livraison pour un même envoi.

Les paramètres de coût Shipment utilisent les mêmes unités sans dimension que les paramètres de coût Vehicle. Si le coût encouru pour effectuer un Shipment dépasse son coût de pénalité, le Shipment n'est inclus dans l'itinéraire d'aucun Vehicle et apparaît plutôt dans la liste skipped_shipments du message de réponse.

Propriétés de coût ShipmentModel

Le message ShipmentModel (REST, gRPC) inclut une seule propriété de coût, globalDurationCostPerHour. Ce coût est calculé en fonction du temps total nécessaire à tous les véhicules pour effectuer leurs ShipmentRoute. L'augmentation de globalDurationCostPerHour permet de terminer toutes les expéditions plus tôt.

Propriétés de coût de la réponse Route Optimization

Le message OptimizeToursResponse (REST, gRPC) comporte des propriétés de coût qui représentent les coûts encourus lors de l'exécution des ShipmentRoute. Les propriétés metrics.costs et metrics.totalCost représentent le nombre d'unités de coût encourues sur tous les itinéraires de la réponse. Chaque entrée routes comporte des propriétés routeCosts et routeTotalCosts qui représentent les coûts de cet itinéraire spécifique.

Voir une réponse à la requête exemple avec les coûts

{
  "routes": [
    {
      "vehicleStartTime": "2023-01-14T00:00:00Z",
      "vehicleEndTime": "2023-01-14T00:28:22Z",
      "visits": [
        {
          "isPickup": true,
          "startTime": "2023-01-14T00:00:00Z",
          "detour": "0s"
        },
        {
          "shipmentIndex": 2,
          "isPickup": true,
          "startTime": "2023-01-14T00:02:30Z",
          "detour": "150s"
        },
        {
          "startTime": "2023-01-14T00:08:55Z",
          "detour": "150s"
        },
        {
          "shipmentIndex": 2,
          "startTime": "2023-01-14T00:21:21Z",
          "detour": "572s"
        }
      ],
      "transitions": [
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:00:00Z"
        },
        {
          "travelDuration": "0s",
          "waitDuration": "0s",
          "totalDuration": "0s",
          "startTime": "2023-01-14T00:02:30Z"
        },
        {
          "travelDuration": "235s",
          "travelDistanceMeters": 795,
          "waitDuration": "0s",
          "totalDuration": "235s",
          "startTime": "2023-01-14T00:05:00Z"
        },
        {
          "travelDuration": "496s",
          "travelDistanceMeters": 1893,
          "waitDuration": "0s",
          "totalDuration": "496s",
          "startTime": "2023-01-14T00:13:05Z"
        },
        {
          "travelDuration": "171s",
          "travelDistanceMeters": 665,
          "waitDuration": "0s",
          "totalDuration": "171s",
          "startTime": "2023-01-14T00:25:31Z"
        }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "902s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "800s",
        "totalDuration": "1702s",
        "travelDistanceMeters": 3353
      },
      "routeCosts": {
        "model.vehicles.cost_per_kilometer": 33.53,
        "model.vehicles.cost_per_hour": 18.911111111111111
      },
      "routeTotalCost": 52.441111111111113
    }
  ],
  "skippedShipments": [
    {
      "index": 1
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "902s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "800s",
      "totalDuration": "1702s",
      "travelDistanceMeters": 3353
    },
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
    "latestVehicleEndTime": "2023-01-14T00:28:22Z",
    "totalCost": 57.441111111111113,
    "costs": {
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.shipments.penalty_cost": 5
    }
  }
}
    

Dans l'exemple de réponse, les metrics.costs de premier niveau sont les suivants :

{
  "metrics": {
    ...
    "costs": {
      "model.vehicles.cost_per_hour": 18.911111111111111,
      "model.vehicles.cost_per_kilometer": 33.53,
      "model.shipments.penalty_cost": 5
    }
  }
}

La valeur model.shipments.penalty_cost représente les coûts engendrés par les livraisons ignorées. La propriété skippedShipments liste les expéditions qui ont été ignorées.

Dans cet exemple, seul model.shipments[1] dans l'exemple de requête est ignoré. model.shipments[1] a un coût de pénalité de cinq unités, ce qui correspond à la clé model.shipments.penalty_cost totale dans l'exemple de réponse. Le penaltyCost de l'envoi est faible par rapport aux costPerHour et costPerKilometer de 40,0 et 10,0 du Vehicle, ce qui rend plus rentable d'ignorer l'envoi que de le finaliser.

Thème avancé : coûts et contraintes souples

Plusieurs propriétés de message OptimizeToursRequest (REST, gRPC) représentent des contraintes souples, c'est-à-dire des contraintes qui entraînent un coût lorsqu'elles ne peuvent pas être respectées.

Par exemple, les contraintes de véhicule LoadLimit (REST, gRPC) ont les propriétés softMaxLoad et costPerUnitAboveSoftMax. Ensemble, ils entraînent un coût proportionnel aux unités de charge qui dépassent softMaxLoad, ce qui permet de dépasser la limite uniquement si cela a un sens d'un point de vue financier.

De même, les contraintes TimeWindow (REST, gRPC) ont des propriétés soft_start_time et soft_end_time, avec des cost_per_hour_before_soft_start_time et cost_per_hour_after_soft_end_time correspondants qui sont encourus en fonction de la précocité ou du retard de l'événement contraint par rapport à TimeWindow.

Comme pour tous les paramètres du modèle de coûts, les coûts de contrainte souple sont exprimés dans les mêmes unités sans dimension que les autres paramètres de coûts.

Les contraintes LoadLimit sont abordées en détail dans Exigences et limites de charge. Les contraintes TimeWindow sont abordées en détail dans Contraintes de créneaux horaires de retrait et de livraison.