Установите приоритет посещений поблизости с помощью атрибутов перехода

В этом примере показано, как использовать атрибуты переходов для определения приоритетности маршрутов, где в течение одного временного интервала осуществляется одно и то же транспортное средство для погрузки и разгрузки товаров поблизости. Для получения дополнительной информации об атрибутах переходов см. раздел «Моделирование бизнес-логики с помощью атрибутов переходов» .

В этом примере:

  • Доставка грузов А, В и С осуществляется с близкого расстояния по одной и той же дороге.
  • Дополнительные поставки ожидаются позже.
  • Для доставки не установлены конкретные сроки.
  • Вне зависимости от графика визита, транспортному средству необходимо проехать по этой дороге дважды: один раз утром, по пути из депо, и один раз вечером, по пути обратно.
  • Общая протяженность и продолжительность маршрута всегда одинаковы, независимо от того, когда выполняются действия A, B и C.

Example with deliveries of shipments on the same road. There are three
shipments A, B, and C on the road from the depot towards other shipments. A is
1000m from the depot, B is 50 meters further away from the depot, and C is 30
meters further in the same direction. There are other shipments 1000m far from
C.

В этой ситуации, при условии, что запрос учитывает только стоимость часа и стоимость километража, оптимизированный маршрут может предусматривать обработку пунктов А и В утром, а пункта С — вечером, и стоимость решения будет такой же, как если бы все три пункта обрабатывались одновременно.

Стоимость за километр с пороговым значением

Для группировки ближайших посещений сначала необходимо выбрать пороговое расстояние. Это максимальное расстояние между двумя посещениями, которые вы считаете близкими. В этом примере используется пороговое значение в 100 метров, что примерно соответствует одному кварталу в городской черте. Вы можете увеличить или уменьшить пороговое значение в соответствии с потребностями вашего бизнеса и предпочтениями ваших водителей.

Чтобы сгруппировать ближайшие посещения в пределах 100 метров друг от друга, вы устанавливаете высокую стоимость для первых 100 метров каждого перехода и более низкую стоимость для любых дополнительных метров перехода. Поскольку первые 100 метров являются самыми дорогими, оптимизатор получает наибольшую экономию, используя переходы короче 100-метрового порога, даже если это означает увеличение общей длины маршрута.

Для настройки стоимости добавьте новую запись в ShipmentModel.transition_attributes со следующими свойствами:

{
  "model": {
    "transitionAttributes": [
      {
        "excluded_dst_tag": "UNUSED_TAG",
        "excluded_src_tag": "UNUSED_TAG",
        "distanceLimit": {
          "softMaxMeters": 100,
          "costPerKilometerBelowSoftMax": 50,
          "costPerKilometerAboveSoftMax": 1,
        }
      }
    ]
  }
}

Метка #unused_tag# не должна использоваться ни для каких отправлений или транспортных средств, чтобы сопоставить все возможные переходы. Для получения дополнительной информации см. раздел «Как сопоставить все запросы на посещение» .

Как работает высокая стоимость ниже порогового значения

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

Решение 1: Выполните действия A, B по пути туда, C по пути обратно.

В этом варианте доставки грузы разделяются на два этапа по этому маршруту. Два груза доставляются по первому этапу, а оставшийся — по второму. Всего 5 этапов:

Переход Расстояние Ниже порога Выше порогового значения
Расстояние Расходы Расстояние Расходы
склад →А 1000 м 100 м 5 900 м 0.9
А→Б 50 м 50 м 2.5 0 м 0
Б→другой 1030 м 100 м 5 930 м 0,93
другие→С 1000 м 100 м 5 900 м 0.9
С→депо 1080 м 100 м 5 980 м 0,98
Общий 450 м 22.5 3710 м 3.71

Общая стоимость рассчитывается как сумма двух затрат за километр:

  • стоимость за километр ниже порогового значения (50) умноженная на общее пройденное расстояние ниже порогового значения (450 м = 0,45 км),
  • стоимость за километр сверх порогового значения (1) умноженная на общее пройденное расстояние сверх порогового значения (3710 м = 3,71 км).

Таким образом, общая стоимость составляет 0,45 * 50 + 3,71 * 1 = 22,5 + 3,71 = 26,21.

Решение 2: Выполните действия A, B, C по пути туда, ничего не делайте по пути обратно.

В этом варианте, в отличие от варианта 1, все три груза доставляются «одной группой» за один проезд по дороге. На другом проезде транспортное средство вообще не останавливается. Опять же, имеется 5 переходов, но их длина и состав различны:

Переход Расстояние Ниже порога Выше порогового значения
Расстояние Расходы Расстояние Расходы
склад →А 1000 м 100 м 5 900 м 0.9
А→Б 50 м 50 м 2.5 0 м 0
B→C 30 м 30 м 1.5 0 м 0
C→другое 1000 м 100 м 5 900 м 0.9
другой→депо 2080 м 100 м 5 1980 м 1.98
Общий 380 м 19 3780 м 3.78

Используя те же вычисления, что и в решении 1, общая стоимость составляет 0,38 * 50 + 3,78 * 1 = 19 + 3,78 = 22,78, и выполнение всех посещений за один временной блок обходится дешевле, чем выполнение их в двух группах. Вы можете усилить этот эффект, увеличив значение DistanceLimit.cost_per_kilometer_below_soft_max .

Почему низкая стоимость километра, ниже порогового значения, не работает

Поскольку вы предпочитаете короткие переходы длинным, у вас может возникнуть соблазн установить высокую стоимость километра для длинных переходов и оставить низкую стоимость километра для коротких. Но на самом деле это имеет обратный эффект: поскольку первые 100 метров перехода являются самыми дешевыми, оптимизатор использует эти «дешевые» метры с наибольшей эффективностью, отдавая предпочтение переходам, длина которых близка к 100 метрам или превышает их.

Этот эффект можно увидеть на двух примерах решений. Если поменять местами стоимость за километр ниже и выше порогового значения, стоимость маршрута изменится:

Высокая стоимость, превышающая пороговое значение Высокая стоимость ниже порогового значения
Решение 1 Решение 2 Решение 1 Решение 2
км ниже порогового значения 0,45 0,38 0,45 0,38
Стоимость за км ниже порогового значения 1.00 1.00 50.00 50.00
км выше порогового значения 3.71 3.78 3.71 3.78
Стоимость за километр сверх порогового значения 50.00 50.00 1.00 1.00
Общая стоимость 185.95 189.38 26.21 22.78

Для каждого варианта наименьшая из двух суммарных затрат выделена жирным шрифтом. Вы можете видеть, что при использовании высокой стоимости, превышающей пороговое значение, общая стоимость маршрута теперь выше для маршрута, где посещения сгруппированы, что противоречит желаемому результату.