Parametri del modello di costo

Il messaggio OptimizeToursRequest (REST, gRPC) contiene una serie di proprietà relative ai costi. Insieme, questi parametri di costo rappresentano il modello di costo della richiesta. Il modello di costo acquisisce molti degli scopi di ottimizzazione di alto livello della richiesta, ad esempio:

  • Dare la priorità ai percorsi Vehicle più veloci rispetto a quelli più brevi o viceversa
  • Decidere se il costo per pubblicare un Shipment vale il valore del completamento del Shipment
  • Effettuare i ritiri e le consegne entro finestre temporali solo se ciò è economicamente conveniente

Visualizza un esempio di richiesta con i costi

{
  "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 proprietà costo

Il messaggio Vehicle (REST, gRPC) ha diverse proprietà di costo:

  • Vehicle.cost_per_hour: rappresenta il costo di gestione di un veicolo all'ora, inclusi i tempi di transito, attesa, visita e pausa.
  • Vehicle.cost_per_kilometer: rappresenta il costo per chilometro percorso dal veicolo.
  • Vehicle.cost_per_traveled_hour: rappresenta il costo di gestione di un veicolo solo durante il transito, esclusi i tempi di attesa, visita e pausa.

Questi parametri di costo consentono all'ottimizzatore di fare compromessi tra tempo e distanza percorsa. I costi sostenuti dal percorso ottimizzato vengono visualizzati nel messaggio di risposta come metrics.costs:

Man mano che costPerHour aumenta, l'ottimizzatore tenta di trovare percorsi più veloci che potrebbero non essere i percorsi più brevi. In questo esempio il percorso più veloce è anche il più breve, pertanto le modifiche ai parametri di costo hanno scarso effetto.

Shipment proprietà costo

Il messaggio Shipment (REST, gRPC) ha anche diversi parametri di costo:

  • Shipment.penalty_cost indica il costo sostenuto per saltare la spedizione.
  • Shipment.VisitRequest.cost indica il costo di un ritiro o di una consegna specifici, utilizzato principalmente per consentire il confronto dei costi tra più opzioni di ritiro o consegna per una singola spedizione.

I parametri di costo Shipment utilizzano le stesse unità adimensionali dei parametri di costo Vehicle. Se il costo sostenuto per completare un Shipment supera il costo della penale, il Shipment non è incluso nel percorso di nessun Vehicle, ma viene visualizzato nell'elenco skipped_shipments nel messaggio di risposta.

ShipmentModel proprietà costo

Il messaggio ShipmentModel (REST, gRPC) include una singola proprietà cost, globalDurationCostPerHour. Questo costo viene addebitato in base al tempo totale necessario per completare le ShipmentRoute di tutti i veicoli. Se aumenti globalDurationCostPerHour, dai la priorità al completamento anticipato di tutte le spedizioni.

Proprietà dei costi della risposta di Route Optimization

Il messaggio OptimizeToursResponse (REST, gRPC) ha proprietà di costo che rappresentano i costi sostenuti durante la procedura di completamento dei ShipmentRoute. Le proprietà metrics.costs e metrics.totalCost rappresentano il numero di unità di costo sostenute in tutti i percorsi della risposta. Ogni voce routes ha proprietà routeCosts e routeTotalCosts che rappresentano i costi per quel percorso specifico.

Visualizza una risposta alla richiesta di esempio con i costi

{
  "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
    }
  }
}
    

Nella risposta di esempio, i metrics.costs di primo livello sono:

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

Il valore model.shipments.penalty_cost rappresenta il costo sostenuto a causa delle spedizioni saltate. La proprietà skippedShipments elenca le importazioni saltate.

In questo esempio, viene ignorato solo model.shipments[1] nella richiesta di esempio. model.shipments[1] ha un costo di penalità di 5 unità, che corrisponde alla chiave totalemodel.shipments.penalty_cost nella risposta di esempio. Il basso valore della spedizione penaltyCost rispetto ai 40,0 costPerHour e 10,0 costPerKilometer di Vehicle rende più conveniente saltare la spedizione che completarla.

Argomento avanzato: costi e vincoli flessibili

Diverse proprietà dei messaggi OptimizeToursRequest (REST, gRPC) rappresentano vincoli flessibili, ovvero vincoli che comportano un costo quando non possono essere soddisfatti.

Ad esempio, i vincoli dei veicoli LoadLimit (REST, gRPC) hanno proprietà softMaxLoad e costPerUnitAboveSoftMax. Insieme, comportano un costo proporzionale alle unità di carico che superano softMaxLoad, consentendo di superare il limite solo se ciò è giustificato dal punto di vista dei costi.

Analogamente, i vincoli TimeWindow (REST, gRPC) hanno proprietà soft_start_time e soft_end_time, con valori cost_per_hour_before_soft_start_time e cost_per_hour_after_soft_end_time corrispondenti che vengono applicati in base a quanto in anticipo o in ritardo si verifica l'evento vincolato rispetto a TimeWindow.

Come per tutti i parametri del modello di costo, i costi dei vincoli flessibili sono espressi nelle stesse unità senza dimensioni degli altri parametri di costo.

I vincoli LoadLimit sono trattati in dettaglio in Carichi e limiti. I vincoli TimeWindow sono trattati in dettaglio in Vincoli relativi alla finestra temporale di ritiro e consegna.