Раньше, задать кастомную формулу стоимости, либо формулу выплат курьеру можно было задать только для маршрута целиком.
Сейчас мы добавили возможность указывать пользовательскую формулу стоимости маршрута/выплаты курьеру для отдельных смен и заездов. Теперь, в качестве поля cost у а/м можно указать объект, со следующими подполями:
route — формула стоимости/выплаты, которая будет рассчитана на основе метрик всего маршрута. В этом поле, фактически, задается «старая» пользовательская формула;
shift — формула стоимости/выплаты, которая будет рассчитана на основе метрик отдельной смены;
run — формула стоимости/выплаты, которая будет рассчитана на основе метрик отдельного заезда.
Пример определения:
{
...
"vehicles": [
{
...
"cost": {
"route": "3000",
"shift": "100 * locations",
"run": "150 * duration_h + 10 * distance_km"
},
"payout": {
"route": "3000",
"shift": "100 * locations",
"run": "150 * duration_h + 10 * distance_km"
},
...
]
...
},
...
}
Добавили возможность балансировки маршрутов по ряду новых измерений. В дополнение к балансировке по времени (hour) и количеству остановок (stop) добавлены:
km — по километрам пробега;
served_order — по числу обслуженных заказов;
custom_value — по сумме значений custom_value у заказов;
weight_kg — по общему весу заказов в килограммах;
unit — по общему весу заказов в единицах веса.
Кроме того также сделали изменения в поведения старого функционала. Ранее по схеме обязательным являлось указание балансировки по всем существовавшим измерениям (hour и stop). Это требование убрали — теперь достаточно указать хотя бы один из семи доступных видов штрафов. Балансировки, которые не были указаны в запросе, применяться не будут.
Пример определения:
{
...
"options": {
...
"balanced_groups": [
{
"id": "bgroup",
"penalty": {
"hour": 100,
"km": 100,
"stop": 100,
"served_order": 100,
"custom_value": 100,
"weight_kg": 100,
"unit": 100
}
},
...
]
...
},
...
}
При задании формулы для кастомных костов/payout теперь можно использовать две новые переменные:
empty_distance_km — расстояние, которое было пройдено без каких-либо заказов на борту;
non_empty_distance_km — расстояние, которое было пройдено хотя бы с одним заказом на борту.
Пример:
{
...
"vehicles": [
{
"id": "1",
"cost": "10 * duration_h + 100 * distance_km + 100 * empty_distance_km",
...
},
...
]
}
В примере стоимость километра в два раза ниже, если на борту есть хотя бы один заказ. Подробнее в документации
Раньше машина могла нарушать ограничение max_runs, если оно меньше кол-ва смен (другими словами, если у машины есть X смен, то она могла делать до X заездов включительно независимо от того какое значение установлено в max_runs). Сейчас ограничение max_runs всегда соблюдается.
Кроме того, если раньше max_runs мог быть равен или меньше нуля, то сейчас это всегда положительное число.
Если для автомобиля нужно задать желаемый район работы — так, чтобы в маршрут включались заказы, расположенные недалеко от определенной точки, — используйте параметр global_proximity_attraction_point. В значении параметра укажите id точки с типом garage. Эта точка используется как «точка притяжения» — алгоритм стремится уменьшить сумму расстояний от заказов в маршруте до этой точки.
Подробнее в документации
Список организаций, которые могут наблюдать за маршрутами вашей компании теперь можно редактировать прямо со страницы маршрута. Это удобно, если вы ходите быстро поделиться доступом к просмотру маршрута с контрагентом.
На этом сегодня все, по всем вопросам пишите на routing-support@yandex-team.ru