Задача коммивояжера. 4
Содержание
Введение
1. Задача коммивояжера. Общее
описание
2. Методы решения ЗК
2.1. Жадный алгоритм
2.2. Деревянный алгоритм
2.3. Метод ветвей и границ
3.Практическое применение задачи
коммивояжера
Заключение
Список литературы
Введение
Комбинаторика – раздел математики,
посвящённый решению задач
Каждое такое правило
Большой вклад в систематическое развитие комбинаторных методов был сделан Г. Лейбницем (диссертация «Комбинаторное искусство»), Я. Бернулли (работа «Искусство предположений»), Л. Эйлером. Можно считать, что с появлением работ Я. Бернулли и Г. Лейбница комбинаторные методы выделились в самостоятельную часть математики. В работах Л.Эйлера по разбиениям и композициям натуральных чисел на слагаемые было положено начало одному из основных методов перечисления комбинаторных конфигураций – методу производящих функций.
Возвращение интереса к комбинаторному анализу относится к 50-м годам ХХ в. в связи с бурным развитием кибернетики и дискретной математики и широким использованием электронно-вычислительной техники. В этот период активизировался интерес к классическим комбинаторным задачам.
Классические комбинаторные
В 1859 г. У. Гамильтон придумал игру «Кругосветное путешествие», состоящую в отыскании такого пути, проходящего через все вершины (города, пункты назначения) графа, изображенного на рис. 1, чтобы посетить каждую вершину однократно и возвратиться в исходную. Пути, обладающие таким свойством, называются гамильтоновыми циклами.
рис.1
Задача о гамильтоновых циклах в графе получила различные обобщения. Одно из этих обобщений – задача коммивояжера, имеющая ряд применений в исследовании операций, в частности при решении некоторых транспортных проблем.
1.Задача коммивояжера. Общее описание
Задача коммивояжера (в дальнейшем сокращённо - ЗК) является одной из знаменитых задач теории комбинаторики. Она была поставлена в 1934 году, и об неё, как об Великую теорему Ферма обламывали зубы лучшие математики. В своей области (оптимизации дискретных задач) ЗК служит своеобразным полигоном, на котором испытываются всё новые методы.
Постановка задачи следующая.
Коммивояжер (бродячий торговец) должен выйти из первого города, посетить по разу в неизвестном порядке города и вернуться в первый город. Расстояния между городами известны. В каком порядке следует обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?
Чтобы привести задачу к научному виду, введём некоторые термины. Итак, города перенумерованы числами . Тур коммивояжера может быть описан циклической перестановкой , причём все – разные номера; повторяющийся в начале и в конце , показывает, что перестановка зациклена. Расстояния между парами вершин образуют матрицу . Задача состоит в том, чтобы найти такой тур , чтобы минимизировать функционал.
Относительно
Во-первых, в постановке означали расстояния, поэтому они должны быть неотрицательными, т.е. для всех :
|
(2) |
(последнее равенство означает запрет на петли в туре), симметричными, т.е. для всех :
. |
(3) |
и удовлетворять неравенству треугольника, т.е. для всех:
|
(4) |
В математической постановке говорится о произвольной матрице.
Сделано это потому, что имеется много прикладных задач, которые описываются основной моделью, но всем условиям (2)-(4) не удовлетворяют. Особенно часто нарушается условие (3) (например, если – не расстояние, а плата за проезд: часто туда билет стоит одну цену, а обратно – другую). Поэтому мы будем различать два варианта ЗК: симметричную задачу, когда условие (3) выполнено, и несимметричную - в противном случае. Условия (2)-(4) по умолчанию мы будем считать выполненными.
Второе замечание касается числа всех возможных туров. В несимметричной ЗК все туры и имеют разную длину и должны учитываться оба. Разных туров очевидно .
Зафиксируем на первом и последнем
месте в циклической
Можно представить, что состоит только из единиц и нулей. Тогда можно интерпретировать, как граф, где ребро проведено, если и не проведено, если . Тогда, если существует тур длины 0, то он пройдёт по циклу, который включает все вершины по одному разу. Такой цикл называется гамильтоновым циклом. Незамкнутый гамильтонов цикл называется гамильтоновой цепью (гамильтоновым путём).
В терминах теории графов симметричную ЗК можно сформулировать так:
Дана полная сеть с вершинами, длина ребра. Найти гамильтонов цикл минимальной длины.
В несимметричной ЗК вместо «цикл» надо говорить «контур», а вместо «ребра» - «дуги» или «стрелки».
Некоторые прикладные задачи формулируются как ЗК, но в них нужно минимизировать длину не гамильтонова цикла, а гамильтоновой цепи. Такие задачи называются незамкнутыми. Некоторые модели сводятся к задаче о нескольких коммивояжерах, но мы здесь их рассматривать не будем.
2. Методы решения ЗК
2.1. Жадный алгоритм
Жадный алгоритм – алгоритм нахождения наикратчайшего расстояния путём выбора самого короткого, ещё не выбранного ребра, при условии, что оно не образует цикла с уже выбранными рёбрами. «Жадным» этот алгоритм назван потому, что на последних шагах приходится жестоко расплачиваться за жадность.
Посмотрим, как поведет себя при решении ЗК жадный алгоритм. Здесь он превратится в стратегию «иди в ближайший (в который еще не входил) город». Жадный алгоритм, очевидно, бессилен в этой задаче. Рассмотрим для примера сеть на рис. 2, представляющую узкий ромб. Пусть коммивояжер стартует из города 1. Алгоритм «иди вы ближайший город» выведет его в город 2, затем 3, затем 4; на последнем шаге придется платить за жадность, возвращаясь по длинной диагонали ромба. В результате получится не кратчайший, а длиннейший тур.
рис 2.
В пользу процедуры «иди в ближайший» можно сказать лишь то, что при старте из одного города она не уступит стратегии «иди в дальнейший».
Как видим, жадный алгоритм ошибается. Можно ли доказать, что он ошибается умеренно, что полученный им тур хуже минимального, положим, в 1000 раз? Мы докажем, что этого доказать нельзя, причем не только для жадного логарифма, а для алгоритмов гораздо более мощных. Но сначала нужно договориться, как оценивать погрешность неточных алгоритмов, для определенности, в задаче минимизации. Пусть - настоящий минимум,
а - тот квазиминимум, который получен по алгоритму. Ясно, что , но это – тривиальное утверждение, что может быть погрешность. Чтобы оценить её, нужно зажать отношение оценкой сверху:
(5) |
где, как обычно в высшей математике, , но, против обычая, может быть очень большим. Величина и будет служить мерой погрешности. Если алгоритм минимизации будет удовлетворять неравенству (5), мы будем говорить, что он имеет погрешность .
Предположим теперь, что имеется алгоритм А решения ЗК, погрешность которого нужно оценить. Возьмем произвольный граф и по нему составим входную матрицу ЗК:
С[i,j]={ |
1,если ребро (i,j) принадлежит Е |
1+nε в противном случае |
Если в графе есть гамильтонов цикл, то минимальный тур проходит по этому циклу и . Если алгоритм А тоже всегда будет находить этот путь, то по результатам алгоритма можно судить, есть ли гамильтонов цикл в произвольном графе. Однако, непереборного алгоритма, который мог бы ответить, есть ли гамильтонов цикл в произвольном графе, до сих пор никому не известно. Таким образом, наш алгоритм А должен иногда ошибаться и включать в тур хотя бы одно ребро длины . Но тогда
так что т.е. превосходит погрешность ε на заданную неравенством (5). О величине в нашем рассуждении мы не договаривались, так что ε может быть произвольно велик.
Таким образом доказана следующая теорема.
Либо алгоритм А определяет, существует ли в произвольном графе гамильтонов цикл, либо погрешность А при решении ЗК может быть произвольно велика.
Это соображение было впервые опубликовано Сани и Гонзалесом в 1980 г. Теорема Сани-Гонзалеса основана на том, что нет никаких ограничений на длину ребер. Теорема не проходит, если расстояния подчиняются неравенству треугольника (4).
рис. 3
Если оно соблюдается, можно предложить несколько алгоритмов с погрешностью 12. Прежде, чем описать такой алгоритм, следует вспомнить старинную головоломку. Можно ли начертить одной линией открытый конверт? Рис.2 показывает, что можно (цифры на отрезках показывают порядок их проведения). Закрытый конверт (рис.3.) одной линией нарисовать нельзя и вот почему. Будем называть линии ребрами, а их перекрестья – вершинами.
Когда через точку проводится линия, то используется два ребра – одно для входа в вершину, одно – для выхода. Если степень вершины нечетна – то в ней линия должна начаться или кончиться. На рис. 3 вершин нечетной степени две: в одной линия начинается, в другой – кончается. Однако на рис. 4 имеется четыре вершины степени три, но у одной линии не может быть четыре конца. Если же нужно прочертить фигуру одной замкнутой линией, то все ее вершины должны иметь четную степень.
Верно и обратное утверждение: если все вершины имеют четную степень, то фигуру можно нарисовать одной незамкнутой линией. Действительно, процесс проведения линии может кончиться, только если линия придет в вершину, откуда уже выхода нет: все ребра, присоединенные к этой вершине (обычно говорят: инцидентные этой вершине), уже прочерчены. Если при этом нарисована вся фигура, то нужное утверждение доказано; если нет, удалим уже нарисованную часть . После этого от графа останется одна или несколько связных компонент; пусть – одна из таких компонент. В силу связности исходного графа имеют хоть одну общую вершину, скажем, . Если в удалены какие-то ребра, то по четному числу от каждой вершины. Поэтому – связный и все его вершины имеют четную степень. Построим цикл в (может быть, не нарисовав всего ) и через v добавим прорисованную часть . Увеличивая таким образом прорисованную часть , мы добьемся того, что охватит весь .
Эту задачу когда-то решил Эйлер, и замкнутую линию, которая покрывает все ребра графа, теперь называю эйлеровым циклом. По существу была доказана следующая теорема.
Эйлеров цикл в графе существует тогда и только тогда, когда (1) граф связный и (2) все его вершины имеют четные степени.
2.2. Деревянный алгоритм
Теперь можно обсудить алгоритм решения ЗК через построение кратчайшего остовного дерева. Для краткости будет называть этот алгоритм деревянным.
Вначале обсудим свойство спрямления. Рассмотрим какую-нибудь цепь, например, на рис.5. Если справедливо неравенство треугольника, то
Сложив эти два неравенства, получим . По неравенству треугольника получим . Окончательно
Итак, если справедливо неравенство треугольника, то для каждой цепи верно, что расстояние от начала до конца цепи меньше (или равно) суммарной длины всех ребер цепи. Это обобщение расхожего убеждения, что прямая короче кривой.
Вернемся к ЗК и опишем решающий ее деревянный алгоритм.
Построим на входной сети ЗК кратчайшее остовное дерево и удвоим все его ребра. Получим граф – связный и с вершинами, имеющими только четные степени.
Построим эйлеров цикл , начиная с вершины 1, цикл задается перечнем вершин.
Просмотрим перечень вершин, начиная с 1, и будем зачеркивать каждую вершину, которая повторяет уже встреченную в последовательности. Останется тур, который и является результатом алгоритма.
Пример 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) дает тур , где без скобок показаны номера вершин, а в скобках – длины ребер. Длина тура равна 39, тур показана на рис. 5.
2. Деревянный алгоритм
вначале строит остовное
Теорема. Погрешность деревянного алгоритма равна 1.
Доказательство. Возьмем минимальный тур длины и удалим из него максимальное ребро. Длина получившейся гамильтоновой цепи меньше . Но эту же цепь можно рассматривать как остовное дерево, т. к. эта цепь достигает все вершины и не имеет циклов. Длина кратчайшего остовного дерева меньше или равна . Имеем цепочку неравенств
|
(6) |
Но удвоенное дерево – оно же эйлеров граф – мы свели к туру посредством спрямлений, следовательно, длина полученного по алгоритму тура удовлетворяет неравенству
(7) |
Умножая (6) на два и соединяя с (7), получаем цепочку неравенств
|
(8) |
Т.е.
Теорема доказана.
Таким образом, мы доказали, что деревянный алгоритм ошибается менее, чем в два раза. Такие алгоритмы уже называют приблизительными, а не просто эвристическими.
Известно еще несколько простых алгоритмов, гарантирующих в худшем случае . Для того, чтобы найти среди них алгоритм поточнее, зайдем с другого конца и для начала опишем «brute-force enumeration» - «перебор животной силой», как его называют в англоязычной литературе. Понятно, что полный перебор практически применим только в задачах малого размера. Напомним, что ЗК с n городами требует при полном переборе рассмотрения
Туров в симметричной задаче и Туров в несимметричной, а факториал, как показано в следующей таблице, растет удручающе быстро:
5! |
10! |
15! |
20! |
25! |
30! |
35! |
40! |
45! |
50! |
~102 |
~106 |
~1012 |
~1018 |
~10125 |
~1032 |
~1040 |
~1047 |
~1056 |
~1064 |
Чтобы проводить полный перебор в ЗК, нужно научиться (разумеется, без повторений) генерировать все перестановки заданного числа m элементов. Это можно сделать несколькими способами, но самый распространенный (т.е. приложимый для переборных алгоритмов решения других задач) – это перебор в лексикографическом порядке.
Пусть имеется некоторый алфавит и наборы символов алфавита (букв), называемые словами. Буквы в алфавите упорядочены: например, в русском алфавите порядок букв аµбµя (символ читается «предшествует)». Если задан порядок букв, можно упорядочить и слова. Скажем, дано слово
– состоящее из букв - и слово
. Тогда если , то и , если же , то сравнивают вторые буквы и т.д. Этот порядок слов и называется лексикографическим. Поэтому в русских словарях (лексиконах) слово «абажур» стоит раньше слова «абака». Слово «бур» стоит раньше слова «бура», потому что пробел считается предшествующим любой букве алфавита.
Рассмотрим, скажем, перестановки из пяти элементов, обозначенных цифрами . Лексикографически первой перестановкой является , второй – последней – . Нужно осознать общий алгоритм преобразования любой перестановки в непосредственно следующую.
Правило такое: скажем, дана перестановка . Нужно двигаться по перестановке справа налево, пока впервые не увидим число, меньшее, чем предыдущее (в примере это 3 после 5). Это число, надо увеличить, поставив вместо него какое-то число из расположенных правее, от до . Число большее, чем , несомненно, найдется, так как . Если есть несколько больших чисел, то, очевидно, надо ставить меньшее из них. Пусть это будет . Затем число и все числа от до , не считая нужно упорядочить по возрастанию. В результате получится непосредственно следующая перестановка, в примере – . Потом получится (тот же алгоритм, но упрощенный случай) и т.д.
Нужно понимать, что в ЗК с n городами не нужны все перестановки из n элементов. Потому что перестановки, скажем, и (последний элемент соединен с первым) задают один и тот же тур, считанный сперва с города 1, а потом с города 3. Поэтому нужно зафиксировать начальный город 1 и присоединять к нему все перестановки из остальных элементов. Этот перебор даст разных туров, т.е. полный перебор в несимметричной ЗК (мы по-прежнему будем различать туры и ).
Данный алгоритм описан на языке Паскаль (см. Приложения).
Пример 2. Решим ЗК, поставленную в Примере 1 лексикографическим перебором. Приведенная выше программа напечатает города, составляющие лучший тур: и его длину 36.
Желательно усовершенствовать перебор, применив разум. В следующем пункте описан алгоритм, который реализует простую, но широко применимую и очень полезную идею.
2.3. Метод ветвей и границ
К идее метода ветвей и границ приходили многие исследователи, но Литтл с соавторами на основе указанного метода разработали удачный алгоритм решения ЗК и тем самым способствовали популяризации подхода. С тех пор метод ветвей и границ был успешно применен ко многим задачам, для решения ЗК было придумано несколько других модификаций метода, но в большинстве учебников излагается пионерская работа Литтла.
Общая идея тривиальна: нужно разделить огромное число перебираемых вариантов на классы и получить оценки (снизу – в задаче минимизации, сверху – в задаче максимизации) для этих классов, чтобы иметь возможность отбрасывать варианты не по одному, а целыми классами. Трудность состоит в том, чтобы найти такое разделение на классы (ветви) и такие оценки (границы), чтобы процедура была эффективной.
Изложим алгоритм Литтла на примере 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 |
- |
табл. 1 | ||||||
3. Практическое применение задачи коммивояжера
Кроме очевидного применения ЗК на практике, существует ещё ряд задач, сводимых к решению ЗК.
Задача о производстве красок. Имеется производственная линия для производства n красок разного цвета; обозначим эти краски номерами Всю производственную линию будем считать одним процессором. Будем считать также, что единовременно процессор производит только одну краску, поэтому краски нужно производить в некотором порядке. Поскольку производство циклическое, то краски надо производить в циклическом порядке . После окончания производства краски и перед началом производства краски j надо отмыть оборудование от краски . Для этого требуется время Очевидно, что зависит как от , так и от , и что, вообще говоря, . При некотором выбранном порядке придется на цикл производства красок потратить время.
Таким образом, ЗК и задача о минимизации времени переналадки – это просто одна задача, только варианты ее описаны разными словами.
Задача о дыропробивном прессе. Дыропробивной пресс производит большое число одинаковых панелей – металлических листов, в которых последовательно по одному пробиваются отверстия разной формы и величины. Схематически пресс можно представить в виде стола, двигающегося независимо по координатам x, y, и вращающегося над столом диска, по периметру которого расположены дыропробивные инструменты разной формы и величины. Каждый инструмент присутствует в одном экземпляре. Диск может вращаться одинаково в двух направлениях (координата вращения z). Имеется собственно пресс, который надавливает на подвешенный под него инструмент тогда, когда под инструмент подведена нужная точка листа.
Операция пробивки j-того отверстия характеризуется четверкой чисел ( , где - координаты нужного положения стола, - координата нужного положения диска и - время пробивки -того отверстия.
Производство
панелей носит циклический
Чтобы пробить
-тое отверстие
1. Переместить стол по оси x из положения в положение , затрачивая при этом время
Проделать то же самое по оси y, затратив время
Повернуть головку по кратчайшей из двух дуг из положения в положение zj, затратив время
Пробить j-тое отверстие, затратив время tj.
Конкретный вид функций зависит от механических свойств пресса и достаточно громоздок. Явно выписывать эти функции нет необходимости
Действия 1-3 (переналадка -того отверстия j-тое) происходит одновременно, и пробивка происходит немедленно после завершения самого длительного из этих действий. Поэтому
Теперь, как
и в предыдущем случае, задача составления
оптимальной программы для
Заключение
Изучены эвристический, приближенный и точный алгоритмы решения ЗК.Точные алгоритмы решения ЗК – это полный перебор или усовершенствованный перебор. Оба они, особенно первый, не эффективны при большом числе вершин графа.
Предложен собственный эффективный метод решения ЗК на основе построения выпуклого многоугольника и включения в него центральных вершин (городов).
Проведён анализ наиболее рациональных методов решения ЗК и определены области их эффективного действия: для малого числа вершин можно использовать точный метод лексического перебора; для большого числа вершин рациональнее применять метод ветвей и границ или метод автора работы (Анищенко Сергея Александровича).
Изучены практические применения ЗК и задачи с переналадками, сводимые к ЗК.
Приведены тексты программ, позволяющие решить ЗК различными методами.
Список литературы
1.О. Оре. Графы и их применение. Пер. с англ. под ред. И.М. Яглома. - М., «Мир», 1965, 174 с.
2.Ю. Н. Кузнецов, В.
И. Кузубов, А. Б. Волощенко.
Математическое программировани
3.Е. В. Маркова, А. Н. Лисенков. Комбинаторные планы в задачах. – М., Наука, 1979, 345 с.

- Задача коммивояжера
- Задача коммивояжера
- Задача коммивояжера
- Задача коммивояжёра
- Задача коммивояжера и задача о назначениях
- Задача коммивояжера и методы её решения
- Задача коммивояжора
- Задача динамического программирования
- Задача динамического программирования
- Задача Ердеша-Морделла
- Задача и порядок проведения анализа диагностики банкротства и пути его преодоления
- Задача и содержание работы школьных библиотек
- Задача квадратичного программирования и её решение симплекс-методом
- Задача комивояжера