Параметры модели затрат

Разработчики Европейской экономической зоны (ЕЭЗ)

Сообщение OptimizeToursRequest ( REST , gRPC ) содержит ряд свойств, связанных с затратами . Вместе эти параметры затрат представляют собой модель затрат запроса. Модель затрат охватывает многие из высокоуровневых целей оптимизации запроса, такие как:

  • Отдача приоритета более быстрым маршрутам Vehicle по сравнению с более короткими маршрутами или наоборот
  • Принятие решения о том, оправдывают ли затраты на доставку Shipment стоимость завершения Shipment
  • Осуществление забора и доставки в течение временных интервалов только в том случае, если это экономически эффективно

Посмотреть пример запроса с расходами

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

Сообщение Vehicle ( REST , gRPC ) имеет несколько свойств стоимости:

  • Vehicle.cost_per_hour : представляет собой стоимость эксплуатации транспортного средства в час, включая время проезда, ожидания, посещения и перерывов.
  • Vehicle.cost_per_kilometer : представляет стоимость за километр, пройденный транспортным средством.
  • Vehicle.cost_per_traveled_hour : представляет собой стоимость эксплуатации транспортного средства только во время поездки, без учета времени ожидания, посещений и перерывов.

Эти параметры стоимости позволяют оптимизатору делать компромиссы между временем и пройденным расстоянием. Расходы, понесенные оптимизированным маршрутом, отображаются в ответном сообщении как metrics.costs :

По мере увеличения costPerHour оптимизатор пытается найти более быстрые маршруты, которые могут быть не самыми короткими . В этом примере самый быстрый маршрут оказывается самым коротким, поэтому изменения в параметрах стоимости мало что меняют.

Свойства стоимости Shipment

Сообщение Shipment ( REST , gRPC ) также имеет несколько параметров стоимости:

  • Shipment.penalty_cost представляет собой стоимость пропуска отправки. Если не задать параметр penalty_cost отправки, отправка будет обязательной , что означает, что отправка будет пропущена только в том случае, если ее невозможно завершить с учетом указанных ограничений.
  • Shipment.VisitRequest.cost представляет собой стоимость конкретного самовывоза или доставки, используемую в основном для обеспечения компромисса между несколькими вариантами самовывоза или доставки для одной отправки.

Параметры стоимости Shipment используют те же безразмерные единицы, что и параметры стоимости Vehicle . Стоимость, понесенная при завершении Shipment , превышает стоимость штрафа, Shipment не включается ни в один маршрут Vehicle и вместо этого отображается в списке skipped_shipments в ответном сообщении.

Свойства стоимости ShipmentModel

Сообщение ShipmentModel ( REST , gRPC ) включает в себя единственное свойство стоимости, globalDurationCostPerHour . Эта стоимость взимается на основе общего времени, необходимого для завершения всеми транспортными средствами своих ShipmentRoute s. Увеличение globalDurationCostPerHour отдает приоритет более раннему завершению всех поставок.

Свойства стоимости ответа оптимизации маршрута

Сообщение OptimizeToursResponse ( REST , gRPC ) имеет свойства стоимости, которые представляют собой затраты, понесенные в процессе завершения ShipmentRoute s. Свойства metrics.costs и metrics.totalCost представляют собой количество единиц стоимости, понесенных по всем маршрутам в ответе. Каждая запись routes имеет свойства routeCosts и routeTotalCosts , которые представляют собой затраты для этого конкретного маршрута.

Посмотрите ответ на пример запроса с расходами

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

В примере ответа верхние уровни metrics.costs следующие:

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

Значение model.shipments.penalty_cost представляет собой стоимость, понесенную из-за пропущенных поставок. Свойство skippedShipments перечисляет, какие поставки были пропущены.

В этом примере пропускается только model.shipments[1] в примере запроса. model.shipments[1] имеет штрафную стоимость 5 единиц, что соответствует общему ключу model.shipments.penalty_cost в примере ответа. Низкое penaltyCost доставки по сравнению с 40,0 costPerHour и 10,0 costPerKilometer у Vehicle делает более экономически выгодным пропустить доставку, чем завершить ее.

Продвинутая тема: затраты и мягкие ограничения

Несколько свойств сообщения OptimizeToursRequest ( REST , gRPC ) представляют мягкие ограничения , которые влекут за собой затраты, если их невозможно выполнить.

Например, ограничения LoadLimit ( REST , gRPC ) транспортного средства имеют свойства softMaxLoad и costPerUnitAboveSoftMax . Вместе они влекут за собой стоимость, пропорциональную единицам нагрузки, которые превышают softMaxLoad , позволяя превышать предел только в том случае, если это имеет смысл с точки зрения затрат.

Аналогично, ограничения TimeWindow ( REST , gRPC ) имеют свойства soft_start_time и soft_end_time с соответствующими cost_per_hour_before_soft_start_time и cost_per_hour_after_soft_end_time , которые возникают в зависимости от того, насколько рано или поздно происходит ограниченное событие по отношению к TimeWindow .

Как и все параметры модели затрат, затраты мягких ограничений выражаются в тех же безразмерных единицах, что и другие параметры затрат.

Ограничения LoadLimit подробно рассматриваются в разделе Требования и ограничения по загрузке . Ограничения TimeWindow подробно рассматриваются в разделе Ограничения по времени окна вывоза и доставки .