
- •Практикум по дискретной математике.
- •Содержание.
- •Введение.
- •1. Элементы математической логики. Логика высказываний.
- •1.1. Основные определения.
- •1.2. Разложение логических (булевых) функций по переменным. Дизъюнктивная и конъюнктивная нормальные формы.
- •1.3. Логические законы.
- •2. Множества и отношения.
- •2.1. Множества и операции над ними. Связь с логикой высказываний.
- •Доказать тождества:
- •2.2. Отношения на множествах. Бинарные отношения.
- •2.3. Однородные отношения.
- •2.4. Функции как специальный вид отношений.
- •2.5. Алгебраические системы. Алгебра множеств и булева алгебра.
- •3. Теория графов.
- •3.1. Основные понятия теории графов.
- •3.2. Представление графов в эвм.
- •1. Представление матрицей смежности.
- •3.3. Изоморфизм графов.
- •3.4. Подграфы и части. Операции над графами.
- •3.5. Методы обхода (просмотра) вершин графов.
- •3.6. Маршруты, цепи, циклы. Связность и достижимость.
- •3.7. Вершинная и реберная связность графов. Мосты, блоки и точки сочленения.
- •3.8. Двудольные графы. Паросочетания.
- •3.9. Алгоритмы расчета кратчайших путей между вершинами графа.
- •3.10. Деревья и леса.
- •3.11. Специальные виды деревьев.
- •3.12. Сети. Потоки в сетях.
- •3.13. Элементы цикломатики. Циклы и коциклы. Фундаментальная система циклов и цикломатическое число.
- •3.14. Эйлеровы графы и эйлеровы циклы.
- •3.15. Гамильтоновы графы и гамильтоновы циклы.
- •3.16. Независимые и покрывающие множества. Задачи о раскраске.
3.15. Гамильтоновы графы и гамильтоновы циклы.
В
первом разделе упоминалась головоломка
Уильяма Гамильтона о кругосветном
путешествии, где требовалось обойти
20 вершин по развертке додэкаэдра и
вернуться в исходную точку (рис.3.26). В
честь него цикл, содержащий все вершины
графа ровно по одному разу, назвали
гамильтоновым
циклом, а
граф, содержащий такой цикл, - гамильтоновым
графом.
В отличие от задачи про эйлеров цикл, необходимые и достаточные условия существования в графе гамильтонова цикла до сих пор не найдены. Существует несколько теорем, определяющие достаточные условия существования гамильтонова цикла, среди которых наиболее известна теорема Дирака.
Теорема Дирака. Любой граф G с не менее чем тремя вершинами (p3) и минимальной степенью вершины (v)p/2 имеет гамильтонов цикл.
Математик Оре доказал более общую теорему, из которой теорема Дирака вытекает, как следствие. Но сначала заметим, что, наряду с понятием эйлеровой цепи, существует понятие гамильтоновой цепи. Гамильтоновой называется простая цепь, содержащая все вершины графа ровно по одному разу.
Теорема Оре. Если в графе G для любой пары вершин u,v выполняется условие (u)+(v)p-1, то граф имеет гамильтонову цепь. Если (u)+(v)p, то граф имеет гамильтонов цикл.
Ясно, что это достаточно жесткое условие, так как охватывает только графы с очень большим количеством ребер. В головоломке Гамильтона все вершины имеют степень 3, но гамильтонов цикл существует. Можете убедиться в этом сами.
Через сто лет после появления головоломки Гамильтона математик Татт, исследуя свойства гамильтоновых графов, получил самое «слабое» на сегодняшний день достаточное условие существования гамильтонова цикла. То есть описывающее наиболее широкий класс гамильтоновых графов.
Здесь следует вспомнить свойство планарности, о котором мы однажды говорили. Планарным называется граф, который можно разложить на плоскости без пересечения ребер.
Вспомним также, что такое k-связный граф. Число вершинной связности графа определяется, как минимальное число вершин, удаление которых приводит к увеличению количества компонент связности.
Теорема Татта. Каждый 4-х связный планарный граф имеет гамильтонов цикл.
Заметим, что граф, предложенный Гамильтоном, трехсвязен, поэтому данному условию тоже не удвлетворяет.
Мы не будем останавливаться более подробно на условиях существования гамильтонова цикла, а перейдем к более важной для практики задаче, которая называется задачей коммивояжера.
Предположим, что наш граф гамильтонов и на его дугах заданы веса cij, которые могут обозначать, например, стоимость проезда между населенными пунктами. Коммивояжер (бродячий торговец) должен побывать во всех этих пунктах и вернуться назад, затратив при этом минимум средств. То есть речь идет о построении гамильтонова цикла минимального веса.
В общем случае предполагается, что cij cji, то есть граф может быть и ориентированным, причем веса дуг (u,v) и (v,u) могут отличаться.
Решение задачи «в лоб» предполагает перебор всех возможных вариантов, то есть p! операций. Но если граф большой, это слишком дорогое удовольствие, поэтому разработаны приемы сокращения перебора. Наиболее распространенный из таких методов ограниченного перебора носит название «метод ветвей и границ».
Решение задачи коммивояжера методом ветвей и границ.
Рассмотрим дерево
перебора (дерево решений) и назовем его
T,
как мы называли упорядоченные корневые
деревья. Общий принцип решения методом
ветвей и границ такой: на каждом шаге
дерево решений разбивается на подмножества
ветвей
Затем вычисляется некоторая оценка,
которая служит критерием отсечения
заведомо бесперспективных ветвей.
Рассмотрим, как это выглядит в данной задаче. Будем иллюстрировать рассуждения на полном пятивершинном графе (точнее, ориентированном мультиграфе, где cij cji) с матрицей весов C. Очевидно, что этот граф гамильтонов. Матрица весов у нас будет следующая:
|
1 |
3 |
1 |
2 |
2 |
|
5 |
4 |
6 |
2 |
4 |
|
6 |
1 |
3 |
1 |
5 |
|
4 |
3 |
2 |
4 |
1 |
|
Основной операцией, на основе которой выполняется необходимая оценка, является приведение матрицы весов. Что это означает? Рассмотрим по шагам.
Введем обозначения: z – искомый гамильтонов цикл, l(z) – вес такого гамильтонова цикла.
Шаг 1. Получение нижней l0(z) и верхней L(z) оценок веса искомого гамильтонова цикла (построение границ решения).
Начнем с получения нижней оценки, так как именно она наиболее важна для решения задачи.
1.1. Выбираем min по каждой строке матрицы весов. Строка i у нас, как всегда, соответствует выходам из вершины vi, а столбец i - входам. То есть мы выбираем сначала минимальный по весу выход из каждой вершины.
Теперь из каждой строки матрицы вычтем соответствующее этой строке минимальное значение. Получаем матрицу:
|
0 |
2 |
0 |
1 |
0 |
|
3 |
2 |
4 |
1 |
3 |
|
5 |
0 |
2 |
0 |
4 |
|
3 |
2 |
1 |
3 |
0 |
|
Если бы в каждом столбце после вычитания оказалось по нулю, это означало бы, что из каждой вершины можно выйти по дуге минимального веса и в каждую вершину можно войти по дуге минимального веса. В этом случае вес гамильтонова цикла был бы равен l0(z)=6, то есть той сумме, которую мы получили. И вопрос был бы решен уже на первом шаге. Но у нас в третьем столбце нулей нет. Поэтому придется принять, что l(z)> l0(z), и продолжать поиск l(z).
1.2. Выбираем min по каждому столбцу, то есть, рассматриваем все дуги, по которым можно войти в каждую вершину vj. Повторяем то, что делали на первом шаге, только теперь для столбцов.
Теперь вычитаем из столбцов минимальные значения.
|
0 |
0 |
0 |
1 |
0 |
|
1 |
2 |
4 |
1 |
3 |
|
5 |
0 |
2 |
0 |
2 |
|
3 |
2 |
1 |
1 |
0 |
|
Полученный результат показывает, что минимальная дуга, по которой мы можем войти в вершину 3, - это c13=2. Теперь уже ясно, что l(z) l0(z)+ c13=8.
Таким образом, мы получили нижнюю оценку веса гамильтонова цикла. То, что мы проделали, называется приведением матриц по строке и столбцу. В приведенной матрице ненулевые значения представляют собой превышения над минимумом при входе и выходе из каждой вершины.
1.3. Для получения верхней оценки L(z) построим произвольный цикл методом поиска в глубину и посчитаем его вес по исходной матрице весов.
L(z)= c12+ c23+ c34+ c45+ c51=1+5+6+4+3=19.
Если бы мы получили, что l(z)=L(z), то это и был бы искомый гамильтонов цикл минимального веса. Но в нашем примере это не так. Мы, всего-навсего, имеем 8l(z)19, и нам придется продолжать поиск.
Шаг 2. Ветвление (разбиение дерева решений на подмножества). Теперь будем добавлять в цикл по одному ребру на основе следующей схемы.
Рассмотрим
два случая(рис.3.27).: 1) гамильтонов цикл
z
проходит через некоторую минимальную
по весу дугу (vi,vj);
2) гамильтонов цикл z
не проходит через эту дугу. Назовем эти
два варианта z(i,j)
и
соответственно. Они образуют две ветви
решений.
Рассмотрим оценки для каждой из этих ветвей. Для ветви z(i,j) остается нижняя оценка l(z)=8. Рассмотрим теперь оценку для ветви . Если путь не проходит через (i,j), то мы должны выйти из вершины i по какой-то дуге (i,k) и войти в вершину j по какой-то дуге (m,j). В наиболее удачном случае это будут дуги минимальных весов. Тогда
Таким образом, для каждого уже обнуленного перехода по ребру (i,j) можно получить нижнюю оценку превышения над минимумом, если мы пройдем мимо этого ребра.
Вычисляем такие оценки для всех дуг, обнуленных в процессе приведения матрицы, и в качестве альтернативы перехода выбираем вариант с максимальным значением ij. То есть, включаем в цикл то ребро, у которого альтернативный путь заведомо будет самым плохим.
Посмотрим, что получается в нашем примере. Для всех нулевых элементов нашей приведенной матрицы cij берем ребро с минимальным значением (по i-й строке), по которому можно выйти из вершины i в любую вершину, кроме j, и ребро с минимальным значением (по j-му столбцу), по которому можно войти в вершину j из любой вершины, кроме i.
12=0+0=0; 13=0+1=1; 14=0+0=0; 21=1+1=2; 35=1+1=2; 42=2+0=2; 54=1+0=1.
У нас получилось 3 одинаковых значения, берем первое: 21. После первого шага z={(2,1)}.
Теперь «склеим» вершины 2 и 1, чтобы вывести дугу (2,1) из рассмотрения. Для этого удалим из матрицы 2-ю строку и 1-й столбец, учитывая направление дуги в цикле. Получим матрицу весов меньшей размерности. В этой матрице заменим элемент c21 на символ , чтобы про него забыть, поскольку назад от 1 к 2 мы уже переходить не имеем права.
|
0 |
0 |
1 |
3 |
|
5 |
0 |
0 |
2 |
|
3 |
1 |
1 |
0 |
|
Теперь опять приводим полученную матрицу по строке и столбцу и вычисляем оценки ij.
Итак, нижняя оценка l(z) остается прежней: l10(z)=8.
Вычисляем оценки: 13=0+1=1; 14=0+0=0; 35=3+1=4; 42=2+1=3; 54=1+0=1.
Имеем: max=4, то есть, выбираем c35.
Склеиваем вершины 3 и 5, убирая из матрицы третью строку и пятый столбец, а обратный путь из 5 в 3 заменяем на .
|
0 |
0 |
0 |
2 |
|
1 |
|
0 |
После приведения этой матрицы нижняя оценка веса цикла остается прежней. Вычисляем оценки ij: 13=0+2=2; 14=0+0=0; 42=2+1=3, 54=1+0=1.
Выбираем c42. Склеиваем вершины 4 и 2, удаляя первую строку и третий столбец. Получаем
0 |
0 |
|
0 |
Здесь уже без приведения ясно, что нужно брать (1,3) и (5,4).
Итак, мы получили следующий гамильтонов цикл: (3,5),(5,4),(4,2),(2,1),(1,3). Вес этого цикла равен l(z)=1+1+1+2+3=8, что удовлетворяет ранее найденной нижней оценке.
Дерево решений
для рассмотренного примера выглядит
так, как показано на рис.3.28.
В рассмотренном нами случае мы имели полный набор вариантов перехода, поэтому использовали только нижнюю оценку границы решений. Но если граф не полный, то, действуя по рассмотренной схеме, на каком-то шаге после приведения матрицы мы можем получить превышение нижней оценки веса цикла над L(z). В этом случае цикл, построенный для верхней оценки L(z), и будет искомым решением задачи.
Упражнения.
1. Построить гамильтонов цикл минимального веса для графа со следующей матрицей весов.
|
8 |
2 |
3 |
5 |
1 |
1 |
|
7 |
|
1 |
4 |
2 |
|
|
5 |
2 |
1 |
7 |
|
|
|
6 |
1 |
2 |
5 |
4 |
3 |
|
4 |
6 |
|
5 |
|
2 |
|
2. Построить гамильтонов цикл минимального веса для графа со следующей матрицей весов.
|
1 |
7 |
|
5 |
|
3 |
|
3 |
5 |
5 |
4 |
3 |
1 |
|
|
3 |
4 |
|
2 |
|
|
4 |
6 |
3 |
3 |
2 |
1 |
|
7 |
|
6 |
2 |
1 |
2 |
|