Логотип HCXL Маршрут навигатора
При обсуждении задачи коммивояжера на примере рейса мусоровоза мы отмечали, что подобный тип задач – Travelling Salesman Problem - очень сложен для компьютеров и даже современным процессорам требуется обычно довольно много времени для процедуры оптимизации.
В то же время простейшие электронные навигаторы, которые явно не содержат мощные процессоры, легко и быстро прокладывают длинные маршруты.
Да, навигаторы не строят маршруты объезда списка заданных пунктов, а строят маршрут перемещения из одного места в другое, но связь между двумя задачами прокладывания маршрута очевидная!
Ведь ясно, что в навигаторе имеется список участков дорог в окрестностях заданных конечных пунктов и именно по ним прокладывается кратчайший маршрут.
Каким же образом навигаторы прокладывают маршрут?
Смоделируем работу навигатора и построим маршрут из Сухума в Элисту.
Политические аспекты данного маршрута оставим в стороне. Будем смотреть только на имеющиеся дороги, но не на их качество.

Карта между Элистой и Сухуми
На самом деле разница между типичной «задачей навигатора» и «задачей коммивояжера» есть:
не все населенные пункты между заданными местами нужно посетить.
Эта разница приводит к колоссальному упрощению задачи.
Вместо сложной для вычислений «задачи коммивояжера» получается обычная «задача о назначениях» со всеми ее преимуществами!

1

Организация данных для построения задачи. Таблица расстояний.

Чтобы не получилось излишне громоздко, не будем брать все населенные пункты из базы данных автомобильных дорог. Используем упрощенную схему.
Возможные пункты маршрута из Элисты в Сухум.
Для визуализации построенных маршрутов и расположения городов нам необходимы примерные координаты городов.
Координаты городов по маршруту Элиста-Сухум
По этим координатам построим диаграмму расположения городов:
Расположение городов Сухум и Элиста на схеме.
Теперь соберем все данные вместе и подготовим таблицу расстояний.
Таблица расстояний для задачи построения маршрута Элиста-Сухум
    Организауем данные в файле MS Excel.
  • Перенесем данные о расстояниях по имеющимся участкам дороги в таблицу.
    Таблица расстояний в файле MS Excel
  • Чтобы не думать о том, какое направление участка дороги нам нужно задавать, сделаем табличку симметричной относительно диагонали Сухум\Сухум – Элиста\Элиста.
    • Проще всего это сделать скопировав голубую область E6:V23 и вставив ее временно в любое свободное место с транспонированием. Панель вставки в MS Excel
    • Затем выделяем полученную копию, нажимаем CTRL+C, щелкаем ячейку E6 правой кнопкой мыши, выбираем Специальная вставка и в появившейся панели отмечаем Операция – Сложить.
      В этом случае при вставке скопированные ячейки складываются с имеющимися.
      Панель Специальная вставка в MS Excel
    • Так как в списке участков дороги ни один участок не дублируется (нет вариантов X-Y, а потом Y-X), то в изначальную таблицу просто добавятся все симметричные маршруты.
      По строке информации Excel внизу нетрудно проверить, что в таблице был 31 участок дороги, а после вставки их стало 62.
      Значит – все верно сделано, без ошибок.
      В результате получится такая таблица:
      Симметричная таблица расстояний в файле MS Excel
    Теперь в списке перечислены все допустимые прямые участки дорог между городами из списка (маршруты через какие-то из городов списка не учитываются), а там, где длина участка не указана, прямой дороги нет.
  • Формулы Excel обычно считают, что пустые ячейки содержат 0. Поэтому, полученный вариант таблицы содержит множество разрешенных маршрутов с нулевой длиной. В том числе и участок Сухум-Элиста. Однако, в нашей задаче пустые ячейки - это участки, где нет дорог. Значит в задаче пустая ячейка - это запрещенный участок.
    Чтобы не писать запретов в ограничениях удобно этим запрещенным участкам приписать аномально большую длину, чтобы при оптимизации алгоритм автоматически избегал включать их в полный маршрут, например, 10000 км.
    Проще всего выделить еще раз голубую область E6:V23, выбрать команду Главная – Найти и выделить - Заменить. Появится панель, в которой в окне Найти пустое место, указать в Заменить на 10000.
    Панель Найти и Заменить в MS Excel
    После этого сразу получим полностью заполненную таблицу расстояний
    Готовая таблица расстояний в файле MS Excel
  • В таблице намеренно ужата ширина столбцов, чтобы вместо чисел 10000 показывались знаки #.
    Условное форматирование подкрашивает ячейки, содержащие 10000 так, чтобы выделить расстояния реально существующих участков дорог.

