- BrainTools - https://www.braintools.ru -

Каждый сервис доставки рано или поздно сталкивается с трёмя загадочными буквами — VRP. На первый взгляд кажется, что эта аббревиатура обозначает какой-то корпоративный лозунг, использующий транслитерацию, например: VSE RADI PIZZY. Но на самом деле за ней скрывается сложная и крайне важная задача оптимизации. От того, насколько эффективно вы сумеете её решить, зависит не только удовлетворённость клиентов, но и реальные показатели бизнеса: скорость доставки, расходы на логистику.
Всем привет! Меня зовут Ринат Шарафетдинов [1]. Я Senior ML Engineer в команде AI Lab, где мы разрабатываем проекты на основе искусственного интеллекта [2] для развития и повышения эффективности бизнеса Додо.
В этой статье я расскажу, какие типы VRP-задач бывают, чем они отличаются друг от друга, и какие готовые решения вы можете протестировать в ваших кейсах уже сейчас. Также я поделюсь подходами и инструментами, обнаруженными во время исследования, опытом [3] их использования и причинами, по которым я сразу отказался от некоторых из них.
Vehicle Routing Problem (VRP) [4] — это класс задач комбинаторной оптимизации, где требуется оптимально распределить маршруты между несколькими транспортными средствами, минимизируя общую стоимость (время, расстояние, издержки) при соблюдении ряда условий.
CVRP (Capacitated VRP): задача, в которой у каждого курьера (или транспортного средства) есть ограничение на грузоподъёмность. При этом каждая точка маршрута (доставка) имеет фиксированный объём груза, и вся логика [5] маршрутизации строится с учётом того, сколько заказов можно «унести за раз»;
VRPTW (VRP with Time Windows): задача, в которой каждая точка должна быть обслужена в определённое временное окно. Это очень похоже на доставку еды или экспресс-доставку, где важно не только привезти заказ, но и уложиться во временной интервал (например, с 18:00 до 18:30);
VRPPD (VRP with Pickup and Delivery): более сложная постановка задачи, в которой одно и то же транспортное средство должно забрать что-то в одном месте и доставить в другое. Классический пример — доставка между точками: забрать посылку у одного клиента и доставить другому. Здесь важно правильно согласовать пары «откуда — куда», не превысить вместимость курьера и минимизировать длину самого длинного маршрута.
Рост конкуренции, ужесточение требований по срокам и качеству доставки, а также увеличение клиентских ожиданий делают логистику ядром операционного успеха. Быстрая, точная и экономичная доставка напрямую влияет на выручку, удовлетворённость клиентов и общий имидж бренда.
cнижение затрат на логистику: правильное распределение заказов между курьерами позволяет минимизировать общее расстояние маршрутов, экономить топливо, рабочее время и даже сокращать количество необходимых курьеров в смене;
повышение удовлетворённости клиентов: когда курьеры приезжают вовремя и с минимальной задержкой, клиенты получают лучший сервис. Это напрямую влияет на повторные заказы и лояльность;
снижение стресса [6] внутри команды производства: автоматизация маршрутизации уменьшает ручную нагрузку на операторов, делает работу курьеров предсказуемой и помогает избежать конфликтов из-за несправедливого распределения заказов.
Компании, работающие в сфере доставки еды, особенно в условиях масштабирования, сталкиваются с рядом повторяющихся логистических проблем:
соблюдение SLA: доставка должна быть быстрой и точной, иначе компания теряет доверие клиента и деньги на компенсации;
нестабильный трафик: маршруты нужно постоянно пересчитывать, иначе легко попасть в пробки или приехать с опозданием;
дисбаланс нагрузки между курьерами: кто-то перегружен, кто-то простаивает. Это снижает эффективность работы и демотивирует команду;
синхронизация: важно учитывать время готовности блюда и время до приезда курьера, чтобы не накапливалось ожидание и не было опозданий.
Когда я исследовал задачу распределения заказов по курьерам, у меня не было чёткого понимания, в какую сторону двигаться. Мне, как ML-инженеру, сначала показалось логичным группировать заказы по общим признакам, используя метод поиска ближайших соседей. Погрузившись в проблему глубже, я думал о географической кластеризации и даже пробовал библиотеку h3 по совету коллег. Однако мои возможности были ограничены технологическим стеком компании и собственной экспертизой: мой основной рабочий инструмент — Python.
После нескольких дней активного поиска информации и чтения научных статей я и узнал о VRP. Я начал изучать доступные решения в интернете, но полезной информации по моему запросу, учитывая реализацию на Python, было мало. Множество решений были созданы с использованием других языков программирования, таких как: C++ и Java, но я искал что-то простое, понятное и быстрое в освоении, чтобы оперативно внедрить эффективное решение на Python.
Эвристика — быстро строят начальное решение, но качество может быть далеко от оптимального.
Примеры алгоритмов:
Clarke–Wright savings (метод «сбережений»);
«Sweep» (сортировка клиентов по полярному углу).
Метаэвристика — предлагают баланс скорости и качества для средних и больших задач.
Примеры алгоритмов:
Локальный поиск и его расширения: 2‑opt, 3‑opt;
Tabu Search, Simulated Annealing, GRASP (Greedy Randomized Adaptive Search);
Genetic Algorithms, Ant Colony Optimization;
Large Neighborhood Search (LNS) / Adaptive LNS (ALNS).
DL (Deep Learning) — подходят, если вы готовы инвестировать в сбор/симуляцию данных и GPU‑обучение.
Примеры алгоритмов:
Простые в использовании библиотеки для решения VRP с возможностью кастомизации:
Python/C++/Java/C# (OR-Tools [9]): работа с разными языками, удобная реализация;
C++ (VROOM [10]): высокая производительность, хорошо подходят для крупных задач;
Java (jsprit [11]): гибкость и производительность;
Python (PyVRP [12]): если нужная бОльшая гибкость и реализация строго на Python.
Про более детальное сравнение (VROOM и jsprit) можно прочитать тут [13].
Удобные и быстрые API для решения небольших задач без глубокой кастомизации:
OpenRouteService [14];
GraphHopper [15].
Если есть желание основательно понять, что такое VRP, то стоит почитать:
Vehicle routing problem: models and solutions [16] — в этой статье обобщаются модели задачи маршрутизации транспортных средств, в том числе и варианты с временными окнами, сбором и доставкой и ограничениями по вместимости. Рассматриваются методы решения задачи — от точных алгоритмов на основе линейного программирования и guided local search до эвристических подходов;
What you should know about the vehicle routing problem [17] — в этой работе обобщаются ключевые результаты по классической задаче маршрутизации транспортных средств с ограничениями по вместимости. Они сгруппированы в три блока: точные алгоритмы, классические эвристики и метаэвристики для построения m маршрутов минимальной стоимости через n клиентов.
При выборе стоит учитывать следующее:
размер и масштаб задачи. При большом количестве заказов задача может решаться достаточно долго;
ограничения по времени расчёта;
технологический стек команды;
бизнес-ограничения для алгоритма;
что важнее: гибкость или качество алгоритма?
Например, маленькой компании для решения задачи по маршрутизации подойдёт и сервис с API с одним запросом в день. Однако крупной QSR-компании, в которой алгоритм может вызываться каждые 30 секунд на 1200+ пиццерий, стоит смотреть в сторону OR-Tools или похожего фреймворка, который можно адаптировать под свои потребности [18]. Ну и, конечно, всегда можно собрать свой алгоритм оптимизации и фреймворк, но и реализовать его сложнее.
Тщательно подбирайте формулировку задачи под свои ограничения и желания. Чётко фиксируйте все бизнес‑правила и технические ограничения — вместимость, временные окна, приоритеты клиентов —, чтобы формулировка VRP‑задачи полностью отражала реальные условия работы.
Осторожно работайте с расстоянием/временем. Используйте актуальные дорожные и транспортные данные — учёт пробок, пиковых нагрузок и типов дорог, сервисное время на то, чтобы отдать заказ клиенту —, иначе расчётные маршруты могут оказаться не очень функциональными на практике.
Интеграция с другими процессами (например, производством пиццы) существенно усложняет задачу. Синхронизация времени готовности и упаковки продукции с оптимизацией маршрутов требует учёта дополнительных параметров.
Мы решили отказаться от эмпирического алгоритма группировки в пользу фреймворка OR-Tools. Почему?
Во-первых, мы столкнулись с проблемами во время тестирования алгоритма. Во-вторых, OR-Tools прост в работе, имеет достаточную документацию и позволяет получить хорошее качество при решении нашей задачи маршрутизации заказов с ограничениями.
В дополнение к OR-Tools мы реализовали буфер для выдачи заказов, где заказы будут ждать своей очереди на приготовление. А ещё создали ML-модель для прогнозирования времени приготовления группы заказов, так как мы можем сгруппировать вплоть до 3-х заказов.
Мы находимся в активной стадии тестирования нашего решения, поэтому пока рано делать окончательные выводы. Однако уже сейчас мы наблюдаем первые положительные изменения:
группировка заказов показала хорошие результаты: сформировалось множество групп, а заказы без явных ошибок распределялись по географическому признаку корректно. Текущий уровень устойчивости и технической реализации алгоритма позволяет нам масштабировать тестирование на новые пиццерии;
буфер выдачи заказов с ML-прогнозом времени приготовления работает лучше, чем с константой;
метрики доставки в тестах не просаживаются при первичном внедрении системы.
Некоторые из наших первоначальных гипотез подтвердились. Другие же потребовали дополнительной проверки и доработки, но это естественная часть любого инновационного процесса.
В VRP нет универсального решения, подходящего всем. Необходимо тщательно подходить к выбору решения, опираясь на конкретные потребности бизнеса. Надеюсь, эта статья поможет вам выбрать подходящий путь и избежать типичных ошибок.
Сталкивались ли вы с VRP? Какое из решений подошло именно вам? Обязательно делитесь в комментариях!
Спасибо, что дочитали эту статью! Ставьте плюсики, если материал показался вам интересным, и делитесь им с друзьями. А чтобы быть в курсе последних новостей Dodo Engineering, подписывайтесь на наш Telegram-канал [19].
Автор: rinatsharafetdinov
Источник [20]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/14776
URLs in this post:
[1] Ринат Шарафетдинов: https://t.me/rinatsharafetdinov
[2] интеллекта: http://www.braintools.ru/article/7605
[3] опытом: http://www.braintools.ru/article/6952
[4] Vehicle Routing Problem (VRP): https://en.wikipedia.org/wiki/Vehicle_routing_problem#:~:text=The%20vehicle%20routing%20problem%20(VRP,travelling%20salesman%20problem%20(TSP).
[5] логика: http://www.braintools.ru/article/7640
[6] стресса: http://www.braintools.ru/article/9548
[7] Reinforcement Learning for Solving the Vehicle Routing Problem: https://www.semanticscholar.org/paper/Reinforcement-Learning-for-Solving-the-Vehicle-Nazari-Oroojlooy/0366b6396610708a77540564050a90a761a28937
[8] Attention, Learn to Solve Routing Problems!: https://www.semanticscholar.org/paper/Attention%2C-Learn-to-Solve-Routing-Problems!-Kool-Hoof/ce4f001c1d8ddb9a95cf54e14240ef02c44bd329
[9] OR-Tools: https://developers.google.com/optimization
[10] VROOM: https://github.com/VROOM-Project/vroom
[11] jsprit: https://github.com/graphhopper/jsprit
[12] PyVRP: https://github.com/PyVRP/PyVRP
[13] тут: https://habr.com/ru/articles/707118/
[14] OpenRouteService: https://github.com/GIScience/openrouteservice
[15] GraphHopper: https://github.com/graphhopper/graphhopper
[16] Vehicle routing problem: models and solutions: https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=7a706062c19983e41ddce8bcd6102da0cce40a1e
[17] What you should know about the vehicle routing problem: https://www.gerad.ca/fr/papers/1444.pdf
[18] потребности: http://www.braintools.ru/article/9534
[19] на наш Telegram-канал: https://t.me/+en2c05Bh6ihlM2Yy
[20] Источник: https://habr.com/ru/companies/dododev/articles/904464/?utm_source=habrahabr&utm_medium=rss&utm_campaign=904464
Нажмите здесь для печати.