Смекни!
smekni.com

Решение задачи коммивояжера методом ветвей и границ (стр. 1 из 3)

Расчетно-графическая работа

по теории алгоритмов

На тему

«Решение задачи коммивояжера методом ветвей и границ»


План

1. Вступление

2. Постановка задачи

3. Математическая модель задачи коммивояжера

4. Алгоритм решения

5. Выводы

6. Список использованной литературы


1. Вступление

В 1859 г. Сэр Вильям Гамильтон, знаменитый математик, давший миру теорию комплексного числа и кватерниона, предложил детскую головоломку, в которой предлагалось совершить «круговое путешествие» по 20 городам, расположенных в различных частях земного шара. Каждый город соединялся дорогами с тремя соседними так, что дорожная сеть образовывала 30 ребер додекаэдра, в вершинах которого находились города a, b, … t. Обязательным условием являлось требование: каждый город за исключением первого можно посетить один раз.

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


2. Постановка задачи

Рассмотрим задачу о коммивояжере.

Имеются n городов, расстояния (стоимость проезда, расход горючего на дорогу и т.д.) между которыми известны. Коммивояжер должен пройти все n городов по одному разу, вернувшись в тот город, с которого начал. Требуется найти такой маршрут движения, при котором суммарное пройденное расстояние (стоимость проезда и т.д.) будет минимальным.

Очевидно, что задача коммивояжера – это задача отыскания кратчайшего гамильтонова цикла в полном графе.

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

. Таким образом, решение задачи коммивояжера методом полного перебора оказывается практически неосуществимым, даже при достаточно небольших n.

Решить задачу коммивояжера также можно с помощью алгоритма Крускала и «деревянного» алгоритма. Эти методы ускоряют разработку алгоритма по сравнению с методом полного перебора, однако не всегда дают оптимальное решение.

Существует метод решения задачи коммивояжера, который дает оптимальное решение. Этот метод называется методом ветвей и границ. Решение задачи коммивояжера методом ветвей и границ по-другому называют алгоритмом Литтла.

Если считать города вершинами графа, а коммуникации (i,j) – его дугами, то требование нахождения минимального пути, проходящего один и только один раз через каждый город, и возвращения обратно, можно рассматривать как нахождение на графе гамильтонова контура минимальной длины.

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

Определение нижних границ базируется на том утверждении, что если ко всем элементам i-й строки или j-го столбца матрицы C прибавить или отнять число

, то задача останется эквивалентной прежней, то есть оптимальность маршрута коммивояжера не изменится, а длина любого гамильтонова контура изменится на данную величину
.

Опишем алгоритм Литтла для нахождения минимального гамильтонова контура для графа с n вершинами. Граф представляют в виде матрицы его дуг. Если между вершинами Xi и Xj нет дуги, то ставится символ «∞».

Алгоритм Литтла для решения задачи коммивояжера можно сформулировать в виде следующих правил:

1. Находим в каждой строке матрицы

минимальный элемент
и вычитаем его из всех элементов соответствующей строки. Получим матрицу, приведенную по строкам, с элементами

2. Если в матрице

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

каждая строка и столбец, которой содержит хотя бы один нуль. Такая матрица называется приведенной по строкам и столбцам.

3. Суммируем элементы

и
, получим константу приведения

которая будет нижней границей множества всех допустимых гамильтоновых контуров, то есть

4. Находим степени нулей для приведенной по строкам и столбцам матрицы. Для этого мысленно нули в матице заменяем на знак «∞» и находим сумму минимальных элементов строки и столбца, соответствующих этому нулю. Записываем ее в правом верхнем углу клетки

5. Выбираем дугу

, для которой степень нулевого элемента достигает максимального значения

6. Разбиваем множество всех гамильтоновых контуров

на два подмножества
и
. Подмножество
гамильтоновых контуров содержит дугу
,
- ее не содержит. Для получения матрицы контуров
, включающих дугу
, вычеркиваем в матрице
строку
и столбец
. Чтобы не допустить образования негамильтонова контура, заменим симметричный элемент
на знак «∞».

7. Приводим матрицу гамильтоновых контуров

. Пусть
- константа ее приведения. Тогда нижняя граница множества
определится так

8. Находим множество гамильтоновых контуров

, не включающих дугу
. Исключение дуги
достигается заменой элемента
в матрице
на ∞.

9. Делаем приведение матрицы гамильтоновых контуров

. Пусть
- константа ее приведения. Нижняя граница множества
определится так

10. Сравниваем нижние границы подмножества гамильтоновых контуров

и
. Если
, то дальнейшему ветвлению в первую очередь подлежит множество
. Если же
, то разбиению подлежит множество
.