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 obiettivi di ottimizzazione di alto livello della richiesta, tra cui:

  • Dare la priorità ai percorsi Vehicle più veloci su percorsi più brevi o viceversa
  • Decidere se il costo di pubblicazione di un Shipment vale il valore del completamento di 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à di costo

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

  • Vehicle.cost_per_hour: rappresenta il costo di utilizzo di un veicolo all'ora, inclusi i tempi di transito, di attesa, di visita e di 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 trasporto, esclusi i tempi di attesa, di visita e di pausa.

Questi parametri di costo consentono all'ottimizzatore di effettuare compromessi in termini di tempo e distanza percorsa. I costi sostenuti dalla route ottimizzata vengono visualizzati nel messaggio di risposta come metrics.costs:

Con l'aumento di costPerHour, l'ottimizzatore tenta di trovare route più veloci che potrebbero non essere quelle più brevi. In questo esempio il percorso più veloce è quello più breve, quindi le modifiche ai parametri di costo hanno scarso impatto.

Shipment proprietà di costo

Anche il messaggio Shipment (REST, gRPC) ha diversi parametri di costo:

  • Shipment.penalty_cost rappresenta il costo sostenuto per saltare la spedizione.
  • Il Shipment.VisitRequest.cost rappresenta il costo di un ritiro o una consegna specifici, utilizzato principalmente per consentire compromessi sui 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. Il costo sostenuto per completare una Shipment supera il costo della penalità, Shipment non è incluso nel percorso di Vehicle e viene invece 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. L'aumento di globalDurationCostPerHour dà priorità al completamento anticipato di tutte le spedizioni.

Proprietà dei costi della risposta di ottimizzazione del percorso

Il messaggio OptimizeToursResponse (REST, gRPC) ha proprietà di costo che rappresentano i costi sostenuti nel processo 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 proprietà routeCosts e routeTotalCosts 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 ignorate. La proprietà skippedShipments elenca le spedizioni ignorate.

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

Argomento avanzato: costi e vincoli flessibili

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

Ad esempio, i vincoli LoadLimit del veicolo (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 vengono affrontati in dettaglio in Richieste e limiti di caricamento. I vincoli TimeWindow vengono gestiti in dettaglio nella sezione Vincoli per il ritiro e la finestra dei tempi di consegna.