Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 4. Взвешенные графы и орграфы, 2 часть.doc
Скачиваний:
10
Добавлен:
13.02.2016
Размер:
552.96 Кб
Скачать
    1. Проблема путешествующего купца

(проблеме коммивояжера)

Определение

Старинная задача звучит так:

Для заданного числа городов, сети дорог и известной стоимости путешествия из одного города в другой найти самый дешевый маршрут однократного посещения каждого города с обязательным возвратом в город-начало путешествия.

Эквивалентная формулировка проблемы коммивояжера в теории графов (орграфов):

Во взвешенном графе (орграфе) найти гамильтонов цикл наименьшего веса.

Класс сложности

Проблема коммивояжера относится к классу NP-тяжелых.

Точные алгоритмы

Известны точные алгоритмы решения проблемы коммивояжера:

  • Разные алгоритмы ветвей и границ, применяемые к расчету проблемы коммивояжера с 40-60 вершинами;

  • Специальные улучшения техники линейного программирования доводят число вершин до 120-300.

В 2001 году было найдено точное решение проблемы коммивояжера для 15112 немецких городов для одной из задач специальной библиотеки TSPLIB. Решение получено по алгоритму, использующему специальный вариант линейного программирования. Решение проводилось сетью из 100 процессоров. Общее время вычислений эквивалентно 22,6 годам для одного процессораAlpha500 мГц.

Эвристические алгоритмы

Известны различные эвристические алгоритмы решения проблемы коммивояжера, которые «быстро» находят «хорошие» решения с «высокой» точностью. Современные методы могут решить проблемы чрезвычайно большой размерности (миллионы вершин) за приемлемое время; решения отличаются, вероятно, на 2-3% от оптимального решения.

Проблема коммивояжера является пробным камнем, «оселком» для многих общих эвристических алгоритмов.

Особенно интересны алгоритмы, «подсмотренные» у природы:

  • Генетические алгоритмы (geneticalgorithms);

  • Эволюционное программирование (evolutionprogramming);

  • Нейро-сетевые вычисления (neuralnetworkcomputing);

  • ДНК-вычисления (DNA-computing);

  • Клеточные автоматы (cellblarautomata);

  • Муравьиные алгоритмы (antcolonyalgorithms).

Все достаточно точные эвристические алгоритмы для задач большой размерности очень сложны и могут быть реализованы только на компьютерах.

Простой графический алгоритм

Этот эвристический алгоритм находит верхнюю и нижнюю границу веса гамильтонова цикла во взвешенном полносвязном графе. Очевидно, что чем ближе будут верхняя и нижняя граница, тем точнее будет решение.

Алгоритм нахождения верхней границы проблемы путешествующего купца:

  1. Начать с конечного множества вершин числом 3 и более, соединенных попарно взвешенными рёбрами меньшего веса.

  2. Выбрать любую вершину и найти другую вершину, соединенную с выбранной вершиной ребром наименьшего веса.

  3. Найти вершину, которая связана с общими вершинами, идентифицированными на шаге (2), ребром с наименьшим весом. Нарисовать эти три вершины и три ребра, их соединяющего, в виде цикла.

  4. Найти вершину вне цикла, которая соединена с любой вершиной цикла ребром наименьшего веса. Зарисовать его вместе с вершиной. Обозначить эту новую вершину vn, а вершину цикла, к которой через ребро подсоединенаvn, черезvk. Кроме того, обозначитьvk-1вершину, предшествующуюvk, а черезvk+1– вершину, последующую после вершиныvk.

Если для весов ребер выполняется условие:

W(vk-1,vn) -W(vk-1,vk)W(vn,vk+1) -W(vk,vk+1),

то в существующем цикле заменить ребро {vk-1,vk} на два ребра {vk-1,vn} и{vn,vk} с вершинойvnмежду ними.

Если вышеуказанное условие не выполняется, то в существующем цикле заменяем ребро {vk,vk+1} на два ребра {vk,vn} и{vn,vk+1} с вершинойvnмежду ними.

  1. Повторить шаг 4 до тех пор, пока не образуется цикл, затем стоп. Полученный цикл является верхней границей решения проблемы путешествующего купца.

Пример

Применим данный алгоритм к полносвязному графу:

7

  1. Начальная вершина – а. Ребро наименьшего веса, соединяющее а с другими вершинами – {a,e}.

  1. Ребро наименьшего веса, соединяющее вершину а еще с одной вершиной – ребро {a,c}.

  1. Формируем цикл

  1. Ребро наименьшего веса вне цикла, инцидентное к одной из вершин (a,c,e) – ребро {b,c}.

  1. Вставляем ребра {c,b} и {a,b} с вершинойbмежду вершинамиaиc, а ребро {a,c}убираем:

6. Ребро наименьшего веса вне цикла, инцидентное к одной из вершин {a,b,c,e} – ребро {e,d}.

Обозначим:

vn=d,

vk-1 = a,

vk+1 = e,

vk=c

Запишем условие:

(w(a,d)=8)-(w(a,e)=2)< (w(d,c)=9)-(w(e,c)=4)

  1. Вставляем ребра {e,d}и {d,c} между вершинамиeиc, а ребро {c,t}убираем: