Задачи и алгоритмы дискретной математики

Потоки в сетях, структура и принципы формирования алгоритма Форда-Фалкерсона, особенности его реализации программным методом. Минимальные остовные деревья. Алгоритм Борувки: понятие и назначение, сферы и специфика практического использования, реализация.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 15.06.2015
Размер файла 311,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

КУРСОВАЯ РАБОТА

Задачи и алгоритмы дискретной математики

Введение

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

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

алгоритм программный дискретный математика

1. Потоки в сетях: алгоритм Форда-Фалкерсона

1.1 Формулировка задания

­ изучить теоретические аспекты вопроса построения алгоритма Форда-Фалкерсона;

­ ручная реализация решения задачи нахождения максимального потока в транспортной сети;

­ по средствам выбранного мною языка программирования C# осуществить программную реализацию алгоритма Форда-Фалкерсона.

1.2 Изучение алгоритма

Так как алгоритм Форда-Фалкерсона решает задачу нахождения максимального потока в транспортной сети, следует ввести несколько понятий.

Транспортная сеть - это ориентированный граф, ребра которого имеют определенную не отрицательную пропускную способность и поток. Выделяют две такие вершины s (исток) и t (сток), что любые другие вершины находятся на пути из s в t.

Целочисленная транспортная сеть - транспортная сеть, все пропускные способности ребер которой - целые числа.

Остаточная сеть - это сеть, состоящая из тех ребер (называемых также остаточными) исходной сети, поток по которым можно увеличить. Заметим, что остаточное ребро не обязано быть ребром исходной сети. Такие ребра образуются, когда имеется поток в обратном направлении - ведь такие потоки можно уменьшить.

Идея алгоритма Форда-Фалкерсона заключается в том, чтобы выбрать произвольный путь от источника (s) к стоку (t), найти на этом пути минимальное значение остаточных пропускных способностей и увеличиваем поток на каждом ребре этого пути на найденное значение. Такие действия проделываются для всех возможных путей.

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

Пошаговое описание алгоритма:

1. Обнуляем все потоки. Остаточная сеть изначально совпадает с исходной сетью;

2. В остаточной сети находим любой путь из источника в сток. Если такого пути нет, останавливаемся;

3. Пускаем через найденный путь (он называется увеличивающим путём или увеличивающей цепью) максимально возможный поток;

4. На найденном пути в остаточной сети ищем ребро с минимальной пропускной способностью Cmin;

5. Для каждого ребра на найденном пути увеличиваем поток на Cmin, а в противоположном ему - уменьшаем на Cmin;

6. Модифицируем остаточную сеть. Для всех рёбер на найденном пути, а также для противоположных им рёбер, вычисляем новую пропускную способность. Если она стала ненулевой, добавляем ребро к остаточной сети, а если обнулилась, стираем его;

7. Возвращаемся на шаг 2.

Для поиска пути будем использовать метод «поиска в глубину» (или DFS, от англ. Depth-first search). Для каждой не пройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них.

Пусть задан граф G = (V, E), где V - множество вершин графа, E - множество ребер графа. Предположим, что в начальный момент времени все вершины графа окрашены в белый цвет. Выполним следующие действия:

1. Из множества всех белых вершин выберем любую вершину, обозначим её V1.

2. Выполняем для неё процедуру DFS(V1).

3. Повторяем шаги 1-3 до тех пор, пока множество белых вершин не пусто.

Процедура DFS (параметр - вершина )

1. Перекрашиваем вершину u в черный цвет.

2. Для всякой вершины w, смежной с вершиной u и окрашенной в белый цвет, выполняем процедуру DFS(w).

Для наглядности рассмотрим пример транспортной сети, и поиск в ней максимального потока.

Исходные данные

Пропускная

способность

поток

0-1

2

0

0-2

3

0

1-3

3

0

1-4

1

0

2-3

1

0

2-4

1

0

3-5

2

0

4-5

3

0

1. Проложим случайный путь и увеличим все потоки на 1 - максимально возможное, т.к. емкость 2-4 равна 1.

Пропускная

способность

поток

0-1

2

0

0-2

3

1

1-3

3

0

1-4

1

0

2-3

1

0

2-4

1

1

3-5

2

0

4-5

3

1

2. Проложим следующий путь

Пропускная

способность

поток

0-1

2

0

0-2

3

2

1-3

3

0

1-4

1

0

2-3

1

1

2-4

1

1

3-5

2

1

4-5

3

1

3. Проложим следующий путь. По этому пути поток не может следовать, т.к. 4-1 является «обратным» путем, и мы не можем сделать его меньше 0.

Пропускная

способность

поток

0-1

2

0

0-2

3

2

1-3

3

0

1-4

1

0

2-3

1

1

2-4

1

1

3-5

2

1

4-5

3

1

4. Следующий путь

Пропускная

способность

поток

0-1

2

2

0-2

3

2

1-3

3

2

1-4

1

0

2-3

1

1

2-4

1

1

3-5

2

2

4-5

3

1

5. Следующий путь

Пропускная

способность

поток

0-1

2

2

0-2

3

2

1-3

3

2

1-4

1

1

2-3

1

1

2-4

1

1

3-5

2

2

4-5

3

2

6. Следующий путь

Пропускная

способность

поток

0-1

2

2

0-2

3

2

1-3

3

3

1-4

1

1

2-3

1

0

2-4

1

1

3-5

2

2

4-5

3

3

Больше аугументальных путей не осталось. Максимальный поток данной транспортной сети равен 7.

1.3 Реализация алгоритма программным методом

Исходными данными в программной реализации будет матрица смежности. Матрица смежности графа G с конечным числом вершин n (пронумерованных числами от 1 до n) - это квадратная матрица A размера n, в которой значение элемента aij равно числу рёбер из i-й вершины графа в j-ю вершину.

В первой строке будет указано кол-во вершин нашего графа, например, 6.

6

0 10 5 0 0 8 0

0 0 0 5 3 0 4

0 0 0 4 5 10 0

0 0 0 0 4 0 9

0 0 0 0 0 5 6

0 0 0 0 0 0 0

Описание алгоритма работы программы:

1. Подключаются необходимые библиотеки и объявляются переменные

2. Считываются данные из текстового файла, который должен находиться в той же директории, что и исполняемый файл и называться data.txt

3. Заполняется матрица пропускных способностей из файла

4. Затем вызывается ф-ция max_flow (0, n-1) - это значит обход от 0, до (кол-во вершин - 1)

5. В max_flow объявляется ряд переменных, обнуляется значение «maxflow» - максимальный поток.

6. Создаем матрицу с нулевыми пропускными способностями

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

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

9. Цикл выполняется n раз.

10. Вывод результатов

Работа программы показана на рисунке 1.

Рисунок 1 - результат работы программы.

2. Минимальные остовные деревья: алгоритм Борувки

2.1 Формулировка задания

Изучить задачу «минимального остовного дерева в графе» алгоритмом Борввки и решить ее ручным, а так же программными методами.

2.2 Изучение задачи

Пусть G (V; E) связный неориентированный, тогда A - промежуточный остовный лес для графа V. На первом шаге A состоит из всех вершин G и пустого множества ребер. В начале очередной фазы алгоритма Борувки, для каждой компоненты связности промежуточного остовного леса выбирается «лидер» или «корень» - вершина, сопоставляемая каждой компоненте. Сделать это можно с помощью обхода A в глубину: вершина, с которой начинается обход очередной компоненты, и будет ее лидером.

Безопасным ребром E относительно некоторой компоненты связности K из A назовем ребро с минимальным весом, ровно один конец которого лежит в K.

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

Схема работы алгоритма представлена на рисунках 2-6.

Рисунок 2. Начальная фаза. Минимальный покрывающий лес состоит из всех вершин графа и пустого множества ребер

Рисунок 3. Для каждой компоненты связности (для каждой вершины) находим безопасные ребра. Они отмечены стрелками от компоненты вдоль безопасного ребра

Рисунок 4. Добавляем безопасные ребра к минимальному остовному лесу

Рисунок 5. Находим безопасные ребра для каждой компоненты связности

Рисунок 6. Добавляем найденные ребра. Минимальное остовное дерево построено

2.3 Программная реализация алгоритма

A < (V, 0)

while (пока) в A больше одной компоненты связности

do CHOOSE-LEADERS(A)

FIND-SAFE-EDGES(G)

foreach (для каждого) лидера v'

добавить safe(v') в A

return A

Вот простой возможный вид процедуры поиска безопасных ребер:

FIND-SAFE-EDGES(G)

foreach (для каждого) лидера v'

safe(v') < ?

foreach (для каждого) ребра (u, v) ? E

u' < leader(u)

v' < leader(v)

if u' ? v' then

if w (u, v) < w (safe(u')) then

safe(u') < (u, v)

if w (u, v) < w (safe(v')) then

safe(v') < (u, v)

Заключение

Итогом выполнения курсовой работы по дисциплине «Дискретная математика» на тему «Алгоритм Форда-Фалкерсона» является разработка программы, реализующей заданный алгоритм.

Работа по созданию программы позволила приобрести практические навыки по использованию методов программирования при решении задач теории графов.

Список используемых источников

1. Седжвик Р. Алгоритмы на C++. - Пер. с англ. - М.: Вильямс, 2011. - 1056 с.

2. Скиена С. Алгоритмы. Руководство по разработке. - 2-е изд.: пер. с англ. - СПб.: БХВ-Петербург, 2011. - 720 с.

3. Кристофидес Н. Теория графов. Алгоритмический подход. - Пер. с англ. - М.: Мир, 1978. - 432 с.

4. Окулов С.М. Дискретная математика. Теория и практика решения задач по информатике: учебное пособие. - М.: БИНОМ. Лаборатория знаний, 2008. - 422 с.

5. Акулич И.Л. C#. Программирование на языке высокого уровня: Учебник для вузов. - 1-е изд. - Санкт-Петербург.: Питер, 2010. - 423 с.

6. Подбельский В.В. Язык С#. Базовый курс. - 2- е изд., доп. - М.: Информ-Студио, 2011. - 384 с.

7. Мурлин А.Г., Мурлина В.А., Янаева М.В. Программирование с использование компонентов Windows Forms. Учебное пособие. Издательский дом ЮГ, 126 с.

8. Официальная документация по Visual C# и Visual Studio [Электронный ресурс] - Режим доступа: URL: - http://msdn.microsoft.com/ru-ru/library/kx37x362 (v=vs.90).aspx

Размещено на Allbest.ru


Подобные документы

  • Общая характеристика распространенных проблем поиска величины максимального потока в сети при помощи алгоритма Форда-Фалкерсона. Знакомство с задачами по дискретной математике. Рассмотрение особенностей и этапов постройки дерева кратчайших расстояний.

    контрольная работа [740,3 K], добавлен 09.03.2015

  • История слова "алгоритм", понятие, свойства, виды. Алгоритм Евклида, решето Эратосфена; математические алгоритмы при действии с числами и решении уравнений. Требования к алгоритмам: формализация входных данных, память, дискретность, детерминированность.

    реферат [1,1 M], добавлен 14.05.2015

  • Нахождение полинома Жегалкина методом неопределенных коэффициентов. Практическое применение жадного алгоритма. Венгерский метод решения задачи коммивояжера. Применение теории нечетких множеств для решения экономических задач в условиях неопределённости.

    курсовая работа [644,4 K], добавлен 16.05.2010

  • Основные понятия теории графов. Матричные способы задания графов. Выбор алгоритма Форда–Бэллмана для решения задачи поиска минимальных путей (маршрутов) в любую достижимую вершину нагруженного орграфа. Способы выделения пути с наименьшим числом дуг.

    курсовая работа [109,1 K], добавлен 22.01.2016

  • Изучение конкретного раздела дискретной математики. Решение 5-ти задач по изученной теме с методическим описанием. Методика составления и реализация в виде программы алгоритма по изученной теме. Порядок разработки программного интерфейса и руководства.

    курсовая работа [110,2 K], добавлен 27.04.2011

  • Эйлеровы цепи и циклы, теоремы. Алгоритм построения эйлерова цикла. Обоснование алгоритма. Нахождение кратчайших путей в графе. Алгоритм Форда отыскания кратчайшего пути. Задача отыскания кратчайших расстояний между всеми парами вершин. Алгоритм Флойда.

    реферат [108,4 K], добавлен 01.12.2008

  • Методы решения задачи коммивояжера. Математическая модель задачи коммивояжера. Алгоритм Литтла для нахождения минимального гамильтонова контура для графа с n вершинами. Решение задачи коммивояжера с помощью алгоритма Крускала и "деревянного" алгоритма.

    курсовая работа [118,7 K], добавлен 30.04.2011

  • Способы решения задач дискретной математики. Расчет кратчайшего пути между парами всех вершин в ориентированном и неориентированном графах с помощью использования алгоритма Флойда. Анализ задачи и методов ее решения. Разработка и характеристика программы.

    курсовая работа [951,4 K], добавлен 22.01.2014

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

    курсовая работа [225,0 K], добавлен 30.04.2011

  • Постановка задачи коммивояжера и основные алгоритмы решения. Маршруты и пути. Понятия транспортной сети. Понятие увеличивающая дуга, цепь, разрез. Алгоритм Флойда-Уоршелл. Решение задачи аналитическим методом. Создание приложения для решения задачи.

    курсовая работа [541,3 K], добавлен 08.10.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.