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ûts capture de nombreux objectifs d'optimisation de haut niveau de la requête, par exemple:

  • Priorisation des routes Vehicle plus rapides par rapport aux routes plus courtes ou inversement
  • Décider si le coût de diffusion d'un Shipment est justifié par la valeur de l'achèvement de l'Shipment
  • Effectuer des collectes et des livraisons dans des délais uniquement lorsque 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
      }
    ]
  }
}
    

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'utilisation 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'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 parcourue. Les coûts encourus 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 nécessairement les plus courts. Dans cet exemple, le trajet le plus rapide se trouve être 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 en sautant l'envoi.
  • Shipment.VisitRequest.cost représente le coût d'un retrait ou d'une livraison spécifique, utilisé principalement pour permettre des arbitrages de coûts entre plusieurs options de retrait ou de livraison pour un seul 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 total d'un Shipment dépasse son coût de pénalité, Shipment n'est pas inclus dans le parcours d'un Vehicle et apparaî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 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 des coûts de réponse Route Optimization

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 engagées pour tous les itinéraires de 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.

Voir 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 les coûts encourus en raison des envois ignorés. La propriété skippedShipments répertorie les livraisons ignorées.

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 cinq unités, qui correspond à la clé model.shipments.penalty_cost totale 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 un coût lorsqu'elles ne peuvent pas être satisfaites.

Par exemple, les contraintes de véhicule LoadLimit (REST, gRPC) ont des propriétés softMaxLoad et costPerUnitAboveSoftMax. Ensemble, ces éléments 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 justifié d'un point de vue coûteux.

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 abordées en détail dans la section Contraintes de période de ramassage et de livraison.