Pull to refresh
285.9
ГК ЛАНИТ
Ведущая многопрофильная группа ИТ-компаний в РФ

Как мы решали задачу оптимизации доставки грузов с использованием численных методов на примере метода имитации отжига

Level of difficultyMedium
Reading time7 min
Views3.5K

В статье хотим поделиться своим опытом реализации алгоритма решения задачи маршрутизации на основе метода имитации отжига в Norbit CDS – умной системе управления доставкой. 

Проанализировав материалы, можно обнаружить различные предлагаемые способы решения VRP-задач (Vehicle Routing Problem). Главная их цель – планирование маршрутов для транспортных средств оптимальным способом. Основными критериями, как всегда, остаются наикратчайший путь для транспортного средства и доставка услуг во все заданные точки. В рабочем месте логиста Norbit CDS задача не отличается. 

Создавая свой алгоритм оптимизации построения маршрутов доставки, мы исходили из следующих входных данных: количество транспортных средств, число заявок для распределения с учетом их габаритов и окон желаемого времени доставки. Для реализации был выбран метод отжига.

Иллюстрация сгенерирована ИИ c помощью сервиса ruDALL-E Kandinsky
Иллюстрация сгенерирована ИИ c помощью сервиса ruDALL-E Kandinsky

Метод имитации отжига

Метод отжига является одним из наиболее эффективных методов случайного поиска оптимального решения для различных задач, состоящих в нахождении такого состояния x, при котором достигается минимальное решение некоторой функции F(x). Основными понятиями метода имитации отжига являются:

x_0∈X,где X – множество всех состояний, а x_0начальное состояние;

t_k –  температура системы на k-ом шаге, соответственно t_0 – температура при начальном состоянии x_0;

T_k – функция изменения температуры;

g(x,t)– функция, вызывающая новое состояние;

