Carregar custos

Os custos de carga são definidos na propriedade "loadLimits" de um "Vehicle" em "ShipmentModel".

Os custos de carga especificam os custos ou penalidades que um veículo incorre com base na carga que ele transporta entre as coletas e entregas de remessas. É possível configurar esses custos com base na distância percorrida com costPerKilometer, na duração da viagem com costPerTraveledHour ou usar os dois ao mesmo tempo.

Configure os custos de carga para oferecer suporte a objetivos como:

  • Considere os custos de combustível, que aumentam com o peso da carga.
  • Evite rotas de longa distância para veículos pesados.
  • Considere o desgaste do veículo devido a cargas pesadas.

Propriedades

Especifique os custos de carga na propriedade loadLimits de um Vehicle. Assim como todos os outros parâmetros de custo, os custos de carga usam unidades de custo relativas e sem dimensão.

É possível definir custos de carga usando as seguintes propriedades:

Propriedade Tipo Descrição
costPerKilometer Objeto Contém um tipo de objeto LoadCost para calcular os custos de viagem com base nos quilômetros percorridos.
costPerTraveledHour Objeto Contém um tipo de objeto LoadCost para calcular os custos de viagem com base nas horas percorridas, excluindo os tempos de espera, visita e descanso.

LoadCost

Um tipo de mensagem LoadCost define o custo de viagem para transportar uma carga específica. Ele permite definir um limite de carga e especificar taxas de custo diferentes por unidade de carga abaixo e acima desse limite.

O objeto LoadCost contém os seguintes parâmetros de configuração:

Parâmetro Tipo Descrição
loadThreshold string (formato int64) O nível de carga em que a taxa de cálculo de custo muda. O padrão é 0.
costPerUnitAboveThreshold Número O custo aplicado a cada unidade de carga acima do loadThreshold. O padrão é 0.
costPerUnitBelowThreshold Número O custo aplicado a cada unidade de carga abaixo ou igual ao loadThreshold. O padrão é 0.

Como corresponder custos de carga com remessas

Os custos de carga são aplicados quando a carga transportada por um veículo corresponde ao tipo loadDemands dos envios no trajeto. Os tipos de carga são strings arbitrárias, como peso ou volume. Para mais detalhes sobre como configurar tipos de carga, consulte Tipos de carga.

Exemplos

Esta seção aborda três tipos de exemplos:

Amostras de código

O exemplo a seguir mostra como estruturar um custo de carga com todos os parâmetros de configuração disponíveis. Este exemplo usa costPerKilometer, mas você pode substituir por costPerTraveledHour para calcular os custos com base na duração da viagem em vez da distância.

{
  "model": {
    "vehicles": [{
      "loadLimits": {
        "LOAD_TYPE": {
          "maxLoad": "MAX_LOAD",
          "costPerKilometer": {
            "loadThreshold": "LOAD_THRESHOLD",
            "costPerUnitAboveThreshold": COST_ABOVE,
            "costPerUnitBelowThreshold": COST_BELOW
          }
        }
      }
    }]
  }
}

Exemplo de cenário

Esta seção descreve um cenário em que você quer otimizar o consumo de combustível, que é proporcional à distância e ao peso da carga. Como os veículos consomem mais combustível ao transportar cargas mais pesadas, planeje rotas que entreguem pacotes mais pesados primeiro.

Para configurar esse comportamento, configure sua solicitação para penalizar veículos que viajam longas distâncias com carga pesada. Para este exemplo, use os seguintes valores de propriedade na sua solicitação:

Com filhos Propriedade Tipo Valor Cenário
loadLimits tipo de carga string weightKg Define o tipo de capacidade a ser rastreada. Este exemplo usa weightKg para representar o peso da carga em quilogramas.
loadLimits maxLoad string 100 O peso máximo de carga que o veículo pode transportar.
costPerKilometer loadThreshold string 15 Define o limite de carga de referência. Qualquer peso de carga acima de 15 kg incorre na penalidade de custo de combustível com base na carga.
costPerKilometer costPerUnitAboveThreshold número 1 Atua como seu coeficiente de custo de combustível. Para cada quilômetro percorrido, cada quilograma de carga acima do limite de 15 kg gera uma unidade de custo.
loadDemands amount string Envio 1: 50
Envio 2: 10
Envio 3: 80
Especifica o peso da carga para cada um dos três envios.

Nesse cenário, os valores configurados têm os seguintes efeitos:

  • O otimizador organiza seus trajetos para entregar primeiro os pacotes mais pesados. O solucionador programa as entregas de 80 kg e 50 kg no início da rota para minimizar a distância percorrida com carga pesada.
  • O otimizador organiza suas rotas para minimizar a distância percorrida com carga pesada. Para ver como essas configurações afetam suas rotas, aumente costPerUnitAboveThreshold de 1 para 5. Ao aumentar a penalidade de peso, você solicita que o otimizador trabalhe ainda mais para minimizar a distância percorrida com carga mais pesada, o que pode reorganizar a sequência de entrega ou dividir os envios em vários veículos.

Exemplo de solicitação

O exemplo a seguir mostra a estrutura de uma solicitação básica de optimizeTours que incorpora os valores de custo de carga do cenário de exemplo:

{
  "model": {
    "shipments": [
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789456,
              "longitude": -122.390192
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 100.0,
        "loadDemands": {
          "weightKg": {
            "amount": "50"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.789116,
              "longitude": -122.395080
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 30.0,
        "loadDemands": {
          "weightKg": {
            "amount": "10"
          }
        }
      },
      {
        "deliveries": [
          {
            "arrivalLocation": {
              "latitude": 37.795242,
              "longitude": -122.399347
            },
            "duration": "250s"
          }
        ],
        "penaltyCost": 50.0,
        "loadDemands": {
          "weightKg": {
            "amount": "80"
          }
        }
      }
    ],
    "vehicles": [
      {
        "endLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "startLocation": {
          "latitude": 37.794465,
          "longitude": -122.394839
        },
        "costPerHour": 40.0,
        "costPerKilometer": 10.0,
        "loadLimits": {
          "weightKg": {
            "maxLoad": "100",
            "costPerKilometer": {
              "loadThreshold": "15",
              "costPerUnitAboveThreshold": 1
            }
          }
        }
      }
    ]
  }
}

Fórmulas de cálculo

O otimizador calcula os custos de carga usando as seguintes fórmulas.

Cálculo completo do limite

Ao especificar costPerUnitAboveThreshold e costPerUnitBelowThreshold, você incorre em custos de viagem separados para valores de carga acima e abaixo do loadThreshold. A fórmula é a seguinte:

cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
       + min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold

Por exemplo, usando os valores do Exemplo de solicitação, em que o valor de costPerUnitBelowThreshold é 2, se o veículo percorrer 10 quilômetros transportando uma carga de 50, o cálculo será:

max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units

Cálculo acima do limite

Quando você especifica apenas costPerUnitAboveThreshold, o cálculo é um caso especial da fórmula completa de limite. Como o custo abaixo do limite é zero, a segunda metade da fórmula completa é avaliada como zero. A fórmula é a seguinte:

cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold

Por exemplo, usando os valores do Exemplo de solicitação em que loadThreshold é 15 e costPerUnitAboveThreshold é 1, se o veículo percorrer 10 quilômetros carregando uma carga de 50, o cálculo será:

max(50 - 15, 0) * 10 * 1 = 350 cost units

Cálculo abaixo do limite

De forma simétrica, se você especificar apenas costPerUnitBelowThreshold, o cálculo será outro caso especial da fórmula completa de limite em que o custo acima do limite é zero. A fórmula é a seguinte:

cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold