Алгоритмы доставки и подбор заказов для курьеров
Узнайте, какие алгоритмы, языки программирования и математические области используются в приложениях доставки, особенно для подбора заказов курьерам. Технологический стек, разработка систем, улучшения и план обучения за 6–12 месяцев.
Какие алгоритмы, программистские языки и математические области используются в приложениях для доставки в целом, и конкретно в сервисах по подбору заказов для курьеров? Как разрабатывались такие системы, какой технологический стек применяется, и сколько человек обычно в команде разработчиков?
Как опытный курьер, я хочу узнать, возможно ли внести улучшения в эти системы и как это реализовать. Кроме того, интересно, реально ли за 6–12 месяцев освоить программирование и перейти в эту сферу. С какой литературы начать изучение?
Для Android-приложений базой являются Java и Kotlin, но меня больше интересует прикладная математика. Хочу разработать бота для автоматического выбора самых выгодных и быстрых заказов. Возможно ли реверс-инжиниринг курьерских приложений для обучения, и как создать пет-проекты на основе открытых аналогов, например, форки от Достависты, Яндекса или Ozon?
В первую очередь хочу разобраться в приложениях для курьеров, таких как Яндекс.Еда или FlowWow, где система автоматически распределяет заказы и маршруты. Опционально — в приложениях, где курьер сам выбирает заказы, а затем углубиться в приложения для клиентов.
В приложениях для доставки курьером используются алгоритмы доставки (динамическая маршрутизация, батчинг и назначение заказов), языки Java/Kotlin для Android и Python/Go/Java на сервере, а математическая основа — теория графов, комбинаторная оптимизация и статистика. Подбор заказов реализуют через scoring/assignment (жадные алгоритмы, min-cost flow, online matching), сервисы строят как микросервисы с гео-БД и движками маршрутизации; как курьер вы можете собрать данные, прототипировать бота и за 6–12 месяцев освоить необходимые навыки для первых пет-проектов и перехода в сферу разработки приложений доставки.
Содержание
- Алгоритмы доставки и подбор заказов
- Математические области и формулы
- Технологический стек и языки программирования
- Как разрабатываются такие системы и команда разработчиков
- Практические улучшения: идеи для курьера и пет-проекты
- Реверс-инжиниринг и этика
- План обучения 6–12 месяцев и литература
- Источники
- Заключение
Алгоритмы доставки и подбор заказов
Какие алгоритмы используются на практике? Коротко — сочетание классических задач комбинаторной оптимизации и простых эвристик, адаптированных под онлайн-режим доставки.
-
Назначение и подбор заказов (matching / assignment)
- Модель: двудольный граф «курьеры — заказы». В офлайн-режиме задача сводится к задаче назначений (Hungarian) или min-cost max-flow; в онлайн-режиме применяют жадные правила, аукционные схемы или приоритетные очереди. Для масштабных систем используют гибрид: быстрые эвристики для немедленного решения + периодическая глобальная оптимизация.
- Практическое правило: вычислить «score» для каждого заказа и брать максимум (скоринг объединяет цену заказа, ETA, расстояние до ресторана и вероятность отмены).
-
Маршрутизация и VRP (vehicle routing)
- Классические задачи: TSP, VRP, VRP с временными окнами (VRPTW), Pickup & Delivery, Dynamic VRP (DVRP). Все они NP-трудны, поэтому на практике применяют эвристики (nearest neighbor, savings), локальный поиск, метаэвристики (tabu search, genetic) или ILP-решения для небольших подзадач.
- Для доставки еды важен батчинг: объединение нескольких заказов в один маршрут, чтобы повысить проходимость системы; об этом пишет практика крупных сервисов, которые группируют небольшие наборы заказов для сокращения времени ожидания и повышения эффективности (см. пример на RB.RU).
-
ETA и прогнозы
- ETA строят через регрессионные модели и градиентные бэггинги (XGBoost/LightGBM), а в сложных случаях — нейронные сети, учитывающие временные и дорожные паттерны. Исторические телеметрические данные и погодные/дорожные факторы — ключевые признаки.
- Компонент ETA критичен для скоринга заказа: малое расхождение ETA и реального времени — повышает доходность.
-
Инкрементальная оптимизация в реальном времени
- Система должна быстро реагировать на пинги курьеров: используется «локальный ремонт» маршрутов, когда перерасчёт охватывает соседние участки, а не всю систему.
Пример простого скоринга (формула и код для прототипа):
где P — оплата за заказ, ETA — оценка времени доставки, D — расстояние до точки забора, H — исторический коэффициент успешности.
Пример на Python:
def score(order, courier, alpha=1.0, beta=0.3, gamma=0.5):
pay = order['pay']
eta = order['eta_min']
dist = order['dist_to_pickup_km']
hist = order.get('history_score', 0.0)
return pay - alpha * eta - beta * dist + gamma * hist
Для реального прототипа ETA/дистанции лучше брать из движка маршрутизации (OSRM/GraphHopper/Valhalla) или из API карт, а не из евклидова расстояния.
Математические области и формулы
Какие области математики вы будете использовать при разработке алгоритмов подбора заказов?
- Теория графов: модели дороги как графа, поиск кратчайших путей (Dijkstra, A*), анализ связности и кластеризация зон доставки.
- Комбинаторная оптимизация: Integer Programming / Mixed-Integer Programming для точных формулировок VRP; LP-релаксации и ветвей-и-границ для малых инстансов.
- Приближённые алгоритмы и эвристики: локальный поиск, k-means для кластеризации заказов, greedy/online алгоритмы.
- Случайные процессы и статистика: прогнозирование спроса (временные ряды, сезонность), оценка неопределённости ETA и робастная оптимизация.
- Машинное обучение: регрессия/деревья решений для ETA и динамического скоринга, классификация (вероятность отмены), иногда RL для динамического диспетчирования.
Минимальная математическая формулировка VRP выглядит так:
при ресурсных ограничениях (вместимость, временные окна , и пр.). Полный аппарат — линейное программирование, теория матриц, численные методы и статистика; для практики хватит базовых знаний линейной алгебры, теории вероятностей и оптимизации.
Полезные обзорные статьи о роли математики в логистике и применении алгоритмов можно найти в материалах по практике логистики и IT-решениях в доставке (например, Логистика и прикладная математика и обзор на RB.RU).
Технологический стек и языки программирования
Какие языки и инструменты встречаются в продуктах доставки:
-
Клиент (мобильные приложения):
- Android: Java, Kotlin (стандарт для Android).
- iOS: Swift.
- Кроссплатформенные варианты: Flutter (Dart), React Native (JavaScript/TypeScript).
-
Сервер (бэкенд):
- Python (быстрая прототипизация, ML), Go (высокая конкуренция и простота деплоя), Java/Kotlin (enterprise), Node.js (быстрый старт).
- Фреймворки: FastAPI/Django (Python), Spring Boot (Java/Kotlin), Gin (Go), Express (Node).
-
Базы данных и гео:
- PostgreSQL + PostGIS для пространственных запросов, Redis для кэша и realtime-state, Kafka/RabbitMQ для стримов/очередей.
- Хранилища: ClickHouse/BigQuery для аналитики.
-
Маршрутизация и карты:
- Движки: OSRM, GraphHopper, Valhalla; коммерческие API: Google Maps, Яндекс.Карты, Mapbox.
- В интерфейсе: Mapbox GL, Leaflet.
-
ML/analytics:
- Python: pandas, scikit-learn, XGBoost/LightGBM, PyTorch/TensorFlow.
-
DevOps/инфраструктура:
- Docker, Kubernetes, CI/CD (GitLab CI/Jenkins), мониторинг Prometheus+Grafana, логирование ELK. Совокупность этих инструментов — часть современного SaaS-стека (WorkSolutions обзор стека, обзор стеков — SkillFactory).
Практические примеры интеграций и описания архитектуры приложений доставки см. в материалах по разработке приложений доставки от агентств и поставщиков: e-Legion, Purrweb, а также платформы автоматизации доставки (например, Poster).
Как разрабатываются такие системы и команда разработчиков
Типичный цикл разработки:
- Выделяют MVP-функции: приём заказа, отображение заказа курьеру, подтверждение, статус-апдейты, простая логика подбора.
- Создают API и модель данных, настраивают карты и routing service.
- Добавляют наблюдаемость (logging/metrics), симуляторы для нагрузки и backtesting.
- Итерируют: вводят ML-компоненты для ETA/скоринга, оптимизацию батчинга, управление очередью задач.
Команда и роли (пример):
- Небольшой стартап/MVP: 3–6 человек — 1 product, 1–2 backend, 1 mobile, 1 devops/infra, 1 QA.
- Средний проект/scale-up: 10–30 человек — backend, mobile, frontend, data engineer, ML engineer, devops, QA, product/design.
- Большая платформа (Яндекс, Ozon): десятки + аналитики, SRE, операторы, продуктовые команды.
Агентства и команды разработки описывают этапы создания приложений и типичный стек в разборе по бизнес-функциям — см. обзоры от Purrweb и пример интеграции с сервисами Яндекса через бэк-офисы (QuickResto — настройка Yandex.Eda).
Практические улучшения: идеи для курьера и пет-проекты
Как опытный курьер вы имеете преимущество понимания «узких мест» — используйте это.
Шаги для начала:
- Сбор данных: заведите локальный журнал (CSV) с полями: время заказа, адреса, расстояния, оплата, ETA платформы, реальное время, отмена/проблема.
- Анализ и простая модель скоринга: на основе историки посчитайте среднюю доходность по типам заказов/зон.
- Прототип-бот: Telegram/CLI-бот, который на входе получает список доступных заказов и ранжирует их по вашей формуле скоринга.
- Симуляция и бэктест: прогоняйте алгоритм по историческим данным и измеряйте ключевые метрики: доход/час, среднее время доставки, % отмен.
- Деплой и итерации: если стабильно лучше, оформите проект как портфолио.
Минимальная архитектура пет-проекта:
- Backend: Python + FastAPI
- БД: PostgreSQL (+ PostGIS по желанию)
- Routing: OSRM или простой haversine-ETA
- Queue: Redis (для очереди задач)
- Interface: Telegram bot / простая веб-панель
Пример кода для оценки списка заказов (упрощённо):
orders = [...] # список словарей с полями pay, eta_min, dist_km
scores = [(o, score(o, courier)) for o in orders]
best = sorted(scores, key=lambda x: x[1], reverse=True)[0]
Инструменты для использования: pandas (анализ), PostGIS (пространственные запросы), OSRM/GraphHopper (маршрутизация), и Python ML-стек для ETA. Полезные практические описания процессов разработки доставки — у компаний и агентств, например e-Legion и Datakrat.
Какие метрики считать при тестах?
- Доходы за час (₽/ч)
- Среднее время «от принятия до доставки»
- % своевременных доставок (время < обещанного)
- Количество успешных заказов/отказов
Если хотите интегрироваться с реальными сервисами, сначала изучите официальные интеграции и API (например, интеграции Poster/QuickResto с маркетплейсами), а не пытайтесь «взламывать» чужие закрытые интерфейсы.
Реверс-инжиниринг и этика
Можно ли реверс-инжинирить сервисы вроде Яндекс/Достависты/Ozon ради обучения? Технически — да, APK-файлы и сетевой трафик можно анализировать; но есть три важных оговорки:
- Правовая и договорная сторона: деактивация аккаунта, нарушение условий использования, возможные юридические риски.
- Приватность: нельзя копировать или использовать чужие персональные данные.
- Бизнес-этика: автоматические боты, использующие уязвимости, вредят рынку и могут привести к блокировке.
Безопасные и этичные альтернативы:
- Использовать открытые API или партнерские интеграции (см. QuickResto → Yandex.Eda integration).
- Создавать клоны/форки с собственной логикой и данными, использовать OpenStreetMap для карт и OSRM для маршрутизации.
- Изучать публичные исследования и open-source проекты по маршрутизации и оптимизации.
- Reverse-engineering внутри учебного контекста (анализ APK локально) допустим для личного изучения, но не для эксплуатации — соблюдайте законы и ToS.
План обучения 6–12 месяцев и литература
Реально ли перейти в сферу за 6–12 месяцев? Да, если вы сфокусированы и практикуетесь ежедневно. Ниже — примерный маршрут.
6-месячный интенсив (целевой путь: создать работающий пет-проект — бот для подбора заказов)
- Месяц 1: Python, Git, базы данных (SQL). Ресурс: бесплатные курсы по Python (пример — Netology Python).
- Месяц 2: Основы алгоритмов и структуры данных (списки, графы, BFS/DFS, Dijkstra).
- Месяц 3: Web/API (FastAPI), основы работы с картами, PostGIS вводно.
- Месяц 4: Простая модель ETA/скоринга, первые эксперименты с историческими данными.
- Месяц 5: Интеграция с routing (локальный OSRM) и реализация Telegram-бота.
- Месяц 6: Тестирование, симуляции, подготовка портфолио и публикация проекта.
12-месячный расширенный путь (глубже в ML/оптимизацию и мобильную разработку)
- Добавить курсы по ML/Time Series, OR-optimization (OR-Tools), разобраться с Docker/Kubernetes и CI/CD (см. обзоры стеков: WorkSolutions, SkillFactory).
- Параллельно: изучение Kotlin и основ Android, если вы хотите делать мобильные приложения для курьеров.
Книги и материалы (рекомендуемые):
- “Алгоритмы. Построение и анализ” — Cormen et al. (для общего понимания алгоритмов).
- “Python для анализа данных” — Wes McKinney (практика с pandas).
- Книги/курсы по операционным исследованиям/оптимизации (введение в LP/ILP).
- Практические статьи и кейсы по разработке приложений доставки — читать обзоры от агентств (e-Legion, Purrweb).
Советы для ускорения:
- Делайте маленькие итерации: один рабочий feature в неделю.
- Публикуйте код и бенчмарки (GitHub).
- Используйте реальные данные (собранные вами) для бэктестов.
Источники
- https://dev.go.yandex/services/eda
- https://rb.ru/stories/master-delivery/
- https://e-legion.ru/news/longreads/razrabotka-prilozheniya-dlya-dostavki-yedy
- https://joinposter.com/business/delivery
- https://www.purrweb.com/ru/blog/razrabotka-prilozheniya-dlya-dostavki/
- https://www.datakrat.ru/solutions/sistema-upravleniya-dostavkoy-produktsii-delivery
- https://quickresto.ru/support/rabota_s_bek_ofisom/delivery/yandex_eda_setup/
- https://worksolutions.ru/useful/saas-aktualnyj-tehnologicheskij-stek/
- https://blog.skillfactory.ru/chto-takoe-stek-razrabotki-i-kak-ego-vybrat/
- https://netology.ru/programs/pyfree-async
- https://www.lobanov-logist.ru/library/352/55059/
Заключение
Если ваша цель — улучшать подбор заказов и оптимизировать доставку курьером, начните с простого: логируйте свои заказы, проанализируйте доходность по зонам, сделайте прототип-бота на Python и протестируйте скоринг на исторических данных. Освоив базовые алгоритмы маршрутизации, SQL и инструменты гео (PostGIS/OSRM), вы сможете за 6–12 месяцев создать конкурентный пет-проект и претендовать на позиции джуниора/инженера по маршрутизации в командах, разрабатывающих приложения доставки. Укажите, если хотите — пришлю конкретный чек-лист по шагам разработки Telegram-бота/микросервиса и пример тестовой выборки для бэктестов.