Автор работы: Пользователь скрыл имя, 19 Марта 2015 в 14:07, реферат
Задача о коммивояжере удивительно просто формулируется: коммивояжер, выходящий из какого-нибудь города, желает посетить (n-1) других городов и вернуться к исходному пункту. Известны расстояния между всеми этими городами. Требуется установить в каком порядке он должен посещать города, чтобы общее пройденное расстояние было минимальным. Простота постановки задачи о коммивояжере сочетается с чрезвычайной трудностью ее решения, причем трудности не принципиального, а вычислительного характера, так как легко указать прием, прямо ведущий к цели: перебрать все маршруты и взять из них наименьший.
Введение………………………………………………………….…..…….3
Задача коммивояжёра………………………….……………………………5
Алгоритм локального поиска………………….…………………………..8
Интерфейс программы….……………… …………………………………14
Реализации метода локального поиска на ЭВМ……...………….………16
Заключение………………………..……..…………………………………19
Список литературы………………..…………………
Задача коммивояжёра
Коммивояжеру требуется посетить каждый город в пределах конкретной зоны обслуживания и возвратиться домой. Не приходится и говорить, что коммивояжеру хотелось бы выбрать такой порядок обхода клиентов, при котором его путь был возможно короче. Таким образом, коммивояжер сталкивается с задачей поиска маршрута минимальной протяженности, длительности или стоимости.
Задача коммивояжера может быть сформулирована как задача на графе в следующей постановке: построить граф G(Х, А), вершины которого соответствуют городам в зоне коммивояжера, а дуги отображают коммуникации, соединяющие пары городов. Пусть длина а(х, у)≥0 каждой дуги (х, у) ε А равна расстоянию, стоимости или времени. Контур, включающий каждую вершину графа G хотя бы один раз, называется маршрутом коммивояжера. Контур, включающий каждую вершину графа G ровно один раз, называется гамильтоновым контуром (по имени ирландского математика Вильяма Роуана Гамильтона, который в 1859 г. первым начал изучение этих задач).
Общей задачей коммивояжера называется задача поиска маршрута наименьшей общей длины. Задачей коммивояжера называется задача поиска гамильтонова контура наименьшей общей длины. Контур коммивояжера, имеющий наименьшую длину, называется оптимальным маршрутом коммивояжера и является оптимальным решением общей задачи коммивояжера. Гамильтонов контур наименьшей длины называется оптимальным гамильтоновым контуром и является оптимальным решением задачи коммивояжера.
Оптимальный маршрут коммивояжера не
обязательно является гамильтоновым контуром.
ТЕОРЕМА. Если для каждой пары вершин (х, у) графа
G выполняется условие а (х, у) ≤а (х,
z) + а (z, у) для всех z ≠ х, z ≠ у, то гамильтонов контур
является решением общей задачи коммивояжера
на графе G (если решение вообще существует).
Условие говорит только о том, что расстояние непосредственно от х до у никогда не превышает расстояния от х до у через любую другую вершину z. Условие называется неравенством треугольника.
ДОКАЗАТЕЛЬСТВО. Предположим, что не существует оптимального решения общей задачи коммивояжера, представляющего собой гамильтонов контур. Пусть С - любой оптимальный маршрут коммивояжера. Так как С не является гамильтоновым контуром, то некоторая вершина, скажем вершина z, повторяется в маршруте С по крайней мере дважды. Предположим, что первый раз коммивояжер в вершину z пришел из вершины х и вышел из нее в направлении вершины у. Изменим маршрут С таким образом, чтобы коммивояжер из вершины х, минуя z, направился прямо к вершине у. Полученный в результате маршрут С' также является маршрутом коммивояжера, поскольку в нем каждая вершина посещается по крайней мере один раз. Кроме того, в соответствии с условием, общая длина С' не превышает длины С. Заменяя С на С' и повторяя эту процедуру, мы получим другой маршрут C'' и т. д. В конце концов этот процесс приведет нас к оптимальному маршруту, являющемуся гамильтоновым контуром, так как каждый последующий маршрут имеет число дуг на единицу меньшее, чем его предшественник. Теорема доказана.
Из теоремы следует, что если граф G удовлетворяет
неравенству треугольника, то оптимальное
решение задачи коммивояжера на графе
G является оптимальным решением для общей
задачи коммивояжера на этом графе.
Есть простой способ избежать разработки
двух разных методов решения для задачи
коммивояжера и общей задачи коммивояжера.
Если граф G не удовлетворяет неравенству
треугольника, то следует заменить длину
а(х, у) каждой дуги (х, у), не удовлетворяющей
этому неравенству, длиной кратчайшего
пути от вершины х к вершине у.
Заметьте, что длина дуги от х к у отображает
теперь передвижение коммивояжера от
вершины х к вершине у вдоль кратчайшего
пути, соединяющего эти вершины, а не напрямую
из х в у, и длина удовлетворяет неравенству
треугольника. Если оптимальное решение
задачи коммивояжера на графе G включает
некоторую дугу (х, у), длина которой уменьшена
описанным выше способом, то в оптимальном
решении эту дугу следует заменять дугами,
входящими в кратчайший путь между вершинами
х и у.
Предположим, что мы желаем вместо гамильтонова контура наименьшей длины найти гамильтонов контур, имеющий максимальную длину. Пусть теперь через М обозначена наибольшая длина дуги в графе G. Пусть далее
а' (х, y)= М-а (х,
у)≥0 для всех дуг (х, у)
Каждый гамильтонов контур на графе G = (Х, А) содержит ровно |Х| дуг. Оптимальный (в смысле наименьшей длины) гамильтонов контур С включает дуги, преобразованные в соответствии с соотношением (1), и его общая длина равна
Таким образом, гамильтонов контур минимальной
длины, состоящий из преобразованных дуг,
эквивалентен гамильтонову контуру максимальной
длины, составленному из тех же дуг с исходной
(не преобразованной) длиной.
Следовательно, для нахождения гамильтонова
контура максимальной длины достаточно
решить задачу коммивояжера, предварительно
преобразовав длины дуг графа в соответствии
с (1). Однако не все графы имеют гамильтонов
контур. Например, граф, состоящий только
из двух вершин х и у и одной дуги (х, у),
такого контура не имеет.
Алгоритм локального поиска
Описанная ниже стратегия нередко приводит к оптимальному решению задачи.
Результирующее решение может, хотя и необязательно, оказаться оптимальным. В принципе, если «заданная совокупность преобразований» включает все преобразования, которые берут в качестве исходного одно решение и заменяют его каким-либо другим, процесс «улучшений» не закончится до тех пор, пока мы не получим оптимальное решение. Но в таком случае время выполнения пункта 2 окажется таким же, как и время, требующееся для анализа всех решений, поэтому описываемый подход в целом окажется достаточно бессмысленным.
Этот метод имеет смысл лишь в том случае, когда мы может ограничить нашу совокупность преобразований небольшим её подмножеством, что даёт возможность выполнить все преобразования за относительно короткое время: если «размер» задачи равняется n, то мы можем допустить O(n2) или O(n3) преобразований. Если совокупность преобразований невелика, естественно рассматривать решения, которые можно преобразовывать одно в другое, за один шаг, как « близкие». Такие преобразования называются «локальными». А соответствующий метод называется локальным поиском.
Одной из задач, которую можно решить именно методом локального поиска, является задача нахождения минимального остовного дерева. Локальными преобразованиями являются преобразования, в ходе которых мы берём то или иное ребро, не относящееся к текущему остовному дереву, добавляем его в это дерево (в результате мы должны получить цикл), а затем убираем из этого цикла в точности одно ребро (предположительно, ребро с наивысшей стоимостью), чтобы образовать новое дерево.
Рассмотрим, например, граф на рис. 10.16.
Мы можем начать с дерева, показанного на рис.а. Одно из преобразований, которые можно было бы выполнить, заключается в добавлении ребра (d,e) и устранении из образовавшегося цикла (e,a,c,d,e) какого-либо другого ребра. Если мы удалим ребро (а,е), то уменьшим стоимость дерева с 20 до 19. Это преобразование можно выполнить, получив в результате дерево (рис. б), к которому мы опять попытаемся применить улучшающее преобразование. Одно из таких преобразований сводится к вставке ребра (a,d) и удалению из образовавшегося цикла ребра (c,d). Результат этого преобразования показан на рисунке в. Затем можно вставить ребро (a,b) и убрать ребро (b,c), как показано на рис. г, а потом – вставить ребро (b,e) вместо ребра (d,e). Результирующее дерево (рис. д) является минимальным. Мы можем убедиться в том, что каждое ребро, не входящее в состав этого дерева, имеет наивысшую стоимость среди всех ребёр в цикле, который они с этим ребром составляют. Таким образом, к дереву на рис. г преобразования уже не применимы.
Время, которое занимает выполнение алгоритма в примере на графе из n узлов и е ребер, зависит от количества требующихся улучшений решения. Одно лишь проверка того факта, что преобразования уже не применимы, может занять O(ne) времени, поскольку для этого необходимо перебрать е ребер, а каждое из них может образовать цикл длиной примерно n.