Программирование задач на графах Гамильтоновы и эйлеровы циклыРефераты >> Программирование и компьютеры >> Программирование задач на графах Гамильтоновы и эйлеровы циклы
Оцениваем теперь нули в приведенной матрице C[(1,2),(3,1)] нуль с максимальной оценкой 3 находится в клетке (6,5). Отрицательный вариант имеет оценку 38+3=41. Для получения оценки положительного варианта убираем строчку 6 и столбец 5, ставим запрет в клетку (5,6), см. табл. 10. Эта матрица неприводима. Следовательно, оценка положительного варианта не увеличивается (рис.8).
- |
3 |
4 |
4 |
0 |
- |
5 |
0 |
0 |
табл. 11 |
Оценивая нули в матрице на табл. 10, получаем ветвление по выбору ребра (2,6), отрицательный вариант получает оценку 36+3=39, а для получения оценки положительного варианта вычеркиваем вторую строку и шестой столбец, получая матрицу на табл. 11.
В матрицу надо добавить запрет в клетку (5,3), ибо уже построен фрагмент тура [3,1,2,6,5] и надо запретить преждевременный возврат (5,3). Теперь, когда осталась матрица 2х2 с запретами по диагонали, достраиваем тур ребрами (4,3) и (5,4). Мы не зря ветвились, по положительным вариантам. Сейчас получен тур: 1→2→6→5→4→3→1 стоимостью в 36. При достижении низа по дереву перебора класс туров сузился до одного тура, а оценка снизу превратилась в точную стоимость.
Итак, все классы, имеющие оценку 36 и выше, лучшего тура не содержат. Поэтому соответствующие вершины вычеркиваются. Вычеркиваются также вершины, оба потомка которой вычеркнуты. Мы колоссально сократили полный перебор. Осталось проверить, не содержит ли лучшего тура класс, соответствующий матрице С[Not(1,2)], т.е. приведенной матрице С с запретом в клетке 1,2, приведенной на 1 по столбцу (что дало оценку 34+1=35). Оценка нулей дает 3 для нуля в клетке (1,3), так что оценка отрицательного варианта 35+3 превосходит стоимость уже полученного тура 36 и отрицательный вариант отсекается.
Для получения оценки положительного варианта исключаем из матрицы первую строку и третий столбец, ставим запрет (3,1) и получаем матрицу. Эта матрица приводится по четвертой строке на 1, оценка класса достигает 36 и кружок зачеркивается. Поскольку у вершины «все» убиты оба потомка, она убивается тоже. Вершин не осталось, перебор окончен. Мы получили тот же минимальный тур, который показан подчеркиванием на табл. 2.
Удовлетворительных теоретических оценок быстродействия алгоритма Литтла и родственных алгоритмов нет, но практика показывает, что на современных ЭВМ они часто позволяют решить ЗК с n = 100. Это огромный прогресс по сравнению с полным перебором. Кроме того, алгоритмы типа ветвей и границ являются, если нет возможности доводить их до конца, эффективными эвристическими процедурами.
§6. Применение алгоритма Дейкстры к решению ЗК
Одним из вариантов решения ЗК является вариант нахождения кратчайшей цепи, содержащей все города. Затем полученная цепь дополняется начальным городом – получается искомый тур.
Известно множество простых алгоритмов. Один из них – алгоритм Дейкстры, предложенный Дейкстрой ещё в 1959г. Этот алгоритм решает общую задачу:
В ориентированной, неориентированной или смешанной сети найти кратчайший путь между двумя заданными вершинами.
При небольшой модификации алгоритм Дейкстры позволяет найти кратчайшие пути из данной вершины во все остальные. Матрица расстояний Dik задаёт длины дуг dik между i-ой и k-ой вершинами; если такой дуги нет, то dik присваивается большое число Б, равное “машинной бесконечности”. Алгоритм Дейкстры имеет квадратичную сложность O(n2).
Таким образом, для решения ЗК нужно n раз применить алгоритм Дейкстры следующим образом.
Возьмём произвольную пару вершин j,k. Исключим непосредственное ребро D[j,k]. С помощью алгоритма Дейкстры найдём кратчайшее расстояние между городами j,…,k. Пусть это расстояние включает некоторый город m. Имеем часть тура j,m,k. Теперь для каждой пары соседних городов (в данном примере – для j,m и m,k) удалим соответственное ребро и найдём кратчайшее расстояние. При этом в кратчайшее расстояние не должен входить уже использованный город.
Далее аналогично находим кратчайшее расстояние между парами вершин алгоритмом Дейкстры, до тех пор, пока все вершины не будут задействованы. Соединим последнюю вершину с первой и получим тур. Чаще всего это последнее ребро оказывается очень большим, и тур получается с погрешностью, однако алгоритм Дейкстры можно отнести к приближённым алгоритмам.
§7. Метод выпуклого многоугольника для решения ЗК
Рассмотрим рис. 9-10 и попытаемся найти в них кратчайшие туры. Очевидно, что кратчайший тур не должен содержать пересекающихся ребёр (в противном случае, поменяв вершины при пересекающихся рёбрах местами, получим более короткий тур). В первом случае кратчайшим является тур 1-2-4-5-3-1, а во втором – тур 1-2-3-4-5-1. Анализируя множество других аналогичных расположении пяти и более городов, можно сделать следующее общее предположение:
Если можно построить выпуклый многоугольник, по периметру которого лежат все города, то такой выпуклый многоугольник является кратчайшим туром.
Однако не всегда можно построить выпуклый многоугольник, по периметру которого лежали бы все города. Велика вероятность того, что некоторые города не войдут в выпуклый многоугольник. Такие города будем называть “центральными”. Так как построить выпуклый многоугольник довольно легко, то задача сводится к тому, чтобы включить в тур в виде выпуклого многоугольника все центральные города с минимальными потерями. Пусть имеется массив T[n+1], содержащий в себе номера городов по порядку, которые должен посетить коммивояжер, т. е. вначале коммивояжер должен посетить город T[1], затем T[2], потом T[3] и т.д., причём T[n+1]=T[1] (коммивояжер должен вернуться в начальный город). Тогда, если выполняется равенство "i [1,2 n] C[T[i],p]+ C[p,T[i+1]]–C[T[I],T[i+1]] = min, то центральный город с номером p нужно включить в тур между городами T[i] и T[i+1]. Проделав эту операцию для всех центральных городов, в результате получим кратчайший тур. Для задачи, решённой нами методом ветвей и границ, этот алгоритм даёт правильное решение.
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | |
1 |
13 |
6 |
13 |
14 |
15 |
14 |
16 | |
2 |
13 |
11 |
11 |
8 |
13 |
17 |
14 | |
3 |
6 |
11 |
5 |
6 |
11 |
7 |
11 | |
4 |
13 |
11 |
5 |
2 |
6 |
7 |
6 | |
5 |
14 |
8 |
6 |
2 |
6 |
5 |
6 | |
6 |
15 |
13 |
11 |
6 |
6 |
13 |
5 | |
7 |
14 |
17 |
7 |
7 |
5 |
13 |
9 | |
8 |
16 |
14 |
11 |
6 |
6 |
5 |
9 | |
табл. 13 |