
- •Практическое занятие №9 Пути и циклы Гамильтона. Алгоритм Литтла.
- •1. Основные теоретические сведения
- •1.1. Пути и циклы Гамильтона
- •1.2. Задача коммивояжера (развозчика продукции или бродячего торговца).
- •1.2.2. Математическая модель задачи.
- •1.2.3.Решение задачи коммивояжера методом ветвей и границ (алгоритм Литтла).
- •1.3.Алгоритм Литтла.
- •2. Пример решения практической задачи
- •3. Практическое задание
1.3.Алгоритм Литтла.
Пусть известна матрица весов некоторого орграфа, вершины которого занумеруем числами от 1 до :
,
где
– вес дуги, соединяющей вершины
и j, где
.
Символ
ставится для блокировки дуг графа,
которые явно не включаются в гамильтонов
цикл, т.е. в расчет не берутся дуги
и
.
Можно показать, что оптимальность
решения не меняется от прибавления
некоторого числа к строке или столбцу
матрицы .
Алгоритм Литтла разбивается на несколько шагов.
Шаг 1. Приведение исходной матрицы.
В каждом столбце и в каждой строке матрицы нужно получить хотя бы один нуль. Для этого, например, в первом столбце выбираем минимальный элемент и вычитаем его из всех элементов первого столбца. Аналогично поступаем с остальными столбцами. Если при этом в некоторых строках не появляются нули, то для них осуществляем ту же процедуру.
После этого вычисляем константу
приведения
– сумму минимальных элементов столбцов
и строк, которые вычитались. Получаем
приведенную матрицу
с константой приведения
.
Шаг 2. Определение степеней нулей.
Находим степени каждого нуля – сумму
минимальных элементов строки
и столбца
,
в которых стоит этот нуль, без учета
самого нуля. Нуль с максимальной степенью
определяет дугу
,
которая вероятнее всего войдет в
гамильтонов цикл. Например, если нуль
с максимальной степенью находится на
пересечении второй строки и третьего
столбца, то дуга
,
вероятнее всего, войдет в гамильтонов
цикл.
Шаг 3. Ветвление.
На самом деле, дуга, соответствующая максимальной степени нуля, может, как входить в гамильтонов цикл, так и не входить в него. Поэтому дальше нужно рассмотреть сразу два случая.
Первый случай. Возможно, дуга
вошла в гамильтонов цикл. Блокируем ее,
полагая
.
Строку
и столбец
вычеркиваем. Если требуется, приводим
полученную матрицу меньшего порядка
с константой приведения
.
Второй случай. Дуга
не вошла в гамильтонов цикл. Полагаем
.
Если требуется, приводим полученную
матрицу
с константой приведения
.
Если
,
то шаги 2, 3 повторяем с матрицей
.
Если
,
то шаги 2, 3 повторяем с матрицей
.
И так до тех пор, пока не дойдем до матрицы
второго порядка, содержащей два нуля:
,
где
и
– некоторые числа или
.
Эти нули соответствуют двум последним
дугам гамильтонова цикла:
,
.
При этом
.
Если
,
где
,
то задача решена. Если же для некоторого
получается
,
то всю процедуру следует провести с
матрицей
.
На последнем этапе получим новое значение
функции
:
.
Это значение сравниваем с
,
то есть новый процесс продолжается до
тех пор, пока новые
.
2. Пример решения практической задачи
Задача коммивояжера: Коммивояжер должен посетить пять городов, заезжая в каждый город по одному разу. Расстояние между городами следующие: между первым городом и вторым – 12 км, между первым и третьим – 25 км, между первым и четвертым – 16 км, между первым и пятым – 31 км, между вторым и третьим – 28 км, между вторым и четвертым – 35 км, между вторым и пятым – 22 км, между третьим и четвертым – 36 км, между третьим и пятым – 20 км, между четвертым и пятым – 19 км. Его маршрут должен минимизировать суммарную длину пройденного пути.
Решение. Сначала получим приведенный вид данной матрицы. Для этого пронумеруем строки и столбцы. В каждом столбце определим минимальный элемент и запишем его в нижней строке:
.
Из каждого элемента столбца вычитаем
соответствующий минимальный элемент.
Получаем матрицу
:
.
Матрица
оказалась не приведенной, поэтому
определяем минимальный элемент в каждой
строке и вычитаем его из всех элементов
соответствующей строки. В результате
получаем приведенную матрицу
:
.
Вычисляем константу приведения
:
.
Находим степени каждого нуля – сумму минимальных элементов строки и столбца, в которых стоит нуль (без учета самого нуля). К каждому нулю приписываем вверху его степень. Максимальной степенью является число 12. Нули с максимальной степенью определяют дуги, которые вероятнее всего войдут в гамильтонов цикл. В нашем случае наиболее вероятной дугой гамильтонова цикла является l(3; 5).
Выбираем дугу l(3; 5).
В связи с этим рассматриваем две матрицы:
и
.
В матрице
убираем третью строку и пятый столбец,
элемент
заменяем
.
В матрице
элемент
заменяем
.
Получаем:
,
.
Обе матрицы не являются приведенными. Для приведения матриц определяем минимальные элементы строк и столбцов.
Сначала работаем с матрицей . Определяем минимальные элементы строк. А потом эти элементы вычитаем из каждого элемента соответствующих строк.
.
Теперь определяем минимальные элементы каждого столбца. А потом эти элементы вычитаем из каждого элемента соответствующего столбца.
.
Аналогично преобразовываем матрицу .
.
Таким образом, получаем две приведенные матрицы:
и .
Вычисляем константы приведения:
,
,
где
и
– суммы минимальных элементов строк и
столбцов матриц
и
.
,
но далее рассматриваем матрицу
.
Определяем степени нулей этой матрицы:
.
Максимальная степень – число 7. Наиболее вероятными дугами гамильтонова цикла являются дуги l(1; 2), l(4; 1) и l(5;4). Выбираем, например, дугу l(1; 2).
В связи с этим рассматриваем две матрицы:
и
.
В матрице
убираем первую строку и второй столбец,
элемент
заменяем
,
получаем матрицу
.
В матрице
элемент
заменяем
.
Имеем:
,
.
Обе матрицы не являются приведенными. Преобразуем их по той же схеме, как это делали выше.
.
Таким образом, получаем две приведенные матрицы и .
Вычисляем константы приведения:
,
.
Так как
,
то далее рассматриваем матрицу
.
Определяем степени каждого нуля.
Максимальная степень – число 32. Наиболее вероятной дугой гамильтонова цикла является дуга l(5; 4).
В связи с этим рассматриваем две матрицы:
и
.
В матрице
убираем строку под номером 5 и столбец
под номером 4, получаем матрицу
.
В матрице
элемент
заменяем
.
Имеем:
,
.
Матрица не является приведенной. Преобразуем ее по той же схеме как делали выше.
.
,
.
Так как
,
то далее рассматриваем матрицу
.
Последние две дуги гамильтонова цикла
определяем из матрицы
:
l(2; 3) и l(4;
1).
Таким образом, получаем решение, которое состоит из следующих дуг: (3; 5), (1;2), (5; 4), (2; 3), (4; 1). Гамильтонов цикл имеет вид 123541, длина цикла равна 95 км.
Сравним константу приведения
с константами приведения
альтернативных вариантов (
):
:
;
:
;
:
.
Так как , то возвращаемся к приведенной матрице , и от нее начинаем строить гамильтонов цикл.
Определяем степени нулей этой матрицы:
.
Максимальная степень – число 8. Наиболее вероятной дугой гамильтонова цикла является дуга l(5; 3).
В связи с этим рассматриваем две матрицы:
и
.
В матрице
убираем пятую строку и третий столбец,
элемент
уже заменен
.
В матрице
элемент
заменяем
.
Получаем:
,
.
Матрица - приведенная, а матрица не является приведенной. Сделаем ее приведенной, как это делали выше.
.
Вычисляем константы приведения:
,
,
где
и
– суммы минимальных элементов строк и
столбцов матриц
и
.
Так как
,
но далее рассматриваем матрицу
.
Определяем степени нулей этой матрицы:
.
Максимальная степень – число 7. Наиболее вероятными дугами гамильтонова цикла являются дуги l(1; 4), и l(4; 5). Выбираем, например, дугу l(4; 5).
В связи с этим рассматриваем две матрицы:
и
.
В матрице
убираем строку под номером 4 и столбец
под номером 5, получаем матрицу
.
В матрице
элемент
заменяем
.
Имеем:
,
.
Матрица - приведенная, а матрица не является приведенной. Сделаем ее приведенной, как это делали выше.
.
Вычисляем константы приведения:
,
.
Так как
,
то далее рассматриваем матрицу
.
Определяем степени каждого нуля.
.
Максимальная степень – число 19. Наиболее вероятной дугой гамильтонова цикла является дуга l(2; 1).
В связи с этим рассматриваем две матрицы:
и
.
В матрице
убираем строку под номером 2 и столбец
под номером 1, элемент
заменяем
и получаем матрицу
.
В матрице
элемент
заменяем
.
Имеем:
,
.
Обе матрицы не являются приведенными. Преобразуем их по той же схеме, как это делали выше.
,
.
,
.
Так как
,
то далее рассматриваем матрицу
.
Последние две дуги гамильтонова цикла
определяем из матрицы
:
l(1; 4) и l(3;
2).
Таким образом, получаем решение, которое состоит из следующих дуг: (5; 3), (4;5), (2; 1), (1; 4), (3; 2). Гамильтонов цикл имеет вид 145321, длина цикла тоже равна 95 км.
Сравним константу приведения
с константами приведения
альтернативных вариантов (
):
:
;
:
;
:
.
Это значит, что получили оптимальное решение.
Весь процесс отыскания оптимального плана можно изобразить в виде дерева ветвления:
Полученные гамильтоновы циклы 123541 или 145321 можно изобразить в виде орграфа.
Это означает следующее: коммивояжер сначала посещает город 1, потом – город 2, затем – город 3, после – город 5, и, наконец, город 4, а потом возвращается в город 1. При этом длина всего пути составит 95 км. Второе решение говорит о том, что коммивояжер может ехать в обратную сторону.