сравнительный анализ методов решения задачи коммивояжера

advertisement
УДК 519.173
СРАВНИТЕЛЬНЫЙ АНАЛИЗ МЕТОДОВ РЕШЕНИЯ ЗАДАЧИ
КОММИВОЯЖЕРА ДЛЯ ВЫБОРА МАРШРУТА ПРОКЛАДКИ
КАБЕЛЯ СЕТИ КОЛЬЦЕВОЙ АРХИТЕКТУРЫ
Гараба И.В., студент
кафедра «Система обработки информации и управление»
Россия, 105005, г. Москва, МГТУ им. Н.Э. Баумана
Научный руководитель: Постников В.М..,к.т.н., доцент
Россия, 105005, г. Москва, МГТУ им. Н.Э. Баумана
chernen@bmstu.ru
Задача коммивояжера заключается в отыскании самого выгодного маршрута,
проходящего через указанные города хотя бы по одному разу с последующим возвратом в
исходный город. Поскольку коммивояжер в каждом из городов встает перед выбором
следующего города из тех, что он еще не посетил, всего существует (n - 1)! маршрутов.
Таким образом, размер пространства поиска зависит экспоненциально от количества
городов. Задача коммивояжера NP-эквивалентна.
Для решения задачи коммивояжера были реализованы и исследованы следующие
алгоритмы: генетический, Прима-Эйлера, Литтла, «иди в ближний». Целью работы
является отбор наиболее эффективных, приближенных алгоритмов решения задачи
коммивояжера, программная реализация и сравнительный анализ, рекомендации для их
практического использования.
На основе анализа работ: Окулов С. «Программирование в алгоритмах», М. Тим
Джонс, «Программирование искусственного интеллекта в приложениях», М. О. Асанов, В.
А. Баранский, В. В. Расин, «Дискретная математика. Графы, матроиды, алгоритмы»,
Букреев К. «Genetic Algorithms and the Traveling Salesman Problem»
были отобраны
приближенные алгоритмы решения задачи коммивояжера, которые находят широкое
применение в практике решения инженерных задач. К этим алгоритмам относятся:
генетический, метод имитации отжига, Прима-Эйлера, Литтла, «иди в ближний».
Программная
реализация
этих
алгоритмов
была
осуществлена
на
языке
Python(Питон). Python(Питон) — высокоуровневый язык программирования общего
назначения, ориентированный на повышение производительности разработчика и
http://sntbul.bmstu.ru/doc/636966.html
читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная
библиотека включает большой объём полезных функций.
Программа была написана на Python 2.7, данная версия Python была выбрана из-за
совместимости с основными математическими библиотеками. В качестве СУБД для
работы с сохраненными данными была выбрана MySQL 5.5. Приложение можно
запустить на любой ОС на которую можно поставить интерпретатор языка Python 2.7 и
MySQL 5.5 (Windows, Mac OS X, Linux). Для работы с матрицами была использована
библиотека Numpy, большая часть которой написана на c/fortran. Данная библиотека не
только упрощает разработку, за счет удобного интерфейса, но и увеличивает скорость
работы при выполнении операции над матрицами.
Программный продукт предназначен для сбора статистики и представляет собой
набор модулей (библиотек) и клиентский код, который его использует. Библиотеки
предоставляют API для задания параметров подключения к БД, настройки параметров и
количества генерируемых графов, выбора используемых алгоритмов и их параметров.
Информация о ходе вычислений и ошибки, возникающие в процессе работы будут
выводиться в консоль (терминал).
Особенности реализации алгоритмов.
Генетический алгоритм - это эвристический алгоритм поиска, используемый для
решения
задач
оптимизации
и
моделирования
путём
случайного
подбора,
комбинирования и вариации искомых параметров с использованием механизмов,
напоминающих биологическую эволюцию. Основные шаги генетического алгоритма
представлены на рис.1.
Молодежный научно-технический вестник ФС77-51038
Рис. 1. Генетический алгоритм
В данной реализации каждая особь представляет собой маршрут и содержит набор
неповторяющихся генов, где ген соответствует узлу сети. Качественная характеристика
особи - суммарный вес расстояний между узлами сети, т.е. длина пути от начальной до
конечной вершины. Начальное поколение создается случайным образом, каждое
дальнейшее поколение получается из предыдущего путем применения операций селекции,
скрещивания и мутации. Для скрещивания выбираются «лучшие» особи, «лучшая» особь
– особь, представляющая собой наиболее короткий маршрут. Мутация меняет местами
гены в случайно выбранной особи. Каждое поколение имеет фиксированный размер.
Применение операций скрещивания и мутации осложняется тем, что маршрут
коммивояжера состоит из неповторяющихся узлов. В качестве операции скрещивания
используется так называемое «жадное» скрещивание (Greedy Crossover), а в результате
мутации гены особи меняются местами. Особенностью жадного скрещивания является то,
что из родительских особей передаются те гены (узлы), которых еще нет в дочерней особи
и между которыми наименьшие веса. В том случае, если таких генов нет, в дочернюю
особь, случайным образом, добавляется ген, которого еще не было.
Выбор особей для скрещивания:
http://sntbul.bmstu.ru/doc/636966.html
1. Скрещиваются только лучшие особи.
2. Выбор особей для скрещивания с помощью рулетки. При использовании
рулетки, каждой особи ставится в соответствие сектор рулетки, размер
которого
обратно
пропорционален
стоимости
данной
особи
(длине
маршрута), особи для скрещивания отбираются в результате n “запусков”
рулетки.
3. Выбор особей с помощью турнирного метода отбора. При турнирном отборе
из популяции, содержащей N особей, выбираются случайным образом t (в
данной работе t=2) особей, и лучшая из них особь записывается в
промежуточный массив. Эта операция повторяется M раз. Особи в
полученном промежуточном массиве затем используются для скрещивания
(также случайным образом).
Метод имитации отжига или симуляция восстановления (Simulated annealing). Как
ясно из названия, метод поиска моделирует процесс восстановления. Восстановление - это
физический процесс, который заключается в нагреве и последующем контролируемом
охлаждении субстанции. В результате получается прочная кристаллическая структура,
которая
отличается
от
структуры
с
дефектами,
образующейся
при
быстром
беспорядочном охлаждении. Структура здесь представляет собой кодированное решение,
а температура используется для того, чтобы указать, как и когда будут приниматься новые
решения.
Алгоритм метода имитации отжига:
1. Создание начального случайного решения. Начальное решение помечается
как
текущее.
Инициализация
начального
значения
температуры
и
коэффициента охлаждения.
2. Оценка текущего решения.
3. Если температура опустилась до заданного предела, то алгоритм завершается
и текущее решение становится результатом его работы. Иначе - создание
«рабочего» решения путем копирования и случайного изменения текущего.
4. Оценка «рабочего» решения.
5. Сравнение текущего и «рабочего» решения. Если «рабочее» решение лучше
текущего, то оно становится рабочим. Уменьшение температуры, переход к 3
шагу алгоритма. Если текущее решение лучше «рабочего», то вероятность
того, что «рабочее решение» станет текущим определяется по формуле
ܲ ൌ ‡š’ሺെ
ఋா
்
ሻ, где ߜ‫ – ܧ‬разница между стоимостями «рабочего» и текущего
Молодежный научно-технический вестник ФС77-51038
решения, ܶ – текущая температура. Уменьшение температуры, переход к 3
шагу алгоритма.
Алгоритм
Прима-Эйлера
(включает
последовательное использование двух
алгоритмов: алгоритм Прима – на первом этапе и алгоритм Эйлера-на втором этапе).
Алгоритм Прима.
Построение начинается с дерева, включающего в себя одну (произвольную)
вершину. В течение работы алгоритма дерево разрастается, пока не охватит все вершины
исходного графа. На каждом шаге алгоритма к текущему дереву присоединяется самое
лёгкое из рёбер, соединяющих вершину из построенного дерева, и вершину не из дерева.
Шаги алгоритма Прима изображены на рис. 2.
Рис. 2. Алгоритм Прима
Алгоритм Эйлера:
1. Строится каркас минимального веса (алгоритмы Прима)
2. Путем дублирования каждого ребра каркас преобразуется в эйлеров граф.
3. Находим в построенном графе эйлеров цикл (проходящий по всем
рёбрам графа и при том только по одному разу).
4. Эйлеров цикл преобразуем в гамильтонов цикл (или маршрут коммивояжера,
содержащий каждую вершину графа ровно один раз). Метод преобразования:
последовательность вершин эйлерова цикла сокращается так, чтобы каждая
вершина графа в получившемся цикле встречалась ровно один раз.
Алгоритм Эйлера представлен на рис. 3.
http://sntbul.bmstu.ru/doc/636966.html
Рис. 3. Алгоритм Эйлера
Алгоритм Литтла. Процесс построения маршрута коммивояжера представляется в
виде построения двоичного корневого дерева решений, в котором каждой вершине x
соответствует некоторое подмножество M (x) множества всех маршрутов коммивояжера.
Считается, что корню дерева решений поставлено в соответствие множество всех
маршрутов коммивояжера.
Правило ветвления.
Пусть x – некоторая вершина дерева. Выберем дугу vw , которая входит ходя бы в
один маршрут из M (x) . Тогда множество M (x) разбивается на два непересекающихся
подмножества, в одно из которых можно отнести все маршруты, содержащие дугу vw , а в
другое – не содержащие ее. Будем считать, что первое из этих подмножеств соответствует
левому сыну вершины x , а второе – правому. Вершина дерева, для которой строятся
сыновья называется активной (вершина, для которой построены оба сына, активной стать
в дальнейшем не может). Пример такого дерева представлен на рис. 5.
Главное достоинство метода Литтла по сравнению с полным перебором заключается
в том, что активными объявляются лишь те вершины, в которых может содержаться
оптимальный маршрут. Для этого существует правило активизации вершин, которое
сводится к правилу подсчета границ.
Если для вершин дерева решений вычислено значение f (x) такое, что вес любого
маршрута из множества значений M (x) не меньше чем f (x) , то такое число f (x)
называется нижней границей маршрутов множества M (x) . Правило активизации вершин
заключается в том, что из множества вершин, не имеющих сыновей, в качестве активной
выбирается вершина с наименьшей нижней границей. Вершина, для которой построены
оба сына активной стать не может.
Процесс построения дерева решений продолжается до тех пор, пока активной не
будет объявлена вершина x , для которой множество M (x) состоит из одного-
Молодежный научно-технический вестник ФС77-51038
единственного маршрута, а границы всех других вершин не меньше чем вес этого
маршрута. Понятно, что тогда маршрут, содержащийся в M (x) , является оптимальным.
Редукция строки (столбца) – процедура вычитания из каждого элемента строки
(столбца) минимального элемента этой же строки (столбца).
Правила вычисления нижних границ.
Лемма 1
P – маршрут коммивояжера в сети G , c(P) (соответственно d (P) ) – вес этого
маршрута, определяемый матрицей весов сети G (редуцированной матрицей). f – сумма
всех
констант,
используемых
при
редукции.
Тогда c( P) = d ( P) + f
.
Так
как
редуцированная матрица содержит только неотрицательные элементы, то d ( P) ³ 0 .
Следовательно, c( P) ³ f .
Лемма 2
Пусть вершина x является сыном вершины y в дереве решений, f ( y) – нижняя
граница вершины y и f – сумма всех констант, используемых при редукции матрицы,
соответствующей вершине x . Тогда равенство f ( x) = f ( y) + f задает нижнюю границу
f (x) вершины x . Одна итерация алгоритма Литтла представлена на рис. 4.
http://sntbul.bmstu.ru/doc/636966.html
Рис. 4. Итерация алгоритма Литтла
Рис. 5. Дерево решений в алгоритме Литтла
Алгоритм «иди в ближний». Является наиболее простым в реализации.
Алгоритм:
1. Выбор стартовой вершины. Стартовая вершина объявляется текущей.
2. Текущая вершина добавляется в результирующий путь.
3. Нахождение вершины, вес дуги между которой и текущей минимален, при
условии, что результирующий путь еще не содержит эту вершину.
4. Найденная вершина становится текущей.
5. 2 – 4 повторяется, пока результирующий путь не будет содержать все
вершины
Модификация алгоритма «иди в ближний». Алгоритм имеет n-итераций, где n –
количество вершин. Для каждой вершины выполняется метод «иди в ближний» (вершина
считается стартовой). Полученный набор маршрутов преобразуется в маршруты с
необходимой нам стартовой вершиной (например, 1). Пример, пусть имеется граф из 4
вершин, для каждой вершины получаем кратчайший маршрут. Для 1 – 1-2-3-4, 2 – 2-1-4-3,
3 – 3-2-4-1, 4 – 4-3-2-1. Далее преобразовываем пути, чтобы стартовой вершиной была
вершина номер 1:
1-2-3-4-1, 1-4-3-2-1, 1-3-2-4-1, 1-4-3-2-1
Молодежный научно-технический вестник ФС77-51038
Из получившихся маршрутов выбираем кратчайший.
Сравнительный анализ алгоритмов
Необходимо определить как ведут себя алгоритмы на различном количестве вершин
и какие изменения можно внести для улучшения алгоритмов. Для каждого количества
вершин, от 5 до 40, генерировалось 20 различных графов (таблиц весов), на каждом графе
(таблице) алгоритмы находили кратчайшие пути маршрута коммивояжера, из полученных
результатов брался средний. Средний результат алгоритма на выбранном количестве
вершин, был выбран величиной, характеризующей алгоритм.
Сравнение генетических алгоритмов.
Рис. 6. Генетические алгоритмы
Худшие результаты показал генетический алгоритм использующий для селекции
только лучшие особи (результаты работы генетических алгоритмов представлены на рис.
6). Такой подход обеспечивает более быструю сходимость алгоритма, однако, с ростом
числа узлов быстрая сходимость может превратиться в преждевременную сходимость к
квазиоптимальному решению. Этот недостаток в некоторой степени компенсирован
использованием других методов отбора – с использованием рулетки и турнира, варианты
генетического алгоритма, использующие для скрещивания особей, выбранных этими
методами,
показали
очень
близкие
http://sntbul.bmstu.ru/doc/636966.html
результаты.
Алгоритм,
использующий
для
скрещивания только лучшие особи, оказался в среднем на 22% хуже двух других версий
алгоритма. Для сравнения с другими алгоритмами будем использовать лучшие реализации
генетического алгоритма – использующего рулетку или использующего турнир.
Сравнение алгоритмов «иди в ближний».
Рис. 7. Алгоритмы «иди в ближний».
Простая реализация алгоритма «иди в ближний», использующая для поиска только
одну стартовую вершину, окалазась в среднем на 37% хуже релизации, использующей в
качестве стартовой, все вершины поочередно (результаты работы алгоритмов изображены
на рис. 7). Для сравнения с другими алгоритмами будем использовать реализацию,
использующую все вершины.
Сравнение результатов работы всех типов алгоритмов.
Молодежный научно-технический вестник ФС77-51038
Рис. 8. Результаты работы алгоритмов
Лучшие
результаты
показали
алгоритм
Литтла,
генетичекий
алгоритм
и
модификация алгоритма «иди в ближний» (результаты работы всех типов алгоритмов
представлены на рис. 8). На малом количестве веришин (5-10), все алгоритмы, за
исключением алгоритма Прима-Эйлера, показывают приемлимые результаты. С ростом
количества вершин резко ухудшаются результаты алгоритма иммитации отжига и
алгоритма Прима-Эйлера, даже на среднем колчичестве вершин (10-20) эти алгоритмы
сильно проигрывают тройке лидирующих алгоритмов, поэтому исключим их из
дальнейшего рассмотрения и детально проанализируем алгоритмы показавшие лучшие
результаты (рис. 9):
http://sntbul.bmstu.ru/doc/636966.html
Рис. 9. Результаты работы алгоритмов с лучшими результатами.
Средняя разница с результатами работы алгоритма Литтла представлена в таблице:
Сравнение с алгоритмом Литтла
5-10 вершин
«Иди в ближний» (из
10-20 вершин
20-40 вершин
16%
32%
56%
4%
12%
40%
всех)
Генетический (турнир)
Выполним линейный прогноз (представлен на рис. 10) результатов тройки лучших
алгоритмов для графов содержащих на 20 вершин больше и найдем скорость ухудшения
результатов.
Молодежный научно-технический вестник ФС77-51038
Рис. 10. Линейный прогноз
Уравнение тренда для модифицированной версии алгоритма «иди в ближний»:
‫ ݕ‬ൌ ͵ͲǤͻͺ͹‫ ݔ‬൅ ͳͷͺͺǡ͸Ǣ ‫ݕ‬Ʈ ൌ ͵ͲǤͻͺ͹
Уравнение тренда для генетического алгоритма с турнирным методом отбора:
‫ ݕ‬ൌ ͵ͲǤ͸ͺͺ‫ ݔ‬൅ ͳ͵Ͷͳǡ͸Ǣ ‫ݕ‬Ʈ ൌ ͵ͲǤ͸ͺͺ
Уравнение тренда для алгоритма Литтла:
Прогноз показывает:
‫ ݕ‬ൌ ͵ǤͳͶͺʹ‫ ݔ‬൅ ͳͷͶͻǡͻǢ ‫ݕ‬Ʈ ൌ ͵ǤͳͶͺʹ
1. При большом количестве вершин, для получения лучшего результата,
целесообразнее всего использовать алгоритм Литтла.
2. Результаты модифицированного алгоритма «Иди в ближний» и генетического
алгоритма (турнирный метод отбора) с ростом числа вершин ухудшаются
примерно с одной скоростью, ухудшение результатов алгоритма Литтла
происходит приблизительно в 10 раз медленнее.
http://sntbul.bmstu.ru/doc/636966.html
3. Генетический алгоритм показывает лучшие результаты по сравнению с
модифицированным алгоритмом «Иди в ближний», при этом относительная
разница результатов постоянная величина.
Выводы
1. При реализации генетического алгоритма использовались три метода отбора
особей для скрещивания: выбор только лучших особей, с использованием рулетки
и турнирный метод. Версии алгоритма с использованием рулетки и турнирного
метода показали очень близкие результаты, и в среднем оказались лучше
реализации, использующей выбор для селекции только лучших особей, на 22%.
Лучшие реализации генетического алгоритма показали второй результат при
сравнении всех алгоритмов.
2. Лучший результат показал алгоритм Литтла. При малом количестве вершин (до 10)
он входит в число лучших, а при дальнейшем увеличении количества вершин
выходит на первое место, но требует больше вычислительных ресурсов, чем другие
алгоритмы.
3. Алгоритм имитации отжига рекомендуется использовать только при малом
количестве вершин (до 10), где он показывает приемлемые результаты. Алгоритм
прост в реализации и не требует больших вычислительных мощностей.
4. Алгоритм Прима-Эйлера показал худшие результаты при любом количестве
вершин, поэтому использовать его на практике не рекомендуется.
5. Модификация метода «иди в ближний» оказалась в среднем на 37% лучше версии
«иди в ближний», но при этом выполняется в n-раз дольше, где n-число вершин в
графе.
6. Если необходимо получить решение близкое к оптимальному и вычислительные
мощности не ограничены, то целесообразно использовать алгоритм Литтла. Если
вычислительные мощности ограничены и оптимальность решения не очень
критична, то рекомендуется использовать генетический алгоритм с методом
отбора, основанным на рулетке или турнире или модифицированную версию
алгоритма «иди в ближний»
7. Результаты модифицированного алгоритма «Иди в ближний» и генетического
алгоритма (турнирный метод отбора) с ростом числа вершин ухудшаются
примерно с одной скоростью, а ухудшение результатов алгоритма Литтла
происходит приблизительно в 10 раз медленнее.
Молодежный научно-технический вестник ФС77-51038
Список литературы
1. Окулов С. Программирование в алгоритмах. -М.:Бином. Лаборатория знаний, 2007.
384 с.
2. М. О. Асанов, В. А. Баранский, В. В. Расин, Дискретная математика. Графы,
матроиды, алгоритмы. -М.:Лань, 2010. 368 с.
3. Белоусов А. И., Ткачев С. Б. Дискретная математика. Серия: Математика в
техническом университете. Изд-во: МГТУ им. Н. Э. Баумана, 2001. 744 с.
4. Новиков
Ф.А. Дискретная
математика
для
программистов. —
2-е
изд. —
СПб.: Питер, 2005. 364 с.
5. Р. Хаггарти, Дискретная математика для программистов. -М.:Техносфера, 2012. 400
с.
6. М. Тим Джонс., Программирование искусственного интеллекта в приложениях. –
М.: ДМК Пресс, 2006. 312 с.
7. Букреев К. Genetic Algorithms and the Traveling Salesman Problem//CodeProject – For
those
who
code.2001.URL.http://www.codeproject.com/Articles/1403/Genetic-
Algorithms-and-the-Traveling-Salesman-Prob (дата обращения: 07.02.2013).
http://sntbul.bmstu.ru/doc/636966.html
Download