Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Поток минимальной стоимости и труднорешаемые задачи. Учебно-методическое пособие
.pdf
2.3. Задача коммивояжера 71
Теорема 2.6. Алгоритм «Ближайшая вставка» имеет слож-
2
ность O(n
).
В [1] при обсуждении алгоритма Ярника — Прима —
Дейкстры вводятся необходимые структуры данных (в част-
2
ности, массив БЛЖ), чтобы получить сложность O(n
как при незатейливой реализации получается сложность O(n
),так
3
).
(Собственно, именно это является заслугой Дейкстры; фактически именно он ввел понятие сложности алгоритма и предложил эффективную реализацию алгоритма Прима, как тогда
называли этот алгоритм). Мы не будем здесь воспроизводить
то, что изложено ранее и сейчас является классикой. Подумайте сами или поройтесь в литературе.
Минимальный остов может являться хорошим приближением маршрута коммивояжера. На этой идее основан еще один
алгоритм с гарантированной оценкой сложности.
Пусть G — эйлеров граф, и все вершины выписаны в том порядке, как они встречаются в эйлеровом цикле {v
1,v2
,...,vk},
где ребра образованы соседними вершинами. Предполагается,
что читатель хорошо знаком с понятием эйлерова цикла и достаточным условием его существования.
Определение. Маршрут коммивояжера называется
вписанным в эйлеров, если каждая вершина, кроме первой,
выписана один раз в том порядке, в котором она встречается в эйлеровом маршруте. Первая вершина встречается дважды, в начале и в конце списка.
Неформально изложим алгоритм «Остовный обход».

72 Глава 2. Труднорешаемые задачи
Algorithm 12: Алгоритм «Остовный обход»
1 Построить минимальный остов T заданного графа, где
T — множество ребер;
2 В графе (V, 2T ) построить эйлеров цикл p, заданный
списком вершин, где граф с ребрами 2T получен
удвоением ребер, входящих в минимальный остов;
3 Построить маршрут коммивояжера q, вписанный в p;
4 Выдать МК q.
Теорема 2.7. Для произвольного метрического графа G алго-
ритм «Остовный обход» гарантирует решение, не более чем
в два раза превосходящее оптимальное.
Отметим сразу, что степень каждой вершины в графе
(V, 2T ) четна, значит, существует эйлеров цикл p. Пусть он
представлен списком вершин {v
,...,vk}. Пусть viи v
1,v2
i+1
—
две последовательные вершины во вписанном маршруте коммивояжера q, а в эйлеровом цикле p между ними стоят вершины {w
руте коммивояжера более чем по одному разу раньше, чем v
,...,wj} (т.е. все эти вершины встретились в марш-
1,w2
i
Тогда из неравенства треугольника следует, что
).
(v
i,vi+1
) c(v1,w1)+c(w1,w2)+...+ c(wj,v
i+1
).
Но левая часть этого неравенства входит в МК, а правая —
в эйлеров цикл.
Отсюда получаем неравенство q p =2C,гдеC — вес
минимального остова исходного графа G.
Остается вспомнить, что для любого МК, в частности и для
Opt(G), верно неравенство C Opt(G). Отсюда и следует
требуемое.
В примере из рис. 2.6 минимальным остовом, например, будет множество ребер {(1,2); (2,3); (3,4)}.
Тогда эйлеров цикл p таков: 1—2—3—4—3—2—1. МК q, вписанный в p: 1—2—3—4—1, вес его равен 25.

2.3. Задача коммивояжера 73
А если алгоритм выберет в качестве минимального остова
такое множество ребер {(1,2), (2,3), (1,4)} и построит такой
эйлеров маршрут 1—2—4—2—3—2—1, то МК получается таким:
1—2—4—3—1, его вес — 26.
Теорема 2.8. Алгоритм «Остовный обход» имеет слож-
2
ность O(n
).
Конечно, на первом шаге (построения минимального остова) надо применять алгоритм Ярника — Прима — Дейкстры,
2
который имеет сложность O(n
). Построение графа (V, 2T ) име-
ет сложность O(n). Построение эйлерова цикла — O(m),
но m =2(n − 1). Построить вписанный маршрут — это просто
пробежаться один раз по списку вершин. Отсюда, получается
2
окончательная сложность O(n
).
2.3.3. Стохастические алгоритмы
Труднорешаемые задачи иногда неплохо решать с помощью
вероятностных (стохастических) алгоритмов. Разберем этот
подход на примере задачи коммивояжера.
Обозначим через А алгоритм, который на входе получает
МК, затем случайным образом выбираются две вершины и пе-
реставляются местами.
Будем считать, что МК задается массивом СЛЕД, тогда
работу алгоритма A можно изобразить следующим образом
(на рис. 2.7 изображен вход в алгоритм).
На рис. 2.7 через v+ и w+ обозначены вершины, следую-
щие за v и w в МК, а через v− и w− — их предшественники в МК. Предположим, что переставляются вершины v и w.
Тогда вся перестановка заключается в том, что удаляются 4
ссылки СЛЕД[v], СЛЕД[v−], СЛЕД[w−], СЛЕД[w], а вместо
них встают новые. Вся замена изображена ниже на рис. 2.8.
Здесь удаляемые ссылки изображены штриховой линией,
а новые и сохраненные ссылки — черными стрелками. То есть
из вершины w−, вместо того, чтобы идти в вершину w, идем
в вершину v ит.д.

