Автор работы: Пользователь скрыл имя, 20 Мая 2013 в 11:15, реферат
В 1859 г. У. Гамильтон придумал игру “Кругосветное путешествие”, состоящую в отыскании такого пути, проходящего через все вершины (города, пункты назначения) графа, изображенного на рис. 1, чтобы посетить каждую вершину однократно и возвратиться в исходную. Пути, обладающие таким свойством, называются гамильтоновыми циклами.
Задача о гамильтоновых циклах в графе получила различные обобщения. Одно из этих обобщений – задача коммивояжера, имеющая ряд применений в исследовании операций, в частности при решении некоторых транспортных проблем.
Введение 3
Задача коммивояжера 4
Общее описание 4
Методы решения задачи коммивояжера 5
Жадный алгоритм. 5
Деревянный алгоритм 8
Метод ветвей и границ 10
Алгоритм Дейкстры 14
Анализ методов решения задачи коммивояжера 17
Практическое применение задачи коммивояжера 18
Выводы 20
Литература 21
1.2.2. Деревянный алгоритм.
Теперь можно обсудить алгоритм решения ЗК через построение кратчайшего остовного дерева. Для краткости будет называть этот алгоритм деревянным.
Вначале
обсудим свойство спрямления. Рассмотрим
какую-нибудь цепь, например, на рис.5. Если
справедливо неравенство
d[1,5]£ d[1,2]+d[2,3]+d[3,4]+d[4,5]
Итак, если
справедливо неравенство
Вернемся к ЗК и опишем решающий ее деревянный алгоритм.
Пример 1. Дана полная сеть, показанная на рис.5. Найти тур жадным и деревянным алгоритмами.
- |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
- |
6 |
4 |
8 |
7 |
14 |
2 |
6 |
- |
7 |
11 |
7 |
10 |
3 |
4 |
7 |
- |
4 |
3 |
10 |
4 |
8 |
11 |
4 |
- |
5 |
11 |
5 |
7 |
7 |
3 |
5 |
- |
7 |
6 |
14 |
10 |
10 |
11 |
7 |
- |
табл. 1 |
Решение. Жадный алгоритм (иди в ближайший
город из города 1) дает тур 1–(4)–3-(3)–5(5)–4–(11)–6–(10)
2. Деревянный алгоритм вначале строит остовное дерево, показанное на рис. 6 штриховой линией, затем эйлеров цикл 1-2-1-3-4-3-5-6-5-3-1, затем тур 1-2-3-4-5-6-1 длиной 43, который показан сплошной линией на рис. 6.
Теорема. Погрешность деревянного алгоритма равна 1.
Доказательство. Возьмем минимальный тур длины fB и удалим из него максимальное ребро. Длина получившейся гамильтоновой цепи LHC меньше fB. Но эту же цепь можно рассматривать как остовное дерево, т. к. эта цепь достигает все вершины и не имеет циклов. Длина кратчайшего остовного дерева LMT меньше или равна LHC. Имеем цепочку неравенств
fB>LHC³LMT |
(6) |
Но удвоенное дерево – оно же эйлеров граф – мы свели к туру посредством спрямлений, следовательно, длина полученного по алгоритму тура удовлетворяет неравенству
2LMT>fA |
(7) |
Умножая (6) на два и соединяя с (7), получаем цепочку неравенств
2fB>2LHC³2LMT³fA |
(8) |
Т.е. 2fB>fA, т.е. fA/fB>1+e; e=1.
Теорема доказана.
Таким образом, мы доказали, что деревянный алгоритм ошибается менее, чем в два раза. Такие алгоритмы уже называют приблизительными, а не просто эвристическими.
Известно
еще несколько простых
5! |
10! |
15! |
20! |
25! |
30! |
35! |
40! |
45! |
50! |
~102 |
~106 |
~1012 |
~1018 |
~10125 |
~1032 |
~1040 |
~1047 |
~1056 |
~1064 |
Чтобы проводить полный перебор в ЗК, нужно научиться (разумеется, без повторений) генерировать все перестановки заданного числа m элементов. Это можно сделать несколькими способами, но самый распространенный (т.е. приложимый для переборных алгоритмов решения других задач) – это перебор в лексикографическом порядке.
Пусть имеется некоторый алфавит и наборы символов алфавита (букв), называемые словами. Буквы в алфавите упорядочены: например, в русском алфавите порядок букв аµбµя (символ µ читается “предшествует)”. Если задан порядок букв, можно упорядочить и слова. Скажем, дано слово u=(u1,u2,..,um) – состоящее из букв u1,u2,..,um - и слово v =(v1,v2,..,vb). Тогда если u1µv1, то и uµv, если же u1=v1, то сравнивают вторые буквы и т.д. Этот порядок слов и называется лексикографическим. Поэтому в русских словарях (лексиконах) слово “абажур” стоит раньше слова “абака”. Слово “бур” стоит раньше слова “бура”, потому что пробел считается предшествующим любой букве алфавита.
Рассмотрим, скажем, перестановки из пяти элементов, обозначенных цифрами 1..5. Лексикографически первой перестановкой является 1-2-3-4-5, второй – 1-2-3-5-4, …, последней – 5-4-3-2-1. Нужно осознать общий алгоритм преобразования любой перестановки в непосредственно следующую.
Правило такое: скажем, дана перестановка 1-3-5-4-2. Нужно двигаться по перестановке справа налево, пока впервые не увидим число, меньшее, чем предыдущее (в примере это 3 после 5). Это число, Pi-1 надо увеличить, поставив вместо него какое-то число из расположенных правее, от Pi до Pn. Число большее, чем Pi-1, несомненно, найдется, так как Pi-1< Pi . Если есть несколько больших чисел, то, очевидно, надо ставить меньшее из них. Пусть это будет Pj,j>i-1. Затем число Pi-1 и все числа от Pi до Pn, не считая Pj нужно упорядочить по возрастанию. В результате получится непосредственно следующая перестановка, в примере – 1-4-2-3-5. Потом получится 1-4-2-5-3 (тот же алгоритм, но упрощенный случай) и т.д.
Нужно понимать, что в ЗК с n городами не нужны все перестановки из n элементов. Потому что перестановки, скажем, 1-3-5-4-2 и 3-5-4-2-1 (последний элемент соединен с первым) задают один и тот же тур, считанный сперва с города 1, а потом с города 3. Поэтому нужно зафиксировать начальный город 1 и присоединять к нему все перестановки из остальных элементов. Этот перебор даст (n-1)! разных туров, т.е. полный перебор в несимметричной ЗК (мы по-прежнему будем различать туры 1-3-5-4-2 и 1-2-4-5-3).
Данный алгоритм описан на языке Паскаль (см. Приложения).
Пример 2. Решим ЗК, поставленную в Примере 1 лексикографическим перебором. Приведенная выше программа напечатает города, составляющие лучший тур: 1-2-6-5-4-3 и его длину 36.
Желательно усовершенствовать перебор, применив разум. В следующем пункте описан алгоритм, который реализует простую, но широко применимую и очень полезную идею.
1.2.3. Метод ветвей и границ
К идее метода ветвей и границ приходили
многие исследователи, но Литтл с
соавторами на основе указанного метода
разработали удачный алгоритм решения
ЗК и тем самым способствовали
популяризации подхода. С тех
пор метод ветвей и границ был
успешно применен ко многим задачам,
для решения ЗК было придумано
несколько других модификаций метода,
но в большинстве учебников
Общая идея тривиальна: нужно разделить огромное число перебираемых вариантов на классы и получить оценки (снизу – в задаче минимизации, сверху – в задаче максимизации) для этих классов, чтобы иметь возможность отбрасывать варианты не по одному, а целыми классами. Трудность состоит в том, чтобы найти такое разделение на классы (ветви) и такие оценки (границы), чтобы процедура была эффективной.
- |
1 |
2 |
3 |
4 |
5 |
6 | |||
1 |
- |
0 |
0 |
3 |
3 |
6 | |||
2 |
0 |
- |
1 |
4 |
1 |
0 | |||
3 |
1 |
2 |
- |
0 |
0 |
3 | |||
4 |
4 |
5 |
0 |
- |
1 |
3 | |||
5 |
4 |
2 |
0 |
1 |
- |
0 | |||
6 |
7 |
1 |
3 |
3 |
0 |
- | |||
2 |
1 |
4 | |||||||
табл. 4 |
Изложим алгоритм Литтла на примере 1 предыдущего раздела.. Повторно запишем матрицу:
- |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
- |
6 |
4 |
8 |
7 |
14 |
2 |
6 |
- |
7 |
11 |
7 |
10 |
3 |
4 |
7 |
- |
4 |
3 |
10 |
4 |
8 |
11 |
4 |
- |
5 |
11 |
5 |
7 |
7 |
3 |
5 |
- |
7 |
6 |
14 |
10 |
10 |
11 |
7 |
- |
табл. 2 |
- |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
- |
2 |
0 |
4 |
3 |
10 |
4 |
2 |
0 |
- |
1 |
5 |
1 |
4 |
6 |
3 |
1 |
4 |
- |
1 |
0 |
7 |
3 |
4 |
4 |
7 |
0 |
- |
1 |
7 |
4 |
5 |
4 |
4 |
0 |
2 |
- |
4 |
3 |
6 |
7 |
3 |
3 |
4 |
0 |
- |
7 |
табл. 3 |
Информация о работе Формулировка задачи коммивояжера и алгоритмы ее решения