AI Last Mile Delivery Optimization System Development

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
AI Last Mile Delivery Optimization System Development
Medium
~1-2 weeks
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    822

Разработка AI-системы оптимизации последней мили доставки Last Mile

Последняя миля — 28–53% от общей стоимости доставки при высоких затратах на единицу и низкой плотности заказов. AI оптимизирует маршруты с учётом реальных условий: пробки, парковки, пропускные пункты, предпочтения получателей.

Специфика задачи последней мили

В отличие от дальнемагистральной логистики, здесь:

  • Сотни точек доставки в день на курьера
  • Узкие временные окна у получателей (10:00–14:00)
  • Первичная неудача доставки = 40–60% от стоимости первого визита
  • Городская среда: нет парковки, односторонние улицы, шлагбаумы

Ключевые задачи:

  1. Построение оптимальных маршрутов для 30–150 остановок
  2. Прогноз вероятности успешной доставки с первого раза
  3. Динамическое перепланирование при сбоях
  4. Оптимальный выбор канала (курьер / постамат / пункт выдачи)

Прогноз успешности доставки

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, динамическим перепланированием и мобильным приложением курьера.