- •Дискретная математика
- •Введение
- •Лабораторная работа №1
- •1. Теоретический раздел
- •2. Примеры решения задач с использованием множеств
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №2
- •1. Теоретический раздел
- •2. Примеры решения задач
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №3
- •1. Теоретический раздел
- •2. Примеры решения задач
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №4
- •1. Теоретический раздел
- •2. Описание алгоритма фронта волны
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №5
- •1. Теоретический раздел
- •2. Описание алгоритма построения минимального остовного дерева
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №6
- •1. Теоретический раздел
- •2. Описание алгоритмов нахождения кратчайшего пути
- •2.1. Алгоритм Дейкстры нахождения минимального пути
- •2.2. Алгоритм нахождения минимального пути Форда-Беллмана
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №7
- •1. Теоретический раздел
- •2. Описание алгоритма нахождения полного потока
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Лабораторная работа №8
- •1. Теоретический раздел
- •2. Описание алгоритма нахождения максимального потока
- •3. Контрольные вопросы
- •4. Задания для самостоятельного решения
- •Литература
- •Дискретная математика
3. Контрольные вопросы
Ориентированное и неориентированное дерево.
Части дерева и их свойства.
Примеры ситуаций, в которых необходимо построить минимальное остовное дерево.
Алгоритм Краскала.
4. Задания для самостоятельного решения
1. Написать программу, реализующую алгоритм Краскала.
2. Используя алгоритм Краскала, построить минмальное остовное дерево:
Лабораторная работа №6
Тема лабораторной работы: Нахождение кратчайшего пути. Алгоритм Дейкстры, алгоритм Форда - Беллмана.
Цели лабораторной работы:
изучить задачу нахождения кратчайшего пути на практических примерах;
изучить алгоритм Дейкстры и алгоритм Форда – Беллмана;
написать программу, используя изученные алгоритмы;
закрепить практические навыки программирования.
1. Теоретический раздел
Задача о нахождении кратчайшего пути состоит в нахождении кратчайшего пути от заданной начальной вершины до заданной конечной вершины, при условии, что такой путь существует.
Можно дать много практических интерпретаций задачи о кратчайших путях. Например, вершины могут соответствовать городам и каждая дуга - некоторому пути, длина которого представлена весом дуги. Мы ищем кратчайшие пути между городами. Вес дуги может соответствовать стоимости (или времени) передачи информации между вершинами. В этом случае мы ищем самый дешевый (или самый скорый).
Мы рассмотрим головоломку о трех бидонах.
Восьмилитровый бидон заполнен некой жидкостью, а два бидона емкостью 5 и 3 литра пусты. Необходимо разделить 8 литров жидкости на две равные части, используя только три имеющихся бидона. Какое минимальное количество переливаний из бидона в бидон надо сделать, чтобы достичь желаемого результата?
В этой сетевой модели каждый узел будет соответствовать объемам жидкости в 8-, 5- и 3-литровом бидонах. Начальным узлом будет (8, 0, 0), а конечным - (4, 4, 0). Новый узел получается из текущего при однократном переливании жидкости из одного бидона в другой.
На рис. 7 показаны различные маршруты, ведущие от начального узла (8, 0, 0) к конечному (4, 4, 0). Таким образом, наша головоломка сведена к задаче определения кратчайшего пути между узлами (8, 0, 0) и (4, 4, 0).
Рис. 7. Головоломка о трех бидонах как задача вычисления кратчайшего пути.
Оптимальное решение, показанное в нижней части рис. 7, требует семи переливаний из бидона в бидон.
2. Описание алгоритмов нахождения кратчайшего пути
2.1. Алгоритм Дейкстры нахождения минимального пути
Для нахождения минимального пути между двумя произвольными вершинами для случая, когда все сij > О можно воспользоваться простым алгоритмом Дейкстры
Алгоритм Дейкстры.
Шаг 1. Установка начальных условий.
Ввести число вершин графа n и матрицу весов С = (сij). Ввести номер начальной вершины s и номер конечной вершины f.
Для начальной вершины s положить M(s) = О и считать эту пометку постоянной. Положить M(xi) для всех остальных вершин хi≠ s равными достаточно большому числу (например, 99999999) и считать эти пометки временными. Положить номер текущей вершины р = s. Сформировать множество П вершин с постоянной пометкой, вначале П= {р}, и множество В вершин с временной пометкой, В ={Х\П}.
Шаг 2. Обновление пометок.
Заполнить множество вершин G(p), являющихся образом вершины р. Для всех вершин xi G(p), имеющих временные пометки, т.е. для , изменить пометки следующим образом:
М(хi) - min (М(хi), М(р)+с(р,хi)).
Шаг 3. Превращение временных пометок в постоянные.
Из всех вершин, имеющих временные пометки, найти такую, для которой M(x*) = min(M(xi)).
Считать пометку вершины х* постоянной. Положить р = х*.
Шаг 4. Проверка, является ли найденный путь минимальным.
Если р =f, то М(р) является длиной минимального пути; перейти к шагу 6. Иначе перейти к шагу 5.
Шаг 5. Изменение множеств П и В.
Удалить номер вершины р из множества В и добавить номер вершины р в множество П. Перейти к шагу 2.
Шаг 6. Восстановление минимального пути.
Для любой вершины хi, предшествующая ей вершина xj определяется из соотношения:
M(xj)+c(xj,xi)=M(xi), хj G-1(xi) ∩ П,
где G-1(xi) - прообраз вершины xi.
Последовательно применяя это соотношение, начиная от последней вершины f, найдем минимальный путь.
Пример нахождения кратчайшего пути с помощью алгоритма Дейкстры.
Определим минимальный путь из вершины х1 а вершину х6 в нагруженном графе, изображенном на рис. 8.
Рис. 8
Рассмотрим подробно работу алгоритма Дейкстры для этого примера.
Шаг 1. Установка начальных условий.
Матрица весов имеет вид:
s=x1; M(s)=0; p= x1; П={ x1}; В={ x2, x3, x4, x5, x6}.
1-ая итерация.
Шаг 2. G(x1)={x2}; G(x1)∩B={x2}; M(x2)=min{∞,0+1}=1.
Шаг 3. x*= x2 ; p= x2.
Шаг 4. x2≠ x6
Шаг 5. П={x1,x2};B={x3,x4,x5,x6}.
2-ая итерация.
Шаг 2. G(x2)={x3,x4,x6};G(x2)∩B={x3,x4,x6};M(x3)=min{∞,1+5}=6;
M(x4)=min{∞,1+2}=3; M(x6)=min{∞,1+7}=8.
Шаг 3. x*= x4; p=x4.
Шаг 4. x2≠ x6
Шаг 5. П={x1,x2,x4};B={x3,x5,x6}.
3-ая итерация.
Шаг 2. G(x4)={x1,x3,x5};G(x4)∩B={x3,x5};
M(x3)=min{6,3+1}=4; M(x5)=min{∞,3+4}=7.
Шаг 3. x*= x3; p= x3.
Шаг 4. x3≠ x6
Шаг 5. П={x1,x2,x4,x3};B={x5, x6}. 4-ая итерация.
Шаг 2. G(x3)={x6}; G(x3)∩B={x6}; M(x6)=min{8,4+1}=5.
Шаг 3. x*= x6; p= x6.
Шаг 4. x6 = x6.
Переходим к шагу 6.
Прежде, чем перейти к восстановлению минимального пути, представим полученные результаты в виде таблицы, которой удобно пользоваться для расчетов (табл.1.)
Таблица 1.Восстановление минимального пути.
№ итерации |
p |
П |
М(П) |
В |
М(В) старые |
М(В) обновленные |
0 |
1 |
1 |
0 |
2 |
∞ |
1 |
|
|
|
|
3 |
∞ |
∞ |
|
|
|
|
4 |
∞ |
∞ |
|
|
|
|
5 |
∞ |
∞ |
|
|
|
|
6 |
∞ |
∞ |
|
|
|
|
|
|
|
1 |
2 |
1 |
0 |
3 |
∞ |
6 |
|
|
2 |
1 |
4 |
∞ |
3 |
|
|
|
|
5 |
∞ |
∞ |
|
|
|
|
6 |
∞ |
8 |
|
|
|
|
|
|
|
2 |
4 |
1 |
0 |
3 |
6 |
4 |
|
|
2 |
1 |
5 |
∞ |
7 |
|
|
4 |
3 |
6 |
8 |
8 |
|
|
|
|
|
|
|
3 |
3 |
1 |
9 |
5 |
7 |
7 |
|
|
2 |
1 |
6 |
8 |
5 |
|
|
4 |
3 |
|
|
|
|
|
3 |
4 |
|
|
|
4 |
6 |
|
|
|
|
|
Шаг 6. Определим вершину, предшествующую вершине х6
G-1(x6) ={x2,x3};
G-1(x6) ∩ П={x2,x3};
M(x2) + c(x2,x6) =1+7≠M(x6),
M(x3) + c(x3,x6) = 4+1=5=M(x6),
т.е. вершина x3 предшествует вершине x6.
Определим вершину, предшествующую вершине х3
G-1(x3) ={x2,x4};
G-1(x3) ∩ П={x2,x4};
M(x2) + c(x2,x3) =1+5≠M(x3),
M(x4) + c(x4,x3) = 3+1=4=M(x3),
т.е. вершина x4 предшествует вершине x3.
Определим вершину, предшествующую вершине х6
G-1(x4) ={x2};
G-1(x4) ∩ П={x2};
M(x2) + c(x2,x4) =1+2=3=M(x4),
т.е. вершина x3 предшествует вершине x3.
Определим вершину, предшествующую вершине х2
G-1(x2) ={x1};
G-1(x2) ∩ П={x1};
M(x1) + c(x1,x2) =0+1=1=M(x2),
т.е. вершина x1 предшествует вершине x2.
Итак, x1 x2 x4 х3 x6 есть минимальный путь из вершины х1 в вершину х6. Его длина равна 5.