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
  • Eseguire ritiri e consegne entro le finestre temporali solo quando ciò è 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à senza dimensioni di Vehicle parametri di costo. 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à di costo

Il messaggio ShipmentModel (REST, gRPC) include una singola proprietà di costo, globalDurationCostPerHour. Questo costo viene addebitato in base al tempo totale necessario a tutti i veicoli per completare i ShipmentRoute. 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 tutte le route nella risposta. Ogni voce routes ha routeCosts e routeTotalCosts proprietà che rappresentano i costi per quella rotta specifica.

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, queste hanno un costo proporzionale alle unità di carico che superano softMaxLoad, consentendo di superare il limite solo se ciò ha senso dal punto di vista dei costi.

Allo stesso modo, i vincoli TimeWindow (REST, gRPC) hanno proprietà soft_start_time e soft_end_time, con le corrispondenti proprietà cost_per_hour_before_soft_start_time e cost_per_hour_after_soft_end_time sostenute in base all'anticipo o al ritardo dell'evento vincolato, rispetto a TimeWindow.

Come per tutti i parametri del modello di costo, i costi dei vincoli flessibili vengono 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.