Программирование

Алгоритмы доставки и подбор заказов для курьеров

Узнайте, какие алгоритмы, языки программирования и математические области используются в приложениях доставки, особенно для подбора заказов курьерам. Технологический стек, разработка систем, улучшения и план обучения за 6–12 месяцев.

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

Как опытный курьер, я хочу узнать, возможно ли внести улучшения в эти системы и как это реализовать. Кроме того, интересно, реально ли за 6–12 месяцев освоить программирование и перейти в эту сферу. С какой литературы начать изучение?

Для Android-приложений базой являются Java и Kotlin, но меня больше интересует прикладная математика. Хочу разработать бота для автоматического выбора самых выгодных и быстрых заказов. Возможно ли реверс-инжиниринг курьерских приложений для обучения, и как создать пет-проекты на основе открытых аналогов, например, форки от Достависты, Яндекса или Ozon?

В первую очередь хочу разобраться в приложениях для курьеров, таких как Яндекс.Еда или FlowWow, где система автоматически распределяет заказы и маршруты. Опционально — в приложениях, где курьер сам выбирает заказы, а затем углубиться в приложения для клиентов.

В приложениях для доставки курьером используются алгоритмы доставки (динамическая маршрутизация, батчинг и назначение заказов), языки Java/Kotlin для Android и Python/Go/Java на сервере, а математическая основа — теория графов, комбинаторная оптимизация и статистика. Подбор заказов реализуют через scoring/assignment (жадные алгоритмы, min-cost flow, online matching), сервисы строят как микросервисы с гео-БД и движками маршрутизации; как курьер вы можете собрать данные, прототипировать бота и за 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 и реального времени — повышает доходность.
  • Инкрементальная оптимизация в реальном времени

    • Система должна быстро реагировать на пинги курьеров: используется «локальный ремонт» маршрутов, когда перерасчёт охватывает соседние участки, а не всю систему.

Пример простого скоринга (формула и код для прототипа):

scorei=PiαETAiβDtoPickup,i+γHiscore_i = P_i - \alpha \cdot ETA_i - \beta \cdot D_{toPickup,i} + \gamma \cdot H_i

где P — оплата за заказ, ETA — оценка времени доставки, D — расстояние до точки забора, H — исторический коэффициент успешности.

Пример на Python:

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 выглядит так:

minki,jcijxijk\min \sum_{k}\sum_{i,j} c_{ij} x_{ij}^k

при ресурсных ограничениях (вместимость, временные окна aitibia_i \le t_i \le b_i, и пр.). Полный аппарат — линейное программирование, теория матриц, численные методы и статистика; для практики хватит базовых знаний линейной алгебры, теории вероятностей и оптимизации.

Полезные обзорные статьи о роли математики в логистике и применении алгоритмов можно найти в материалах по практике логистики и 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).

Как разрабатываются такие системы и команда разработчиков

Типичный цикл разработки:

  1. Выделяют MVP-функции: приём заказа, отображение заказа курьеру, подтверждение, статус-апдейты, простая логика подбора.
  2. Создают API и модель данных, настраивают карты и routing service.
  3. Добавляют наблюдаемость (logging/metrics), симуляторы для нагрузки и backtesting.
  4. Итерируют: вводят 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).

Практические улучшения: идеи для курьера и пет-проекты

Как опытный курьер вы имеете преимущество понимания «узких мест» — используйте это.

Шаги для начала:

  1. Сбор данных: заведите локальный журнал (CSV) с полями: время заказа, адреса, расстояния, оплата, ETA платформы, реальное время, отмена/проблема.
  2. Анализ и простая модель скоринга: на основе историки посчитайте среднюю доходность по типам заказов/зон.
  3. Прототип-бот: Telegram/CLI-бот, который на входе получает список доступных заказов и ранжирует их по вашей формуле скоринга.
  4. Симуляция и бэктест: прогоняйте алгоритм по историческим данным и измеряйте ключевые метрики: доход/час, среднее время доставки, % отмен.
  5. Деплой и итерации: если стабильно лучше, оформите проект как портфолио.

Минимальная архитектура пет-проекта:

  • Backend: Python + FastAPI
  • БД: PostgreSQL (+ PostGIS по желанию)
  • Routing: OSRM или простой haversine-ETA
  • Queue: Redis (для очереди задач)
  • Interface: Telegram bot / простая веб-панель

Пример кода для оценки списка заказов (упрощённо):

python
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-файлы и сетевой трафик можно анализировать; но есть три важных оговорки:

  1. Правовая и договорная сторона: деактивация аккаунта, нарушение условий использования, возможные юридические риски.
  2. Приватность: нельзя копировать или использовать чужие персональные данные.
  3. Бизнес-этика: автоматические боты, использующие уязвимости, вредят рынку и могут привести к блокировке.

Безопасные и этичные альтернативы:

  • Использовать открытые 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).
  • Используйте реальные данные (собранные вами) для бэктестов.

Источники

Заключение

Если ваша цель — улучшать подбор заказов и оптимизировать доставку курьером, начните с простого: логируйте свои заказы, проанализируйте доходность по зонам, сделайте прототип-бота на Python и протестируйте скоринг на исторических данных. Освоив базовые алгоритмы маршрутизации, SQL и инструменты гео (PostGIS/OSRM), вы сможете за 6–12 месяцев создать конкурентный пет-проект и претендовать на позиции джуниора/инженера по маршрутизации в командах, разрабатывающих приложения доставки. Укажите, если хотите — пришлю конкретный чек-лист по шагам разработки Telegram-бота/микросервиса и пример тестовой выборки для бэктестов.

Авторы
Проверено модерацией
Модерация