h(F(x')-F(x), t) – функция вероятности принятия нового состояния x' ;

S∈X – состояние, при котором достигнуто лучшее решение.

Алгоритм метода заключается в следующем.

  1. Формируется начальное состояние x_0,S=x_0,x=x_0.

  2. k-я итерация алгоритма:

  • t_k=T_k;

  • x'=g(x,t_k);

  • если h(F(x')-F(x), t_k)>α, α ∈ [0,1), то S=x',x=x'.

Реализация метода имитации отжига в Norbit CDS

Обозначения

Рассмотрев основные понятия метода, перейдем к реализации метода имитации отжига в системе Norbit CDS.

Для более комфортного обсуждения введем некоторые понятия.

V=[v_1,..,v_N] – список транспортных средств для формирования маршрутов, где N– количество транспортных средств для решения задачи. 

R = [r_1,..,r_N]– список сформированных маршрутов, r_i ∈ v_i.

 D=[d_1,..,d_M] – список заявок на доставку, гдеM– количество заявок на доставку, которые необходимо распределить по маршрутамR. У каждой  d_i имеются такие атрибуты, как вес, ожидаемое время доставки (рассчитывается в зависимости от других заявок в маршруте), окно доставки, указанное клиентом.

T_{finish}– значение температуры, при котором завершается алгоритм поиска лучшего решения.

C_{max} – максимальное количество доставок в одном маршруте.

DeliveryInfoMatrix – матрица M×M, содержащая информацию о дальности расположения точек заявок на доставку друг от друга. 

Для формирования матрицы используется проект OSRM API, написанный на C++ c открытым исходным кодом и позволяющий строить наикратчайшие пути между точками на карте. Для наших нужд был использован Route Service, предоставляющий ответ в виде объекта Route, который содержит в себе расстояние пути в метрах и время в секундах для данного пути. 

Стоит обратить внимание, что время указывается среднее, так как в OSRM API отсутствуют данные о прогнозах пробок. На рисунке 1 представлен наглядный вид формируемой матрицы. Для каждого пересечения указаны два значения – расстояние в метрах и необходимое время в секундах, чтобы добраться из одной точки доставки в другую.

Рисунок 1. Пример матрицы доставки
Рисунок 1. Пример матрицы доставки

 KPI_{du}(x)– критерий оптимизации, отвечающий за величину опозданий при доставках заявок по всем сформированным маршрутам в состоянии x

 KPI_{dist}(x)– критерий оптимизации, отвечающий за общее значение метража всех маршрутов в состоянии x.

x_{best}– основное решение для оптимизации, то есть лучшее решение.

F(x)=KPI_{du}(x)+KPI_{dist}(x)– функция, для которой требуется найти состояние x, при котором она будет принимать наименьшее значение.

h(F(x')-F(x),t_k) = \frac{KPI_{dist}(x)^*t_k}{KPI_{dist}(x')^*t_0} – вероятность принятия нового состояния x'.

Алгоритм

Входными параметрами реализованного алгоритма являются: список транспортных средствV, список заявокD, начальная температураt_0, конечная температура T_{finish}и максимальное количество заявок в одном маршруте C_{max}. Перед запуском алгоритма рассчитывается матрица DeliveryInfoMatrix.

Следующим шагом идет формирование начального состоянияx_0. Транспортные средства получают заявки в порядке очередности. В цикле происходит заполнение маршрута заявками путем обнаружения самой ближней заявки по матрице DeliveryInfoMatrix к крайней добавленной точке заявки в маршрут. Для каждого маршрута отправной точкой является точка склада d_0.

При добавлении заявка проверяется – может ли она быть размещена в транспортном средстве. Учитываются следующие пункты: проходит ли по весу, превышает ли маршрут максимальное количество заявок C_{max}, а также фиксируется, что заявка не была добавлена в другие маршруты ранее. Как только первый маршрут укомплектован, начинает заполняться следующий.

При формированииx_0есть вероятность, что часть заявок не поместилась в транспортные средства и осталась незагруженной. Незагруженные заявки отправляются в списокD_{unload}.

Для каждого маршрута происходит подсчет параметра BeginDateTime – время, к которому водитель доставит первую заявку. Следом происходит подсчет приблизительного времени доставки для всех заявок в маршруте. После этого мы можем рассчитать критерии KPI_{dist}(x_0)и KPI_{du}(x_0) и записать начальное состояние x_0 как временное решение x и лучшее решение x_{best}.

Теперь рассмотрим алгоритм на k-ой итерации. Первым делом генерируется новое состояние решения x'c помощью функции g(x,t_k).

В состоянии x из каждого маршрута в случайном порядке выбирается и удаляется по одной заявке. Данная выборка перемешивается с ранее нераспределенными по маршрутам заявкам D_{unload}. Таким образом получаем список заявок, с которыми будем работать в текущей итерации. 

Каждую из заявок пытаемся распределить по маршрутам. Заявка помещается в первый попавшийся маршрут, подходящий под условия – проходит по весу и количеству заявок в маршруте. Заявка помещается в маршрут исходя из расчетов из какой точки уже существующих заявок быстрее будет до нее добраться. Так продолжается до момента пока все заявки не будут разгружены. По данному алгоритму первый подходящий маршрут не заполняется полностью заявками. Наполнение происходит постепенно в каждый из них. Пример наполнения представлен на рисунке 2.

Рисунок 2. Алгоритм заполнения маршрута заявками
Рисунок 2. Алгоритм заполнения маршрута заявками

После того, как все маршруты укомплектованы, получаем следующее состояние решения x'и обновляем список нераспределенных на текущей момент заявок D_{unload}. Для x' рассчитываем критерии KPI_{dist}(x') и KPI_{du}(x').

Следующим этапом решим, подходит ли x' в качестве x. Первым делом проверяем по критериям KPI_{dist}(x'), затем уже KPI_{du}(x'), чтобы определить является ли текущее состояние x'лучше наших x и x_{best} состояний решений. Если KPI_{du}(x')<KPI_{du}(x) или (KPI_{du}(x')=KPI_{du}(x) и KPI_{dist}(x')<KPI_{dist}(x)), то x'→x. Если KPI_{du}(x')<KPI_{du}(x_{best}) или (KPI_{du}(x')=KPI_{du}(x_{best}) иKPI_{dist}(x')<KPI_{dist}(x_{best})), то x'→x_{best}. Также есть вероятность, что состояние решения x', которое хуже по критериям KPI_{du}(x') и KPI_{dist}(x'), чем KPI_{du}(x) и KPI_{dist}(x) может всё равно стать следующим состоянием решения x для продолжения поиска оптимального варианта. 

Функция h(F(x')‑F(x),t_k) применяется для принятия решения перехода x'→x. Случайным образом определяется значение α∈ [0,1). Если h(F(x')-F(x),t_k)-α>0, то в случае, если таких состояний решений x'на k-тых итерациях было подряд меньше 50 раз, то так и быть x'→x. В случае, если давно не находилось состояния решения x' лучше x (а именно 50 итераций подряд), то x_{best}→x. Тем самым, мы повышаем шансы получить более выгодное состояние решения x'при следующей итерации, так как меняем x, от которого ищутся видоизменённые варианты новых состояний решений.

После определения состояния решения x по алгоритму метода отжига требуется перерасчет температуры t_k. Для пересчета температуры используется формула как в Больцмановском отжиге:

T_k=\frac{t_0}{ln(1+k)},k>0.

Так итерации будут выполняться до того момента, пока T_k>t_{finish}. В конце получаем лучшее состояние решенияx_{best}.

Чтобы повысить шансы по поиску самого оптимального состояния решения, данный алгоритм выполняется в двух параллельных потоках. После прогона из двух состояний решений выбирался вариант с лучшими показателями критериев KPI_{du} и KPI_{dist}.

После метод отжига применяется еще раз, но относительно маршрутов R, составленных в лучшем состоянии решенияx_{best}. В ходе самого маршрута r_i∈R, i∈[1,N] будут применяться перестановки точек заявок на доставку D маршрута r_i и, соответственно, лучшее решение посещения точек D закрепится за маршрутом r_i. На этом шаге мы получаем наше финальное для поставленной задачи состояние решенияx_{best}.

Результаты работы метода

Рассмотрим результаты работы алгоритма. Подадим на вход следующие данные: 18 заявок, расположенных следующим образом на рисунках 3, 4 транспортных средства, t_0=120, t_{finish}=10.

Рисунок 3. Расположение входящих заявок
Рисунок 3. Расположение входящих заявок

Алгоритм справился за 4 минуты 15 секунд, было сформировано 2 маршрута. На рисунках 4 и 5 представлены сформированные маршруты. Несмотря на то, что было задано большее число транспортных средств на входе, происходит проверка на их необходимое количество от объема и веса заявок на доставку. Так как по нашему алгоритму максимальное количество заявок на доставку в транспортном средстве 11, то машины рассчитываются исходя из формулы \frac{N}{11}, гдеN – количество возможных машин. Следом, если есть еще свободные транспортные средства, идет расчет по весу заявок, чтобы добавить дополнительно машину. Такой подход помогает избежать полупустых маршрутов. 

Рисунок 4. Маршрут №1
Рисунок 4. Маршрут №1
Рисунок 5. Маршрут №2
Рисунок 5. Маршрут №2

В маршрут №1 попали заявки, которые находятся почти по одному адресу и где алгоритм отрабатывает корректно, выстраивая посещение этих точек друг за другом (рисунок 6). Однако также присутствует пара заявок, которые не вошли ни в один сформированный маршрут.

Рисунок 6. Очередность посещения точек маршрута
Рисунок 6. Очередность посещения точек маршрута

Рассмотрим маршруты, сформированные на рисунке 7. Можно заметить, что точка под номером 1 (рисунок 7a) и точка под номером 2 (рисунок 7б) находятся в одной и той же области доставки. Следовательно, было бы логично послать в дальнюю область доставки не два транспортных средства, а одно. Данная ситуация появляется за счет того, что написанный алгоритм распределения заявок по маршрутам не учитывает глобальное состояние всех маршрутов, а рассматривает и улучшает только уже сформированный, внося в него с каждой итерацией минимальное случайное изменение. 

Рисунок 7
Рисунок 7

Также наполнение маршрута сильно зависит от начального состояния, которое состоит из полностью заполненных сформированных маршрутов и части маршрутов с парой заявок, не поместившихся в другие. Итого мы получаем следующую картину: на рисунке 8 представлено отображение созданных алгоритмом маршрутов, отсортированных по заполненности. Красный означает полную загрузку, а зеленый, что транспортное средство почти не загружено. Это обращает наше внимание на то, что распределение заявок по маршрутам неравномерно. Где-то очень много доставок, а где-то почти нет. 

cid:image003.png@01DA5853.6EC70EC0
Рисунок 8. Сортировка маршрутов по заполненности

Данная проблема также оказывает влияние на большой разброс заявок по карте, что видно на двух примерах формирования маршрутов. В алгоритме отсутствует возможность рассмотрения заявок по области их месторасположения. А начальное состояние и последующие изменения в виде перестановки по одной заявке из маршрута в другие не приводит к желаемому результату.

Заключение

Таким образом, на основе метода имитации отжига был сформирован один из алгоритмов автоматического планирования маршрутов, который является частью программного решения Norbit CDS, разработанного компанией НОРБИТ. В ходе анализа его работы можно заключить, что требуется доработка алгоритма в будущем для лучшего распределения заявок. Также стоит отметить, что система Norbit CDS поддерживает множественность алгоритмов и даже алгоритмы заказчиков. В частности, присутствуют комбинаторные и генетические алгоритмы, которые дают не только лучшую сходимость, но и время выполнения, однако при этом хуже горизонтально параллелятся.

Tags:
Hubs:
Total votes 24: ↑24 and ↓0+24
Comments3

Articles

Information

Website
lanit.ru
Registered
Founded
Employees
over 10,000 employees
Location
Россия
Representative
katjevl