Разработка AI-системы оптимизации последней мили доставки Last Mile
Последняя миля — 28–53% от общей стоимости доставки при высоких затратах на единицу и низкой плотности заказов. AI оптимизирует маршруты с учётом реальных условий: пробки, парковки, пропускные пункты, предпочтения получателей.
Специфика задачи последней мили
В отличие от дальнемагистральной логистики, здесь:
- Сотни точек доставки в день на курьера
- Узкие временные окна у получателей (10:00–14:00)
- Первичная неудача доставки = 40–60% от стоимости первого визита
- Городская среда: нет парковки, односторонние улицы, шлагбаумы
Ключевые задачи:
- Построение оптимальных маршрутов для 30–150 остановок
- Прогноз вероятности успешной доставки с первого раза
- Динамическое перепланирование при сбоях
- Оптимальный выбор канала (курьер / постамат / пункт выдачи)
Прогноз успешности доставки
ML-модель предсказывает вероятность успешной доставки до начала рейса:
Признаки:
- История получателя: % успешных доставок, предпочтительные временные окна
- Тип адреса: бизнес-центр, жилой дом, промзона
- День недели / время / погода
- Тип товара (требует подписи, габаритный, хрупкий)
- Способ оплаты (наложенный платёж = выше отказ)
Если P(успех) < 0.6 → система предлагает:
- Отправить SMS за 1 час с уточнением удобного окна
- Предложить ближайший постамат
- Объединить с другой доставкой в этот адрес
Экономический эффект: снижение failed first delivery с 15–25% до 8–12% = экономия на повторных рейсах.
Динамическая маршрутизация
import requests
from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp
import numpy as np
class LastMileOptimizer:
def __init__(self, osrm_url="http://router.project-osrm.org"):
self.osrm_url = osrm_url
def get_travel_times(self, locations):
"""Матрица времён через OSRM table service"""
coords = ";".join(f"{lon},{lat}" for lat, lon in locations)
url = f"{self.osrm_url}/table/v1/driving/{coords}"
r = requests.get(url, params={"annotations": "duration"})
return np.array(r.json()["durations"])
def reoptimize_on_event(self, current_routes, new_event):
"""
new_event: {'type': 'failed_delivery'|'new_order'|'traffic',
'location_idx': int, 'details': dict}
"""
if new_event['type'] == 'failed_delivery':
# Убрать точку из маршрута, добавить в очередь на завтра
route = current_routes[new_event['courier_id']]
route.remove(new_event['location_idx'])
self.reschedule_failed(new_event['location_idx'])
elif new_event['type'] == 'new_order':
# Найти курьера с минимальным добавочным временем
best_courier, best_position = self._cheapest_insertion(
current_routes, new_event['location']
)
current_routes[best_courier].insert(best_position, new_event['location'])
return current_routes
def _cheapest_insertion(self, routes, new_location):
min_cost = float('inf')
best = (0, 0)
for courier_id, route in routes.items():
for pos in range(len(route)):
# Стоимость вставки = дополнительное время на детур
cost = self._insertion_cost(route, pos, new_location)
if cost < min_cost:
min_cost = cost
best = (courier_id, pos)
return best
Оптимизация точек выдачи
Выбор между курьерской доставкой и постаматом:
Модель предсказывает конверсию (согласие на постамат) по признакам:
- Расстояние до ближайшего постамата от адреса (< 500м = высокая конверсия)
- Тип товара (одежда = часто нужен примерочный возврат)
- Время заказа (поздний вечер = скорее всего нет дома днём)
Оптимизация сети постаматов: задача покрытия — максимальный % заказов в шаговой доступности при заданном бюджете на аренду. Решается через Set Cover Problem.
Экологические маршруты для электрокурьеров
Для e-bike / cargo-велосипедов / электрокиосков:
- Ограничение: автономность 60–120 км
- Bicycle routing (OpenCycleMap, OSM cycling layer)
- Пункты зарядки как обязательные остановки при <20% заряда
- Зоны Low Emission Zone: автоматический запрет дизельных машин
Метрики
| KPI | Benchmark | После AI |
|---|---|---|
| Failed first delivery | 18–25% | 8–12% |
| Остановок/курьер в день | 50–70 | 70–100 |
| Cost per delivery | 100% | 72–85% |
| Customer satisfaction (NPS) | +25 | +45 |
Срок разработки: 3–5 месяцев для системы с VRPTW, динамическим перепланированием и мобильным приложением курьера.







