Parâmetros do modelo de custo

A mensagem OptimizeToursRequest (REST, gRPC) contém várias propriedades relacionadas a custos. Juntos, esses parâmetros de custo representam o modelo de custo da solicitação. O modelo de custo captura muitos dos objetivos de otimização de alto nível da solicitação, como:

  • Priorizar rotas Vehicle mais rápidas em vez de rotas mais curtas ou vice-versa
  • Decidir se o custo de entrega de um Shipment vale o valor da conclusão do Shipment
  • Realizar retiradas e entregas dentro de janelas de tempo somente quando isso é econômico

Confira um exemplo de solicitação com custos

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

Propriedades de custo Vehicle

A mensagem Vehicle (REST, gRPC) tem várias propriedades de custo:

  • Vehicle.cost_per_hour: representa o custo de operação de um veículo por hora, incluindo o tempo de transporte, espera, visita e pausa.
  • Vehicle.cost_per_kilometer: representa o custo por quilômetro percorrido pelo veículo.
  • Vehicle.cost_per_traveled_hour: representa o custo de operar um veículo somente enquanto está em trânsito, excluindo os períodos de espera, visita e intervalo.

Esses parâmetros de custo permitem que o otimizador faça compensações entre tempo e distância percorrida. Os custos incorridos pela rota otimizada aparecem na mensagem de resposta como metrics.costs:

À medida que costPerHour aumenta, o otimizador tenta encontrar rotas mais rápidas que podem não ser as mais curtas. Nesse exemplo, a rota mais rápida é a mais curta, então as mudanças nos parâmetros de custo têm pouco efeito.

Propriedades de custo Shipment

A mensagem Shipment (REST, gRPC) também tem vários parâmetros de custo:

  • Shipment.penalty_cost representa o custo incorrido ao pular o envio.
  • Shipment.VisitRequest.cost representa o custo de uma retirada ou entrega específica, usado principalmente para permitir trocas de custo entre várias opções de retirada ou entrega para um único envio.

Os parâmetros de custo Shipment usam as mesmas unidades sem dimensões que os parâmetros de custo Vehicle. O custo incorrido quando um Shipment exceder o custo de penalidade, o Shipment não será incluído na rota de nenhum Vehicle e, em vez disso, aparecerá na lista de skipped_shipments na mensagem de resposta.

Propriedades de custo ShipmentModel

A mensagem ShipmentModel (REST, gRPC) inclui uma única propriedade de custo, globalDurationCostPerHour. Esse custo é incorrido com base no tempo total necessário para que todos os veículos concluam as ShipmentRoutes. Aumentar globalDurationCostPerHour prioriza a conclusão antecipada de todos os envios.

Propriedades de custo da resposta da Otimização de rotas

A mensagem OptimizeToursResponse (REST, gRPC) tem propriedades de custo que representam os custos incorridos no processo de conclusão de ShipmentRoutes. As propriedades metrics.costs e metrics.totalCost representam o número de unidades de custo incorridas em todas as rotas na resposta. Cada entrada routes tem as propriedades routeCosts e routeTotalCosts, que representam os custos para esse trajeto específico.

Veja a resposta ao exemplo de solicitação com os custos

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

Na resposta de exemplo, as metrics.costs de nível superior são:

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

O valor model.shipments.penalty_cost representa o custo incorrido devido a envios ignorados. A propriedade skippedShipments lista quais remessas foram ignoradas.

Neste exemplo, apenas model.shipments[1] na solicitação de exemplo é ignorada. model.shipments[1] tem um custo de penalidade de 5 unidades, que corresponde à chave model.shipments.penalty_cost total na resposta de exemplo. O baixo penaltyCost do envio em comparação com o costPerHour de 40,0 e o costPerKilometer de 10,0 costPerKilometer tornam mais econômico pular o envio do que concluí-lo.Vehicle

Tópico avançado: custos e restrições flexíveis

Várias propriedades de mensagens OptimizeToursRequest (REST e gRPC) representam restrições flexíveis, que geram custos quando não podem ser atendidas.

Por exemplo, as restrições de LoadLimit do veículo (REST, gRPC) têm as propriedades softMaxLoad e costPerUnitAboveSoftMax. Juntos, eles geram um custo proporcional às unidades de carga que excedem softMaxLoad, permitindo que o limite seja excedido apenas se isso fizer sentido do ponto de vista de custo.

Da mesma forma, as restrições TimeWindow (REST, gRPC) têm propriedades soft_start_time e soft_end_time, com cost_per_hour_before_soft_start_time e cost_per_hour_after_soft_end_time correspondentes, incorridas com base na antecedência ou no atraso do evento restrito em relação ao TimeWindow.

Como acontece com todos os parâmetros do modelo de custo, os custos de restrição flexível são expressos nas mesmas unidades sem dimensões que os outros parâmetros de custo.

As restrições LoadLimit são abordadas em detalhes em Limites e demandas de carga. As restrições de TimeWindow são abordadas em detalhes em Restrições da janela de tempo de retirada e entrega.