74 Глава 2. Труднорешаемые задачи
Рис. 2.7. Вход в алгоритм A
Рис. 2.8. Выход из алгоритма A
Вес нового маршрута тоже легко считается.
T := T + c(w−,v)+c(v, w+) + c(v−,w)+c(w, v+) −
− c(v−,v) − c(v, v+) − c(w−,w) − c(w, w+).
Таким образом, алгоритм A, переставляющий два элемента
в МК, имеет сложность O(1), так как не зависит от размерности задачи.
Теперь можно предложить простой алгоритм для задачи
коммивояжера. Изложим его неформально.

2.3. Задача коммивояжера 75
Входом является полный взвешенный граф, выходом — МК.
Algorithm 13: Простой стохастический алгоритм
1 Используя какой-нибудь быстрый алгоритм, построить
стартовый МК — p;
2 while не надоест do
3 Построить A(p);
4 if A(p) < p then
5 положить p := A(p)
6 end
7 end
8 Выдать p.
Как понимать фразу «Используя какой-нибудь быстрый алгоритм, построить стартовый МК»? Годится, например, алгоритм «Ближайший сосед», особенно если прогнать его много
раз, меняя стартовую вершину, и затем выбрать наилучший.
Для реализации нового оператора «While не надоест» достаточно использовать любой из следующих методов:
1) поставить счетчик на количество выполнений и выполнять названную процедуру столько раз, сколько захочется;
2) поставить ограничение по времени;
3) или использовать какой-нибудь другой способ.
Имеющиеся в литературе данные говорят, что итоговый результат тем лучше, чем лучше стартовое решение. Обычно этот
алгоритм называют «2-окрестности».
Имеющиеся данные (не проверяли) говорят о том, что алгоритм «3-окрестности» не дает существенного улучшения, также не получается существенного улучшения, если пытаться переставляемые вершины поставить наилучшим образом в текущий МК.
Слабым местом приведенного алгоритма является то, что
он принимает новые решения, только если они лучше старого. Алгоритм не позволяет обходить «локальные ямы». Пусть,

76 Глава 2. Труднорешаемые задачи
например, по оси абсцисс изображены последовательные МК
(не важно, как они получены) по оси ординат их веса.
Рис. 2.9. Недостаток работы простого стохастического
алгоритма
На рис. 2.9, если алгоритм попал в промежуток (1,4),
то он уже никогда не попадет в промежуток (6,9) поскольку
мешает бугорок в промежутке (4,6).
Между тем, еще в 1960-е гг. специалисты по линейному программированию при решении очень больших задач заметили,
что иногда надо выбирать промежуточные решения, которые
хуже, а результат получается лучше!
Устраняет этот недостаток алгоритм, называемый «Моделирование отжига». Появился этот метод в применении к задачам дискретной оптимизации где-то в самом конце 1980-х гг.
Впервые он описан в 1953 г., в работе Н. Метрополиса в физических задачах.
Пусть состояние некоторой системы описывается энергией
. При каком условии система переходит в состояние с энер-
E
1
гией E
энергией (E
? Есть закон Больцмана о переходе системы с одной
2
) в другую (E2). Этот закон Больцмана хорошо
1
работает в природе, а математика, как известно, естественная

2.3. Задача коммивояжера 77
наука! Значит, закон Больцмана должен работать и в математике!
Если E
<E1, то всегда, а если E2 E1?
2
Оказывается, возможно и такое, переход возможен, но с вероятностью e
<E1(т. е. показатель экспоненты меньше нуля), то веро-
E
2
−(E1−E2)/b
,гдеb — некоторый параметр, и, если
ятность считается равной 1. Для наглядности рекомендуем по-
−x
строить график функции e
.
Теперь всё готово для изложения алгоритма «Моделирование отжига».
Пусть E обозначает вес каждого маршрута коммивояжера.
Выберем схему остывания: E
>E2>...>En≈ 0.
1
Algorithm 14: Алгоритм «Моделирование отжига»
1 Используя какой-нибудь быстрый алгоритм, построить
стартовый МК — p;
2 for i =1to n do
3 while не надоест do
4 Построить A(p);
5 if A(p) < p then
6 положить p := A(p)
7 else
8 положить p := A(p) с вероятностью
9 end
10 end
11 end
12 Выдать p.
−(p−A(p))/E
e
i
То есть вначале почти всегда принимаются плохие варианты, но затем они принимаются заметно реже, можно сказать,
почти никогда.
Итак, в этом алгоритме на каждом шаге «монетка» бросается два раза. Первый — при построении A(p), второй — при
выборе вероятности перехода.

