Paramètres du modèle de coût

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 généraux de la requête, tels que:

  • Donner la priorité aux itinéraires Vehicle plus rapides sur les itinéraires plus courts ou l'inverse
  • Déterminer si le coût de diffusion d'une Shipment vaut la valeur de la finalisation de l'Shipment
  • Effectuer les retraits et les livraisons dans les intervalles de temps uniquement si cela est rentable

Voir un exemple de requête avec 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
      }
    ]
  }
}
    

Vehicle propriétés de coût

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

  • Vehicle.cost_per_hour: représente le coût d'utilisation d'un véhicule par heure, y compris les temps de transit, 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'utilisation d'un véhicule uniquement pendant son acheminement, à l'exclusion des temps d'attente, des visites et des pauses.

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

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

Shipment propriétés de coût

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

  • Shipment.penalty_cost correspond aux coûts engendrés si vous ignorez la livraison.
  • Shipment.VisitRequest.cost représente le coût d'un retrait ou d'une livraison spécifique, utilisé principalement pour permettre des compromis en termes de coûts entre plusieurs options de retrait ou de livraison pour une même livraison.

Les paramètres de coût Shipment utilisent les mêmes unités sans dimension que les paramètres de coût Vehicle. Le coût engendré par l'exécution d'une Shipment dépasse son coût de pénalité. Le Shipment n'est pas inclus sur l'itinéraire de Vehicle et apparaît à la place dans la liste skipped_shipments du message de réponse.

ShipmentModel propriétés de coût

Le message ShipmentModel (REST, gRPC) inclut une seule propriété de coût, globalDurationCostPerHour. Le coût est basé sur le temps total nécessaire à tous les véhicules pour effectuer leur ShipmentRoute. Augmenter la valeur globalDurationCostPerHour permet d'accélérer le traitement de toutes les expéditions.

Propriétés des coûts de réponse pour l'optimisation des routes

Le message OptimizeToursResponse (REST, gRPC) comporte des propriétés de coût qui représentent les coûts engendrés dans le processus d'exécution des ShipmentRoute. Les propriétés metrics.costs et metrics.totalCost représentent le nombre d'unités de coût engagées pour toutes les routes dans la réponse. Chaque entrée routes possède les propriétés routeCosts et routeTotalCosts qui représentent les coûts pour cet itinéraire spécifique.

Afficher une réponse à l'exemple de requête 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 niveau supérieur sont les suivantes:

{
  "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 le coût facturé en raison des envois ignorés. La propriété skippedShipments indique les envois ignorés.

Dans cet exemple, seul model.shipments[1] est ignoré dans l'exemple de requête. model.shipments[1] entraîne un coût de pénalité de 5 unités, ce qui correspond au total de la clé model.shipments.penalty_cost dans l'exemple de réponse. Le faible penaltyCost de la livraison par rapport aux valeurs 40,0 costPerHour et 10,0 costPerKilometer du Vehicle rend plus rentable de sauter l'expédition que de la terminer.

Sujet avancé: coûts et contraintes non applicables

Plusieurs propriétés de message OptimizeToursRequest (REST, gRPC) représentent des contraintes souples. Il s'agit de contraintes qui entraînent des coûts lorsqu'elles ne peuvent pas être satisfaites.

Par exemple, les contraintes LoadLimit du véhicule (REST, gRPC) ont les propriétés softMaxLoad et costPerUnitAboveSoftMax. L'utilisation conjointe de ces services entraîne un coût proportionnel aux unités de charge qui dépassent softMaxLoad, ce qui ne permet de dépasser la limite que si cela est judicieux du point de vue des coûts.

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

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

Les contraintes LoadLimit sont traitées en détail dans la section Demandes et limites de charge. Les contraintes TimeWindow sont abordées en détail dans la section Contraintes liées aux délais de retrait et de livraison.