2

Таблица переменных для задачи "Маршрут навигатора".

Для решения задачи нам необходима Таблица переменных, которая должна соответствовать по размеру таблице расстояний.
После решения задачи оптимизации в Таблице переменных цифрой 1 должны быть отмечены выбранные участки маршрута, а цифрой 0 – незадействованные участки.
Отметим, что столбец Сухум лишний среди столбцов городов, в которые мы планируем въехать, а строка Элиста - лишняя среди городов, из которых мы можем выехать.
Таблица переменных для задачи построения маршрута Элиста-Сухум
Таблицу переменных удобно размещать под таблицей расстояний.

Таблица переменных задачи маршрута навигатора в файле MS Excel Нам обязательно нужно сосчитать, сколько раз каждый город назначен для выезда (=СУММ(F28:V28)) и сколько раз для въезда (=СУММ(F28:F45)в ячейке F46).
Для контроля въездов-выездов запишем в ячейки строки F47:U47 формулу =ТРАНСП(W29:W44) (напомним, что это функция массива, так что ее нужно вводить сразу в весь диапазон ячеек F47:U47).
При правильном решении числа в строке F47:U47 должны равняться числам в строке F46:U46.
Необходимо проследить, чтобы в ячейках V46 и W28 получились 1 (маршрут вошел в Элисту и маршрут вышел из Сухума).

3

Установки OpenSolver для задачи "Маршрут навигатора". Решение.

Для удобства конечные пункты маршрута Элиста и Сухум расположены в начале и в конце таблицы переменных, но, вообще говоря, это не требуется.
В установках OpenSolver-Model можно просто для начального города потребовать, чтобы был только выезд, а для конечного – только въезд. А для остальных – чтобы был и въезд и выезд.
Но в этом случае понадобится написать больше ограничений, потому что диапазоны с одинаковыми требованиями разобьются на две части.
Установки OpenSolver-Model для решения задачи Маршрут Навигатора
Очень важно, что не требуется задавать целочисленные ограничения, так как в классической задаче о назначениях целые решения получаются автоматически при работе стандартного симплекс-метода оптимизации. Это очень сильно ускоряет расчет и делает его более надежным.
В итоге получаем следующий кратчайший маршрут длиной 902 км. Решение задачи: Маршрут Сухум - Элиста, длина 902 км
На карте он будет выглядеть так:
Маршрут Сухум - Элиста, длина 902 км

4

Модификация задачи "Маршрут навигатора".

Обычные требования на заход в какие-то определенные города реализуются очень легко. Нужно добавить ограничение, что число выездов или въездов в данный город равно 1.
Например, требование на заход в город Минеральные Воды реализуется добавлением в установки OpenSolver-Model условия W37=1.
Оптимальный маршрут при этом удлиняется до 1007 км и проходит через Кутаиси.
Маршрут Сухум - Элиста, длина 1007 км
Если, напротив, в какой-то город заходить не следует, например, в Армавир, то в установки OpenSolver-Model добавляем условие W29=0.
Получим новый маршрут протяженностью 923 км.
Маршрут Сухум - Элиста, длина 923 км
Последние пару лет снова активно обсуждается проект восстановления старой Военно-Сухумской дороги, которая соединяла Черкесск и Сухум напрямую через горный хребет. При этом длина дороги должна составить примерно 335 км.
Добавим в таблицу расстояний участки Черкесск-Сухум и Сухум-Черкесск для симметрии с длиной 335 км.
Таблица расстояний для задачи построения маршрута Элиста-Сухум с участком Сухум-Черкесск Запустим OpenSolver и получим новый маршрут длиной 720 км. Таким образом, маршрут через Черкесск станет лидирующим.
Маршрут Сухум - Элиста, длина 720 км
Скачать файл с задачей Скачать файл "03 route Sukhum-Elista.xlsx" (примерно 125 Кб)
Таким образом, имея доступные инструмент MS Excel и надстройку OpenSolver легко содать собственную модель построения маршрута между любыми точками. Задачи прокладывания маршрута несопоставимо проще, чем «задачи коммивояжера». Настолько, что их легко решают даже простенькие навигаторы.
✉ Если у вас появились вопросы или замечания, вы можете предложить лучшее решение, то пишите мне на электронную почту.