Team Lead Camp 2021: оптимизация доставок Сдэк

Событие Team Lead Camp 2021 проходило одновременно в формате хакатона и анти-конференции с 17 по 23 июля. Моя команда 666 дошла до финала и заняла второе место по треку от Сдека, одной из ведущих логистических и курьерских компаний СНГ.

Рейтинг команд по треку Сдэка

Задача

Помимо записанного ролика Сдэк сделал онлайн презентацию, в которой сформулировал главную идею как «оптимизация технической составляющей сроков доставок посылок для клиентов по популярным тарифам, на основе имеющихся данных». Компания также разделила задачу на три составляющие:

  • Ревью на уровне идей оптимизации существующего процесса
  • Реализуемость в текующую архитектуру
  • Алгоритмическая оптимизация

Анализ предоставленных данных

Сдэк прикрепил к презентации эксель файл исходных данных, описанных как:

Загрузив эти данные в Юпитер-ноутбук, мы первым делом обратили внимание на их отстутвие: только в 26 строчках присутсвовали все значения по 8 колонкам.

import pandas
df = pandas.read_excel('df.xlsx',skiprows=3).replace('Бердск, Новосибирская обл.', 'Бердск')
data = df[(df.iloc[:,2:]!=0).all(1)]
data.describe(percentiles=[.05, .5, .95])

Используя библиотеку для поиска координат по названию места, мы проанализорвали влияение расстояние на скорость доставки.

import pandas
import numpy as np
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent='myapplication')

def euclidian_distance(name:str):
    try:
        location = geolocator.geocode(name)
        result = numpy.sqrt((float(location.raw['lon']) - 37.6174943)**2 + (float(location.raw['lat'])-55.7504461)**2)
    except:
        result = numpy.nan
    return result

def manhattan_distance(name:str):
    try:
        location = geolocator.geocode(name)
        result = abs(float(location.raw['lon']) - 37.6174943) + abs(float(location.raw['lat'])-55.7504461)
    except:
        result = numpy.nan
    return result

def minkowski_distance(name: str, power:int):
    try:
        location = geolocator.geocode(name)
        result = (abs(float(location.raw['lon']) - 37.6174943)**(1/power) + abs(float(location.raw['lat'])-55.7504461)**(1/power))**power
    except:
        result = numpy.nan
    return result


data['euclidian_distance'] = data['Город(П.Накл)'].apply(lambda x: euclidian_distance(x))
data['manhattan_distance'] = data['Город(П.Накл)'].apply(lambda x: manhattan_distance(x))
data['minkowski_4_distance'] = data['Город(П.Накл)'].apply(lambda x: minkowski_distance(x, 4))
data_.corr()

Продуктовый подход к задаче

Андрей Погонин и Александр Бадьин, продукт-менеджеры нашей команды, обозначили проблему как низкая точность прогнозирования сроков доставки, из-за:

  • Отсутствия статистического анализа данных цепочек поставок;
  • Отсутствия данных по скорости прохождения посылки по некоторым этапам (первая миля);
  • Влияние человеческого фактора;
  • Сбоя транспортных цепочек и отсутствие инструментов корректировки цепочек доставки.

В то время как идея для решения обозначенной проблемы, — это прогнозирование сроков доставки товаров «на лету» на основании статистического анализа исторических данных по каждому этапу доставки посылки. Где движение каждой доставки состоит из последовательности “Шагов”, каждый из которых мы оцифровываем и используем для расчета ожидаемых сроков доставки “на лету”. В перспективе эти данные можно использовать для выявления узких мест и оптимизации текущих алгоритмов доставки, но это уже другая история.​

Цель и метрики

Для служб доставки высокий уровень прогноза сроков доставки особенно важен. Управление сроками доставки позволит повысить конкурентоспособность бизнеса и привлечь новых клиентов.​

Основная метрика (northstar metric) калькулятора сроков доставки: ​

  • Процент отклонения фактических сроков доставки от прогнозируемых​.

Проверочная метрика:​

  • Среднее фактическое время доставки, по сравнению с целевым (задается вручную).​

Дополнительные метрики:​

  • Процент времени “простоя” посылки (когда посылка находится в каком-то перевалочном пункте и ожидает дальнейших действий)​.
  • Среднеквадратичное отклонение фактических сроков доставки на каждом из этапов доставки/обработки​.
  • Средняя маржинальность доставки на каждом из этапов доставки/обработки.

Решение

Для определения маршрута и прогнозирования сроков доставки мы решили использовать две модели, которые образуют алгоритм-решение:​

  1. Модель 1 (предиктивно-регрессионная модель) – расчет ожидаемых сроков доставки по каждому из этапов на основе исторических данных.​
  2. Модель 2 (генетический алгоритм) – определения оптимального маршрута доставки исходя из возможных путей доставок из каждого этапа и расчета ожидаемых сроков доставки по каждому из этапов (Модель 1).

Для первой модели мы предложили использовать библиотеку от Microsoft interpret для принятия бизнес решений и продемонстрировали применение этой библиотеки на открытых данных бразильской ecommerce компании.

Важные переменные по открытым данным

Тогда как для второй модели, перебрав нейронные сети и алгоритм Dijkstra, остановились на генетическом аглоритме.

IT архитектура решения

Мы разделили архитектуру на 9 частей:

Если в общем, — это

  • Загрузка и обработка данных для тренировки алгоритма;
  • Сохранение модели расчета алгоритма для запуска через джаву;
  • Прогноз данных как внутри компании так и в онлайне для пользователя.

Как использовать результаты работы алгоритма?​

  1. Доведение прогнозных сроков доставки в промежуточные пункты до клиентов на сайте.​
    Ссылка на прототип
  2. Аргументы в сторону выбора способа доставки между РЦ (авто, Авиа, ЖД, отдельные направления) на основании статистических данных по скорости и отклонениям в доставке. Плюс расчет общих сроков и отклонения в случае наличия нескольких РЦ в цепочке поставки.​
  3. Определение даты забора груза из офисов CDEK на основании времени ожидания посылки в офисе и графика утилизации машин.​
  4. Определение прочих «слабых мест» на основании «простоя посылок» и/или стоимости прохождения этапа.

Дополнительные возможности для компании​

  • Оценка эффективности работы каждого из этапов в цепочке доставки​.
  • Поиск бутылочных горлышек.​
  • Сбор данных для внедрения алгоритмов автоматического формирования цепочек поставок на основании ML.

Ссылка на репозиторий: https://github.com/Pfed-prog/LeadCamp

Оставьте комментарий