78 Глава 2. Труднорешаемые задачи
Конечно, этот алгоритм достаточно сложный, надо хорошо
подобрать схему остывания.
Почему этот алгоритм хорошо работает? Объяснение одно.
В природе это работает,
значит, в математике — тоже!
2.3.4. Точные решения. Метод ветвей и границ
Этот метод применяется для самых разных оптимизационных задач. Вкратце можно сказать, что это метод получения
точного решения путем разумного сокращения полного перебора. Мы здесь разберем этот популярный метод для ЗК.
Пусть G — полный взвешенный граф. Будем анализировать
дерево решений, которое будем считать ориентированным, двоичным. Каждая вершина в дереве решений соответствует множеству МК. Корень дерева — все МК в графе.
Пусть v — вершина в дереве решений. Тогда через v
чим левого сына, а через v
все МК, входящие в вершину v.
Пусть имеются алгоритмы:
— правого и через M (v) обозначаем
1
обозна-
0
1) алгоритм выбора ребра e, по которому левому сыну отвечают все МК, содержащие ребро e, а правому — не содержащие e (правило ветвления);
2) алгоритм вычисления нижних границ маршрутов из M (v),
т. е. такого числа f(v), что для любого МК p из M (v) выполняется неравенство p f (v) (правило границ).
Теперь (в общих чертах) можно сформулировать весь алго-
ритм.

2.3. Задача коммивояжера 79
Algorithm 15: Метод ветвей и границ
1 while пока не найдена вершина w с наименьшей
нижней границей, и M (w) состоит из одного МК, а
для всех еще не ветвящихся вершин нижняя граница
не меньше, чем f(w) do
2 выбирать вершину с наименьшей нижней границей
и ветвить ее
3 end
Ветвление. Общий принцип: выбирать такое ребро e, что-
бы нижняя граница правого сына была как можно больше, чем
у левого.
Годится такой метод: выбрать ребро, т. е. ноль в матрице
весов так, чтобы сумма вторых элементов в этой матрице была
как можно больше.
Границы. Осуществить редукцию матрицы, соответствующей данной вершине. Тогда сумма всех констант, использованных при редукции на единственном пути из корня и есть
нижняя граница рассматриваемой вершины.
Конечно, тут необходим пример.
Мы продолжим рассмотрение примера, приведенного
в предыдущих разделах.
1 2 3 4
1 ∞ 3 7 8
2 3 ∞ 6 8
3 7 6 ∞ 8
4 8 8 8 ∞
1 2 3 4
1 ∞ 0 4 3 3
2 0 ∞ 3 3 3
3 1 0 ∞ 0 0
4 0 0 0 ∞ 0
0 0 3 3
1 2 3 4
1 ∞ 0 4 5
2 3 ∞ 3 5
3 2 0 ∞ 2
4 0 0 0 ∞

80 Глава 2. Труднорешаемые задачи
В первой строке слева — исходная матрица, справа — после
вычитания минимального элемента в строке, во второй строке — после вычитания минимального элемента в столбце, в последних строках и столбцах — соответствующие вторые по величине элементы.
По умолчанию считаем, что матрица всегда состоит из неотрицательных элементов.
Обозначим через v корень дерева решений. Поскольку сумма констант, использованных при редукции, равна
3+3+6+8+0+0+0+2 = 22, то 22 является нижней
границей всех МК, потому что в каждой строке и в каждом
столбце есть хотя бы один ноль и, возможно, из них и сложим
МК. Итак, f(v)=22.
Для нашего примера подходят четыре нуля, пусть выбран ноль в первой строке и во втором столбце; иначе
говоря, выбрано для ветвления ребро
(1,2). Тогда дерево решений выглядит
так (см. рис. 2.10).
Какой сын лучше? Конечно, левый, так как у левого матрица становится на единицу меньшей размерности, а у правого только на пересечении нужной строки и столбца становится бесконечность (т. е. нельзя брать
Рис. 2.10. Ветвление
вершины v
это ребро).
Ниже приведены матрицы левого и правого сыновей вершины v, сверху исходные, снизу после редукции. В левой матрице
вычли 3 из первой строки, а в правой—3изпервой и второй. В соответствии с алгоритмом, мы должны ветвить левую
вершину и использовать для этого ребро (3,4). Новая нижняя
граница для вершины v
равна 25.
00
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
