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:

  • Privilégier les itinéraires Vehicle plus rapides sur des itinéraires plus courts ou l'inverse
  • Déterminer si le coût de diffusion d'un Shipment vaut la valeur de l'achèvement de l'Shipment
  • Effectuer les retraits et les livraisons dans les créneaux horaires uniquement si cela est rentable

Voir un exemple de requête avec des 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 transport, 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 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. 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 peut-être pas les itinéraires les plus courts. Dans cet exemple, l'itinéraire le plus rapide est le plus court. Par conséquent, les modifications apportées aux paramètres de coût ont 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 représente le coût encouru par l'omission de la livraison.
  • Shipment.VisitRequest.cost représente le coût d'un retrait ou d'une livraison spécifique. Il est principalement utilisé pour permettre des compromis 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 encouru pour un Shipment complet dépasse le coût de sa pénalité. Shipment n'est inclus sur aucune route d'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. Ce coût est facturé en fonction du temps total nécessaire pour que tous les véhicules terminent leurs ShipmentRoute. Augmenter globalDurationCostPerHour donne la priorité à la finalisation plus rapide de toutes les expéditions.

Propriétés de coût de la réponse d'optimisation des routes

Le message OptimizeToursResponse (REST, gRPC) comporte des propriétés de coût qui représentent les coûts engendrés par 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 encourues pour toutes les routes dans la réponse. Chaque entrée routes possède des propriétés routeCosts et routeTotalCosts qui représentent les coûts de cet itinéraire spécifique.

Afficher une réponse à l'exemple de requête avec des 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 le coût engendré pour les livraisons ignorées. La propriété skippedShipments répertorie les envois ignorés.

Dans cet exemple, seul model.shipments[1] est ignoré dans l'exemple de requête. model.shipments[1] a 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. Avec un penaltyCost de livraison peu élevé par rapport aux Vehicle 40,0 costPerHour et 10,0 costPerKilometer, il est plus rentable de l'ignorer que de le finaliser.

Sujet avancé: coûts et contraintes souples

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

Par exemple, les contraintes LoadLimit du véhicule (REST, gRPC) ont des propriétés softMaxLoad et costPerUnitAboveSoftMax. Ensemble, ces deux mécanismes entraînent 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 pertinent 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, et les cost_per_hour_before_soft_start_time et cost_per_hour_after_soft_end_time correspondants sont générés en fonction de l'avance ou du retard de l'événement de contrainte par rapport à TimeWindow.

Comme pour tous les paramètres de modèle de coût, les coûts associés à une contrainte souple 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 chargement. Les contraintes TimeWindow sont traitées en détail dans la section Contraintes liées aux périodes de retrait et de livraison.