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.

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 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 calculé en fonction du temps total nécessaire à tous les véhicules pour effectuer 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 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 engagées pour 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 à 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 indique 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 cinq unités, qui correspond à la clé model.shipments.penalty_cost totale dans l'exemple de réponse. Le faible penaltyCost de l'envoi par rapport aux costPerHour de 40,0 et costPerKilometer de 10,0 de Vehicle rend l'envoi plus économique à ignorer qu'à effectuer.

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) comportent 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, avec des cost_per_hour_before_soft_start_time et cost_per_hour_after_soft_end_time correspondants qui sont appliqués en fonction de la date et de l'heure de l'événement contraint par rapport à TimeWindow.

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

Les contraintes LoadLimit sont abordées en détail dans la section Demandes et limites de charge. Les contraintes TimeWindow sont détaillées dans la section Contraintes de période de ramassage et de livraison.