Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций ДМ.doc
Скачиваний:
25
Добавлен:
16.11.2019
Размер:
3.29 Mб
Скачать

4.6.2 Алгоритм Флёри нахождения эйлерова цикла

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

2

3

1

4

6

5

Рисунок 4.22 – Граф с эйлеровым циклом

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

Нахождение эйлерова цикла в графе можно осуществить с помощью алгоритма Флёри:

1. Начиная с произвольной вершины х0 исходного графа Г0, присваиваем любому инцидентному ей ребру (х0, х1) номер 1. Удаляем ребро (х0, х1) из множества ребер графа Г0 , получая граф Г1 . Переходим в следующую вершину х1.

2. Пусть хk вершина, в которую мы пришли после очередного шага нумерации ребра, получившего номер k. Для дальнейшей нумерации выбираем любое ребро графа Гk, инцидентное вершине хk, с учетом следующего правила: ребра, удаление которых из графа Гk повлечет нарушение его связности, выбираются только тогда, когда другой выбор осуществить нельзя.

3. Алгоритм заканчивает свою работу, когда получен цикл, т.е. выбрано ребро (х, х0), где х - некоторая вершина графа Г0.

Иначе – повторяем пункт 2.

4. Если получился цикл, но не ейлеров, то отбрасываем данную последнюю вершину и повторяем пункт 2.

4.6.3 Гамильтоновы циклы

Граф называется гамилътоновым, если в нем имеется простой цикл, проходящий через каждую вершину этого графа (по одному разу). Сам этот цикл также называется гамилътоновым.

Слово “гамильтонов” в этих определениях связано с именем известного ирландского мате­матика Уильяма Гамильтона, которым в 1859 году предложена игра “Кругосветное путешествие”. Каждой из двадцати вершин додекаэдра приписано название одного из крупных городов мира. Требуется, переходя от одного города к другому по ребрам додекаэдра, посетить каждый город в точности один раз и вернуться в исходный город. Эта задача, очевидно, сводится к отысканию в графе до­декаэдра простого цикла, проходящего через каждую вершину этого графа.

Рисунок 4.23 - Додекаэдр игры “Кругосветное путешествие”

В произвольном графе может быть, в отличие от эйлеровых, множество гамильтоновых циклов. Однако не существует сформулированного условия существования гамильтонового цикла (необходимость и достаточность). Нет также и эффективного алгоритма его построения.

Примером нахождения гамильтонового цикла является задача о коммивояжёре. Коммивояжёр (фр. commisvoyageur) – разъездной представитель торговой фирмы, предлагающий покупателям товары по имеющимся у него образцам.

В этой задаче считается, что имеется n городов, которые непременно должен посетить коммивояжёр, - все и ровно по одному разу, проделав путь между городами наименьшей суммарной протяженности.

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

Эта задача имеет большое практическое и теоретическое значение. В силу своей вычислительной сложности - при полном переборе существует (n - 1) • (n - 2) • … • 2 • 1 = (n - 1)  решений (т.е. сгенерировать все возможные перестановки вершин полного графа, подсчитать для каждой перестановки длину маршрута и выбрать из них кратчайший), равносильной целому классу переборных задач, она часто используется математиками для сравнительного анализа и изучения сложности алгоритмов оптимизации в дискретной математике.

Таким образом, решение задачи о коммивояжёре методом полного перебора оказывается практически неосуществимым даже для сравнительно небольших n.

Более того, известно, что задача о коммивояжёре принадлежит к числу так называемых NP – полных задач, суть которых вкратце такова. В различных областях дискретной математики, комбинаторики, логики и т.п. известно множество задач, принадлежащих к числу наиболее фундаментальных, для которых, несмотря на все усилия, не удалось найти алгоритмов решения, имеющих полиномиальную трудоемкость. Более того, если бы удалось отыскать эффективный алгоритм решения хотя бы одной из этих задач, то из этого немедленно следовало бы существование эффективных алгоритмов для всех остальных задач данного класса. На этом основано общепринятое мнение, что таких алгоритмов не существует.

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

  1. Эвристический.

  2. Монте-Карло (статистические выборки).

  3. Целочисленного линейного программирования.

  4. Динамического программирования.