- •Министерство образования и науки украины
- •Дискретная математика
- •0915 - “Компьютерная инженерия”
- •Содержание
- •Введение
- •Операции алгебры множеств
- •Теоретические сведения
- •Операция объединение множеств
- •Операция пересечение множеств
- •Операция разность множеств
- •Операция симметрическая разность множеств
- •Универсум
- •Дополнение множества
- •Множество всех подмножеств (булеан)
- •Логические функции и реляционные операторы
- •Основные орпределения
- •Теоретические сведения
- •Табличный способ задания логической функции
- •Матричный способ представления
- •Графический способ представления
- •Аналитический способ представления
- •Переход от табличной формы к аналитической
- •Минимизация функций методом Квайна – Мак-Класки
- •Минимизация логических функций методом Петрика
- •Переход от алгебры Буля к алгебре Жегалкина
- •Реляционный оператор Select (выборка)
- •Реляционный оператор Project (проекция)
- •Алгоритмы на графах
- •Теоретические сведения
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры нахождения кратчайшего пути в графе
- •Пример решения задачи нахождения кратчайшего пути
- •Задача нахождения наибольшего потока
- •Алгоритм Форда и Фалкерсона нахождения максимального потока транспортной сети
- •Пример нахождения максимального потока
- •Транспортная задача по критерию стоимости
- •Алгоритм метода частичных потоков
- •Пример решения транспортной задачи по критерию стоимости
- •Алгоритм Флёри нахождения эйлерова цикла
- •Пример решения задачи о коммивояжёре
- •Алгоритм Краскала нахождения остова минимального веса
- •Кодирование информации
- •6. Исправление ошибок в линейном систематическом коде.
- •7. Исправление ошибок в коде Хэмминга.
- •8. Исправление ошибок в циклическом коде.
- •Основные определения
- •Теоретические сведения
- •Построение онк по методике Шеннона-Фано
- •Построение онк по методике Хаффмена
- •Построение линейного систематического кода
- •Исправление ошибок в линейном систематическом коде
- •Построение кода Хємминга
- •Исправление ошибок в коде Хэмминга
- •Построение циклического кода
- •Исправление ошибок в циклическом коде
- •Алгоритмы теории чисел
- •Теоретические сведения
- •Вычисление степени числа а по модулю n
- •Алгоритм Евклида для нахождения наибольшего общего делителя
- •Вычисление обратных величин
- •Основные способы нахождения обратных величин
- •Расширенный алгоритм Евклида
- •Китайская теорема об остатках
Алгоритм Флёри нахождения эйлерова цикла
Естественно возникает вопрос: как найти хотя бы один эйлеров цикл в эйлеровом графе, пройдя по каждому ребру один раз и вернуться в начало.
2
3
1
4
6
5
Рисунок 3.14 – Граф с эйлеровым циклом
Указание эйлерова цикла равносильно выдаче некоторой нумерации ребер графа, соответствующей порядку их обходав цикле, проходящем через все ребра.
Нахождение эйлерова цикла в графе можно осуществить с помощью алгоритма Флёри:
1. Начиная с произвольной вершины х0 исходного графа Г0, присваиваем любому инцидентному ей ребру (х0, х1) номер 1. Удаляем ребро (х0, х1) из множества ребер графа Г0 , получая граф Г1 . Переходим в следующую вершину х1.
2. Пусть хk — вершина, в которую мы пришли после очередного шага нумерации ребра, получившего номер k. Для дальнейшей нумерации выбираем любое ребро графа Гk, инцидентное вершине хk, с учетом следующего правила: ребра, удаление которых из графа Гk повлечет нарушение его связности, выбираются только тогда, когда другой выбор осуществить нельзя.
3. Алгоритм заканчивает свою работу, когда получен цикл, т.е. выбрано ребро (х, х0), где х - некоторая вершина графа Г0.
Иначе – повторяем пункт 2.
4. Если получился цикл, но не ейлеров, то отбрасываем данную последнюю вершину и повторяем пункт 2.
Примечание:
Принцип действия алгоритма заключается в следующем. Начиная с произвольной вершины, строим путь, удаляя ребра и запоминая вершины в стеке, до тех пор пока множество смежности очередной вершины не окажется пустым, что означает, что путь удлинить нельзя. При этом мы обязательно придем в ту вершину, с которой начали. В противном случае это означало бы, что вершина х имеет нечетную степень, что невозможно по условию. Т.о., из графа были удалены все ребра цикла, а вершины цикла были сохранены в стеке S. При этом степени всех вершин остались четными. Далее вершина х выводится в качестве первой вершины эйлерова цикла, а процесс продолжается, начиная с вершины, стоящей на вершине стека.
2
1
5
3
1
2 4 6
9
3
4
7
6 8
5
Рисунок 3.15 – Граф после применения алгоритма Флёри
Пример решения задачи о коммивояжёре
Имеем граф с шестью вершинами и следующей матрицей смежности (таблица 3.8). Найти методом ветвей и границ гамильтонов цикл наименьшей длины.
Таблица 3.8 - Матрица смежности
i/j |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
|
68 |
73 |
24 |
70 |
9 |
2 |
58 |
|
16 |
44 |
11 |
92 |
3 |
63 |
9 |
|
86 |
13 |
18 |
4 |
17 |
34 |
76 |
|
52 |
70 |
5 |
60 |
18 |
3 |
45 |
|
58 |
6 |
16 |
82 |
11 |
60 |
48 |
|
Приведем данную матрицу по строкам и столбцам.
Таблица 3.9 - Приведённая матрица смежности с константами приведения по строкам и столбцам
i/j |
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
|
59 |
64 |
15 |
61 |
0 |
9 |
2 |
47 |
|
5 |
33 |
0 |
18 |
11 |
3 |
54 |
0 |
|
77 |
4 |
9 |
9 |
4 |
0 |
17 |
59 |
|
35 |
53 |
17 |
5 |
57 |
15 |
0 |
42 |
|
55 |
3 |
6 |
5 |
71 |
0 |
49 |
37 |
|
11 |
|
0 |
0 |
0 |
15 |
0 |
0 |
|
Сумма
констант приведения даёт некоторую
нижнюю границу длин всех гамильтоновых
путей:
.
Улучшили оценку за счёт приведения
матрицы по столбцам. Нижняя оценка длин
всех гамильтоновых путей:
.
Теперь
нужно просмотреть все нулевые элементы
матрицы и выбрать тот, для которого
сумма констант приведения матрицы,
получаемых заменой
на
была бы максимальной.
Подсчитаем эти суммы:
Максимальная
сумма соответствует дуге
.
Множество разбиваем на два подмножества, одно из которых включает дугу - подмножество В, а другое – не включает – подмножество А. В матрице элемент заменяем на бесконечность, из элементов четвёртой строки вычитаем 17, а из элементов первого столбца вычитаем 5.
Таблица
3.10 - Матрица смежности подмножества
i/j |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
|
59 |
64 |
0 |
61 |
0 |
2 |
42 |
|
5 |
18 |
0 |
81 |
3 |
49 |
0 |
|
62 |
4 |
9 |
4 |
|
0 |
42 |
|
18 |
36 |
5 |
52 |
15 |
0 |
27 |
|
55 |
6 |
0 |
71 |
0 |
34 |
37 |
|
Находим
оценку снизу подмножества
:
.
Включение
дуги
автоматически исключает из пути дуги
.Также
нужно исключить дугу
,
которая образует негамильтонов цикл
с дугой
.
Таблица
3.11 - Матрица смежности подмножества
i/j |
2 |
3 |
4 |
5 |
6 |
1 |
59 |
64 |
|
61 |
0 |
2 |
|
5 |
18 |
0 |
81 |
3 |
0 |
|
62 |
4 |
9 |
5 |
15 |
0 |
27 |
|
55 |
6 |
71 |
0 |
34 |
37 |
|
Эту
матрицу можно привести по четвёртому
столбцу, тем самым улучшить оценку на
18. Находим оценку снизу подмножества
:
.
Сравниваем
две оценки:
.
Для дальнейшего разбиения выбираем
подмножество
.
.
Таблица 3.12 - Приведённая матрица смежности подмножества
i/j |
2 |
3 |
4 |
5 |
6 |
1 |
59 |
64 |
|
61 |
0 |
2 |
|
5 |
0 |
0 |
81 |
3 |
0 |
|
44 |
4 |
9 |
5 |
15 |
0 |
9 |
|
55 |
6 |
71 |
0 |
16 |
37 |
|
Находим дугу в матрице, которая максимально увеличивает нижнюю оценку при её исключении, т.е. имеет максимальную сумму констант приведений:
Максимальная
сумма констант приведений соответствует
дуге
.
Исключение дуги
приводит к улучшению оценки на 68:
,
.
.
Включение дуги
в путь вызывает исключение в матрице
первой строки и шестого столбца.
Необходимо запретить контур
,
тем самым исключить из рассмотрения
дугу
.
,
для разбиения выбираем множество
.
Таблица
3.13 - Матрица смежности подмножества
i/j |
2 |
3 |
4 |
5 |
2 |
|
5 |
0 |
0 |
3 |
0 |
|
44 |
4 |
5 |
15 |
0 |
9 |
|
6 |
71 |
0 |
|
37 |
Подсчитываем
сумму констант:
.
Выбираем
дугу
,
считаем оценку снизу подмножества
:
.
Включение дуги
приводит к исключению третьего столбца
и шестой строки. Так же исключаем контур
,
запрещая дугу
.
Таблица
3.14 - Матрица смежности подмножества
i/j |
2 |
4 |
5 |
2 |
|
0 |
0 |
3 |
0 |
|
4 |
5 |
15 |
9 |
|
Матрицу
можно привести по пятой строке на девять
единиц. Нижняя оценка подмножества
:
.
Сравниваем две оценки:
.
Для дальнейшего разбиения выбираем
подмножество
,
.
Таблица 3.15 - Приведённая матрица смежности подмножества
i/j |
2 |
4 |
5 |
2 |
|
0 |
0 |
3 |
0 |
|
4 |
5 |
6 |
0 |
|
Подсчитываем
сумму констант, для которых
:
.
Исключение дуги
,
приводит к улучшению нижней оценки
подмножества
на 10:
.
Включение дуги запрещает третью строку
и второй столбик.
Таблица
3.16 - Матрица смежности подмножества
i/j |
4 |
5 |
2 |
|
0 |
5 |
0 |
|
Эта
матрица прямо указывает на то, что в
искомый маршрут необходимо включить
дуги
.
При этом нижняя оценка подмножества G
увеличится
на 10 и станет равной:
.
.
Подмножества Н
останется
без изменения:
.
Таким образом получили следующий гамильтонов цикл: (4, 1, 6, 3, 2, 5, 4). Длина его L = 102.
Сопоставляя
длину найденного маршрута с нижней
границей длин маршрутов подмножеств,
которые не были рассмотрены до конца,
видим, что рассмотрение большинства
из них не имеет смысла, так как их нижняя
граница превышает
.
Но может оказаться, что среди гамильтоновых
путей подмножества
,
у которого нижняя граница равна 97,
имеется путь меньшей длины.
Необходимо
исследовать данное подмножество по
матрице подмножества
(таблица 7.3). Нужно рассмотреть два
подмножества
.
Исключение дуги
приводит к увеличению оценки подмножества
:
.
Подмножество
можно исключить из пути, так как
.
Для
подмножества
включение дуги
означает изъятие из матрицы шестой
строки и первого столбца. Необходимо
запретить дугу
.
Таблица 3.17 - Матрица смежности подмножества
i/j |
2 |
3 |
4 |
5 |
6 |
1 |
59 |
64 |
0 |
61 |
|
2 |
|
5 |
18 |
0 |
81 |
3 |
0 |
|
62 |
4 |
9 |
4 |
0 |
42 |
|
18 |
36 |
5 |
15 |
0 |
27 |
|
55 |
Матрицу
можно привести по шестому столбцу путём
вычитания из всех элементов столбца
9. Тогда нижняя оценка подмножества
увеличится на 9:
.
И она станет больше, чем у подмножества
.
Значит лучшего решения в подмножестве
К нет.
Рисунок 3.16 - Гамильтонов путь
Построим дерево, иллюстрирующее алгоритм решения.
U
А
B
J K
C
D
E
F
G H
Рисунок 3.17 – Решение задачи о коммивояжёре в виде дерева
