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à a percorsi Vehicle più veloci su percorsi più brevi o viceversa
  • Decidere se il costo per fornire un Shipment vale il valore del completamento di Shipment
  • Effettuare ritiri e consegne entro gli intervalli di tempo è un'operazione economica

Vedi 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 orario di sosta su un veicolo, 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 per guidare un veicolo solo durante il trasporto, esclusi i tempi di attesa, di visita e di pausa.

Questi parametri dei costi consentono all'ottimizzatore di trovare compromessi tra 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, la route più veloce è la più breve, quindi le modifiche ai parametri di costo hanno poco effetto.

Shipment proprietà di costo

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

  • Shipment.penalty_cost rappresenta il costo sostenuto saltando la spedizione.
  • Shipment.VisitRequest.cost rappresenta il costo di un ritiro o di una consegna specifico, utilizzato principalmente per consentire un compromesso tra i costi tra più opzioni di ritiro o consegna per una singola spedizione.

Shipment parametro di costo utilizzano le stesse unità senza dimensioni dei parametri di costo Vehicle. Il costo sostenuto per il completamento di una Shipment supera il costo della penalità, pertanto Shipment non viene incluso in nessuna route di Vehicle, ma viene visualizzato nell'elenco skipped_shipments del 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à la priorità al completamento anticipato di tutte le spedizioni.

Proprietà dei costi della risposta di ottimizzazione delle route

Il messaggio OptimizeToursResponse (REST, gRPC) contiene proprietà di costo che rappresentano i costi sostenuti per il processo di completamento di ShipmentRoute. Le proprietà metrics.costs e metrics.totalCost rappresentano il numero di unità di costo sostenute per tutte le route nella risposta. Ogni voce routes ha proprietà routeCosts e routeTotalCosts che rappresentano i costi per quella specifica route.

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 di spedizioni ignorate. La proprietà skippedShipments elenca le spedizioni ignorate.

In questo esempio, solo model.shipments[1] viene ignorato nella richiesta di esempio. model.shipments[1] ha un costo di penalizzazione di 5 unità, che corrisponde alla chiave model.shipments.penalty_cost totale nella risposta di esempio. Il basso valore di penaltyCost della spedizione rispetto ai 40,0 costPerHour e 10,0costPerKilometer di Vehicle rende più conveniente saltare la spedizione piuttosto 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 per il veicolo LoadLimit (REST, gRPC) hanno proprietà softMaxLoad e costPerUnitAboveSoftMax. Insieme, questi comportano 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 cost_per_hour_before_soft_start_time e cost_per_hour_after_soft_end_time che vengono sostenute in base a quanto presto o tardi si verifica l'evento vincolato in relazione a TimeWindow.

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

I vincoli relativi a LoadLimit vengono affrontati in dettaglio in Demands and Limits di carico. I vincoli relativi a TimeWindow vengono affrontati nel dettaglio nei vincoli per le tempistiche di ritiro e consegna.