Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Пермский национальный исследовательский политехнический университет» Кафедра ИТАС ЭТФ КУРСОВАЯ РАБОТА по дисциплине: «Дискретная математика» на тему: «Потоки в сетях» Выполнил студент гр. АСУ-13-1бз ____Борисов Вячеслав Владимирович___ __________013-ЭТФз-030_____________ (номер зачетной книжки) _____________________________________ (дата, подпись) Научный руководитель: _______________ (должность) _____________________________________ (Фамилия И.О) _____________________________________ (оценка) _____________________________________ (дата подпись) Пермь 2013 г. 1 ЗАДАНИЕ на курсовую работу по дисциплине: «Дискретная математика». Название курсовой работы: «Потоки в сетях» Цель курсовой работы: Изучить основные свойства сетей и рассмотреть практические задачи, решение которых сводится к основной задаче транспортных сетей о максимальном потоке. Порядок выполнения работы: 1) Изучить такие основополагающие понятия теории сетей, как ориентированный граф, сеть, поток сети и разрез сети. 2) Разобрать доказательство теоремы Форда-Фалкерсона о максимальном потоке и минимальном разрезе. 3) Рассмотреть прикладные задачи, решение которых сводить к построению максимального потока в сети. Требования к оформлению: Отчет по курсовой работе должен быть выполнен по требованиям ГОСТа. Отчет, презентация, тексты программ должны быть представлены на CD. Сроки выполнения:___________________________________________________ Дата сдачи и защиты:_________________________________________________ Задание выдано: ______________________ Исполнитель работы: студент группы АСУ-13-1бз Борисов Вячеслав Владимирович __________________ Руководитель курсовой работы: _______________________________________________________________ 2 Оглавление Введение. ..................................................................................................................................................... 3 1. Задача о максимальном потоке. ............................................................................................................ 7 1.1. Основные определения ................................................................................................................... 7 1.2. Метод Форда-Фалкерсона. .............................................................................................................. 8 1.3. Алгоритм расстановки пометок Форда-Фалкерсона...................................................................10 2. Простые варианты задачи о максимальном потоке. .........................................................................12 2.1. Графы со многими источниками и стоками. ................................................................................12 2.2. Графы с пропускными способностями дуг и вершин. .................................................................13 2.3. Графы, у которых пропускные способности дуг ограничены сверху и снизу. ..........................14 2.4. Транспортные сети с циклами. ......................................................................................................16 3. Прикладные задачи...............................................................................................................................17 3.1. Задача о допустимом потоке. .......................................................................................................17 3.2. Задача о максимальном паросочетании. .....................................................................................18 4. Программная реализация метода Форда-Фалкерсона. ....................................................................20 4.1. Структура данных для представления графа. ..............................................................................21 4.2. Реализация алгоритма пометок Форда-Фалкерсона. .................................................................23 Заключение. ...............................................................................................................................................30 Список использованной литературы. ......................................................................................................31 3 Введение. Одной из наиболее важных и интересных задач теории графов является определение максимального потока в сети. Предметом рассмотрения и объектом исследования этой задачи являются так называемые транспортные сети ориентированных графов, дугам которых – класс сопоставлены неотрицательные числа, именуемые пропускными способностями. Математическая абстракция транспортной сети весьма удобна для моделирования таких объектов как городской дорожный трафик, сеть трубопроводов, электрическая сеть или интегральная схема, и может быть использована для решения широкого диапазона прикладных задач, решение которых сводиться к нахождению максимального потока в сети. Данные задачи можно разбить на три общие категории, известные как задачи распределения, сопоставления и сечения. В задачах распределения выполняются перемещение объектов из одного места в сети в другое. Этими объектами могут быть товары, поступающие с завода-изготовителя, на склады или розничные магазины. Компания, владеющая этими заводами должна регулярно поставлять товары с фабрик в розничные торговые точки через оптовые базы, используя каналы распределения, которые обладают различными пропускными способностями и различными стоимостями доставки. Можно ли так организовать доставку товаров со складов в магазины, чтобы везде удовлетворить спрос? В подобной задаче нужно минимизировать стоимость доставки (без превышения пропускной способности транспортных каналов) продукции так, чтобы общая скорость её отгрузки с заводов была равна скорости её производства, а скорость доставки продукции была равна скорости сбыта товара в розничных магазинах. В задачах сопоставления сеть представляет возможные способы соединения пар вершин. Необходимо выбрать такие возможности соединения (в соответствии с указанным критерием), чтобы не выбрать ни одну из вершин дважды. Классическим примером задачи сопоставления является задача о трудоустройстве. Служба трудоустройства организует интервью для группы студентов с некоторым количеством компаний, в результате чего появляется ряд предложений работы. Если считать, что интервью с последующим предложением работы представляет взаимную заинтересованность студента и компании, то для обеих сторон выгодно добиваться максимального трудоустройства, то есть чтобы наибольшее число кандидатов получили работу, которая им интересна. 4 В задачах сечения из сети удаляются ребра, чтобы разбить сеть на две или большее количество частей. В них топология сети оптимизируется путем удаления избыточных каналов. Например, телефонную сеть можно представить в виде некоторого множества кабелей, которые соединяют телефонные аппараты с помощью коммутаторов так, что возможен коммутируемый путь через междугородние линии связи, соединяющий любые два заданных телефона. Каково максимальное количество междугородних линий, которые можно отключить без нарушения связи между любой парой телефонных коммутаторов? Как видно из приведенных примеров, диапазон задач, решаемых при помощи модели транспортных сетей, достаточно широк и охватывает самые разные области практической деятельности человека, что само по себе говорит о важности дальнейшего проведения исследований свойств и видов транспортных сетей и поиска методов решения, связанных с ними задач. Краеугольной задачей транспортных сетей является математическая задача о нахождении максимального потока. Впервые она была поставлена в 1955 году Т.Е. Харрисом совместно с генералом Ф.С. Россом, который предложил упрощенную модель железнодорожного транспортного потока. Вскоре после этого в 1962 году Л.Р. Фордом и Д.Р. Фалкерсоном был высказан в качестве гипотезы, а затем и установлен главный результат – теорема о максимальном потоке и минимальном разрезе, на основе которого разработан алгоритм решения задачи – метод Форда-Фалкерсона, известный также как метод расстановки пометок или метод расширения пути. Метод расстановки пометок будет рассмотрен в теоретической части данной курсовой работы, а в практической части будет разработана его реализация на языке программирования высокого уровня. Помимо метода расстановки пометок на сегодня также широко известен метод проталкивания напора, разработанный в 1986 году А. Гольдбергом и Р.Е. Тарьяном на основе различных уже известных алгоритмов. Ориентированный граф с сопоставленными дугам пропускными способностями является базовой и наиболее простой математической моделью транспортной сети, подобно идеальному газу в молекулярной физике. Однако реальные задачи, которые призвана решать эта модель, зачастую намного сложнее и выдвигают дополнительные требования, которые привели к различным обобщениям задачи о максимальном потоке. Некоторые из них (например - многопродуктовые сети) не могут быть преобразованы к базовой модели сети с одним источником и стоком, и к ним неприменим метод Форда- 5 Фалкерсона. Ниже приведены наиболее распространённые обобщения задачи о максимальном потоке: Задача нахождения потока минимальной стоимости. В данном классе задач, каждой дуге графа приписан верхний и нижний порог пропускной способности. В этом случае далеко не очевидно, что существует множество потоков, удовлетворяющих требованиями о максимальной и минимальной пропускной способности дуг. Однако если такое множество существует и если каждой дуге сети, также сопоставлена некоторая стоимость потока по этой дуге, возникает задача о нахождении такого потока из множества, который имеет наименьшую стоимость. Задача нахождения максимального потока между каждой парой вершин. Хотя такая задача может быть решена как n(n-1)/2 отдельных задач, это весьма трудоёмкий процесс. При нахождении кратчайших цепей между каждой парой вершин графа было установлено, что нет необходимости решать экземпляр задачи о максимальном потоке для каждой пары, и что существует подход для неориентированных графов, исключающий такую необходимость. Задача о многопродуктовом потоке рассматривает такие сети со многими источниками и стоками, что между каждой парой источника и стока протекает свой поток, со своим «продуктом». Примером такой сети может служить компьютерная сеть, в которой источниками и стоками являются связанные друг с другом терминалы, а «продуктами» - пакеты данных канала связи. В подобных сетях пропускная способность дуги является ограничением для суммы всех потоков всех видов продуктов, протекающих через данную дугу. В задаче о потоках с выигрышами с дуг сети снимается допущение, что величина потока на входе дуги равна величине потока на её выходе. В таком случае поток может поглощаться или умножаться самим графом. Примером сети потоков с выигрышами может служить электрическая сеть с резисторными катушками и конденсаторами или мозговая нейронная сеть человека. Для решения подобных задач разработаны собственные методики. Так для нахождения потока минимальной стоимости существует «алгоритм беспорядка» ФордаФалкерсона (Ford L.R., Fulkerson D.R. (1962), Flows in networks, Princeton University Press, Princeton.), а также алгоритм основанный на выявлении отрицательных циклов авторства Клейна (Klein M. (1967), A primal method for minimal cost flows with applications to the assigment and transposition problems. Man. Sci., 14, p 205.), Басакера и Гауэна (usacker R.G., Gowen P. J. (1961), A procedure for determining a family of minimal-cost network flow 6 patterns, Operations Reasearch Office, Technical papere 15.). Для нахождения максимального потока между каждой парой вершин существует алгоритм Гомори и Ху, наиболее эффективный в случае неориентированных графов (Gomory R.E., Hu T.C. (1964), Synthessis of a communication network, J. of SIAM (Appl. Math), 12, p. 348). Класс задач поиска многопродуктовых потоков менее изучен. Одна из наиболее современных работ, в которой рассмотрены алгоритмы нахождения многопродуктовых (нецелочисленных) потоков это статья «Новый метод решения многопродуктовой транспортной задачи.» (Гольштейн Е.Г., Соколов Н.А. Экономика и мат. методы. 1995 Т. 31. Вып. 2. С. 128-136.) и «Improved interior point algorithms for exact and approximate solution of multicommodity flow problems» (Proc. 6th Annual ACM-SIAM). Исчерпывающим текстом по алгоритмам вычисления сетевых потоков является книга Агуджи, Магнати и Орлина «Network Flows: Theory, Algorithms, and Applications» (Prentice Hall, 1993) В данной работе рассматриваются простые варианты задачи о максимальном потоке, решение которых может быть сведено к стандартной задаче. 7 1. Задача о максимальном потоке. 1.1. Основные определения Транспортной сетью называется ориентированный граф G=(V, E), каждой дуге (u, v) которого сопоставлено некоторое неотрицательное число c(u, v), называемое пропускной способностью. Источником сети s называется вершина, которой инцидентны только исходящие дуги. Стоком сети называется вершина t, которой инцидентны только входящие дуги. В транспортной сети может быть несколько источников и стоков. Такие сети называются сетями общего вида. Потоком сети называется функция 𝑓: 𝐸 → ℝ+, такая, что 1) Для любой дуги сети значение потока не отрицательно и не провещает пропускную способность дуги: ∀(𝑢, 𝑣) ∈ 𝐸 0 ≤ 𝑓(𝑢, 𝑣) ≤ 𝑐(𝑢, 𝑣) 2) Для любой вершины сети, кроме источника и стока, сумма потоков исходящих инцидентных ребер уравновешена отрицательной суммой потоков входящих ребер: ∀𝑣 ∈ 𝑉 − {𝑠, 𝑡}, ∑ 𝑓(𝑣, 𝑢) − ∑ 𝑓(𝑢, 𝑣) = 0 (𝑣,𝑢)∈𝐸 (𝑢,𝑣)∈𝐸 Величиной потока транспортной сети называется сумма потоков в дугах инцидентных источнику: 𝑤(𝑓) = ∑ 𝑓(𝑠, 𝑣) 𝑣∈𝑉 Разрезом 𝑃 транспортной сети G=(V,E) называется разбиение множества вершин на множества S и T = V- S, такие, что 𝑠 ∈ 𝑆, а 𝑡 ∈ 𝑇. Разрез сети состоит из двух подмножеств дуг: 𝑃+ - дуги, ведущие от S к T, и 𝑃− - дуги, ведущие от T к S. Пропускной способностью разреза C(P) называется сумма пропускных способностей дуг, начальные вершины которых лежат во множестве S, а конечные во множестве T. Минимальным разрезом сети является разрез, пропускная способность которого среди всех разрезов минимальна. 8 1.2. Метод Форда-Фалкерсона. Для нахождения максимального потока в сети мы будем использовать метод ФордаФалкерсона, основанный на конструктивном доказательстве теоремы о максимальном потоке и минимальном разрезе. Для данного метода существуют различные алгоритмы реализации, один из которых – «техника пометок», будем рассмотрен далее. Метод заключается в итеративном увеличении на величину 𝛿 некоторого начального потока (обычно – нулевого), до тех пор, пока в сети можно найти аугментальную (увеличивающую) цепь дуг от источника к стоку сети. Величина 𝛿 определяется как минимальное из всех дуг аугментальной цепи значение, на которую можно увеличить поток в дугах, ориентированных вдоль цепи от источника к стоку (прямых дугах), и уменьшить поток в дугах ориентированных от стока к источнику – обратных дугах. Если после очередного увеличения потока, в сети не удается найти новую такую цепь, то в сети существует разрез P из насыщенных прямых дуг 𝑃+ для которых 𝑓(𝑣, 𝑢) = с(𝑣, 𝑢), и следовательно поток в них увеличить больше нельзя, и не нагруженных обратных дуг 𝑃− для которых 𝑓(𝑣, 𝑢) = 0. В этом случае разрез P будет минимальным разрезом, и согласно теореме Форда-Фалкерсона: Максимальный поток в транспортной сети равен пропускной способности минимального разреза. max 𝑤(𝑓) = min 𝐶(𝑃) 𝑓 𝑃 Докажем эту теорему. Совершенно очевидно, что максимальный поток от источника к стоку не может превышать пропускную способность минимального разреза, так как любая цепь от s к t проходит хотя бы через одно из ребер разреза. Поэтому достаточно установить существование потока с таким значением. Определим разрез (S, T), рекурсивным применением следующих шагов: а) Начать, полагая, что множество S, содержит только источник: S={s} б) Если 𝑣 ∈ 𝑆, и кроме того 𝑓(𝑣, 𝑢) < 𝑐(𝑣, 𝑢) или 𝑐(𝑢, 𝑣) > 0, то включить 𝑢 во множество S, и повторять данный шаг до тех пор, пока множество S нельзя будет расширять дальше. в) Случай I. Допустим, что сток был включен во множество S. В этом случае существует такая «неориентированная» цепь ⟨𝑠, 𝑡⟩, что для каждой прямой дуги, используемой цепью, поток меньше пропускной способности дуги, а для каждой обратной дуги поток больше нуля. Такая цепь называется аугментальной. Для этой цепи можно найти число 𝛿, на которое можно увеличить величину потока: 𝛿 = min ∆(𝑒), ∆(𝑒) = { 𝑒∈⟨𝑠,𝑡⟩ 𝑐(𝑒) − 𝑓(𝑒) > 0, если 𝑒 − прямая дуга 𝑓(𝑒) > 0, если 𝑒 − обратная дуга 9 Если теперь прибавить величину 𝛿 к потоку во всех прямых дугах цепи, и вычесть из потока в обратных дугах, то получиться новый допустимый поток, на 𝛿 единиц больший, чем предыдущий. Это очевидно в силу того, что прибавление величины 𝛿 к потоку в прямых дугах не может привести к превыщению ни одной из пропускных способностей этих дуг, так как 𝛿 – минимальное значение разности 𝑐(𝑒) − 𝑓(𝑒), для всех прямых дуг. Аналогично, вычитание величины 𝛿 из потока в обратных дугах не может сделать поток в этих дугах отрицательным, так как 𝛿 является минимальным значением потока для всех обратных дуг цепи. Используя новый исправленный поток, можно повторить шаги (а) и (б) и определив новый разрез (S, T), повторить предыдущие рассуждения. г) Случай II. Допустим, что сток не был включен во множество S. В соответствии с шагом (б) 𝑓(𝑢, 𝑣) = 𝑐(𝑢, 𝑣), для всех (𝑢, 𝑣) ∈ 𝑃+ , и 𝑓(𝑢, 𝑣) = 0 для всех (𝑢, 𝑣) ∈ 𝑃 − . Следовательно, ∑ 𝑓(𝑢, 𝑣) = (𝑢,𝑣)∈𝑃+ ∑ 𝑐(𝑢, 𝑣) = 𝐶(𝑃) (𝑢,𝑣)∈𝑃+ и ∑ 𝑓(𝑢, 𝑣) = 0 (𝑢,𝑣)∈𝑃− Таким образом, величина потока равна величине разреза P: 𝑤(𝑓) = ∑ (𝑢,𝑣)∈𝑃+ 𝑓(𝑢, 𝑣) − ∑ 𝑓(𝑢, 𝑣) = 𝐶(𝑃) (𝑢,𝑣)∈𝑃− Так как в случае (I) (сток включен в S), поток все время увеличивается по крайней мере на единицу, то при целочисленности значений пропускных способностей дуг максимальный поток будет получен за конечное число шагов – как только возникнет случай (II), при котором сток невозможно включить во множество S. Величина этого потока будет равна пропускной способности текущего разреза P, который, следовательно, должен быть равен минимальному разрезу. Теорема доказана. 10 1.3. Алгоритм расстановки пометок Форда-Фалкерсона. Данный алгоритм впервые был предложен в 1956 году и является одной из первых реализаций метода Форда-Фалкерсона. Алгоритм использует ту же идею что и доказательство теоремы о максимальном потоке и минимальном разрезе из предыдущего раздела: он начинает свою работу с некоторого допустимого потока, а затем итеративно применяет к графу сети две фазы: поиск очередной аугментальной цепи от источника к стоку и последующее увеличение потока вдоль неё. Алгоритм завершает свою работу, если не удается найти ни одну такую цепь. Для поиска аугментальных цепей в транспортной сети, в алгоритме используется техника пометок. Каждой вершине 𝑢 может быть приписана пометка вида (±𝑣, 𝛿). Первое поле этой пометки – индекс или имя предшествующей вершины. Знак «+» перед ним означает, что поток вдоль дуги (𝑢, 𝑣) может быть увеличен на величину 𝛿. Минус же означает, что дуга (𝑣, 𝑢) – обратная и поток вдоль неё может быть уменьшен на величину 𝛿. Каждая вершина сетевого графа может находиться в одном из трех состояний: вершина просмотрена и ей приписана пометка; вершине приписана пометка, но она не просмотрена; вершине не приписана пометка. Присвоение пометки вершине u означает нахождение аугментальной цепи от s к u. Вначале все вершины не имеют пометок. Вот как работает данный алгоритм: Шаг 1. Присвоить s пометку (+𝑠, ∞) и поместить её в конец очереди не просмотренных вершин. Шаг 2. Извлечь из головы очереди очередную, не просмотренную вершину 𝑢; пусть у неё будет пометка (±𝑣, 𝛿(𝑢)). Каждой непомеченной вершине v, смежной с u: Если v образует с u прямую ненасыщенную дугу (𝑓(𝑢, 𝑣) < 𝑐(𝑢, 𝑣)), присвоить v пометку (+𝑢, 𝛿), где 𝛿 = min(𝛿(𝑢), 𝑐(𝑢, 𝑣) − 𝑓(𝑢, 𝑣)); Если (v, u) - обратная дуга и 𝑓(𝑢, 𝑣) > 0, присвоить v пометку (−𝑢, 𝛿), где 𝛿 = min(𝛿(𝑢), 𝑓(𝑢, 𝑣)); Теперь вершина u помечена и просмотрена, а вершине v присвоена пометка. Поместить вершину v в очередь не просмотренных вершин. Шаг 3. Повторять шаг 2 до тех пор, пока либо вершина t будет помечена и, тогда, перейти к шагу 4, либо t не будет помечена и никаких других пометок нельзя будет расставить. В последнем случае алгоритм заканчивает работу с максимальным потоком. Все помеченные к этому моменту вершины образуют множество S, а непомеченные – множество T минимального разреза P сети. Шаг 4. Положить, что u = t и перейти к шагу 5. 11 Шаг 5. Если вершина u имеет пометку (+𝑣, 𝛿(𝑢)) то увеличить поток вдоль дуги (𝑣, 𝑢) на величину 𝛿(𝑡). Если вершина u имеет пометку (−𝑣, 𝛿(𝑢)), уменьшить поток вдоль дуги (𝑢, 𝑣) на величину 𝛿(𝑡). Шаг 6. Если 𝑣 = 𝑠, стереть все пометки в графе и вернуться к шагу 1, используя новый улучшенный поток, найденный на шаге 5. Если 𝑣 ≠ 𝑠, то взять 𝑢 = 𝑣 и перейти к шагу 5. 12 2. Простые варианты задачи о максимальном потоке. Изложенный в предыдущем разделе метод Форда-Фалкерсона может быть успешно применен для стандартной задачи о максимальном потоке, при котором в транспортной сети существует только один источник и сток, нет циклов и дополнительных условий вроде пропускной способности вершин или стоимости потока для ребер. В ряде простых случаев, если в задаче присутствуют дополнительные условия или ограничения, её можно свести к стандартной формулировке. Далее будут рассмотрены такие сведения. 2.1. Графы со многими источниками и стоками. Рассмотрим транспортную сеть, в которой существует несколько источников и стоков, причем поток может идти от любого источника к любому стоку. Данный вариант задачи сводиться к стандартной путем добавления в граф нового искусственного источника s и нового стока t. От s к каждому источнику сети 𝑠𝑘 , проводятся дуги, для которых устанавливается пропускная способность равная бесконечности. Если же для источников сети задано ограничение в виде «скорости производства», для соответствующей дуги (𝑠, 𝑠𝑘 ) можно задать пропускную способность, равную этому ограничению. Аналогично, от каждого стока 𝑡𝑘 сети к новому искусственному стоку 𝑡 прокладывается дуга с неограниченной пропускной способностью, либо ограниченной «скоростью потребления» стока 𝑡𝑘 . Рисунок 2.1 Если каждому источнику сети сопоставлен свой сток, между которыми может идти свой свой собственный поток, то сеть является многопродуктовой. Подобная сеть не может быть сведена к стандартной указанным способом. 13 2.2. Графы с пропускными способностями дуг и вершин. Рассмотрим граф G, в котором помимо обычных пропускных способностей 𝑐(𝑢, 𝑣) в дугах, вершины также имеют пропускные способности 𝑤. Данный вариант задачи вводит новое ограничение, при котором поток, входящий в вершину, должен быть меньше и равен её пропускной способности. Требуется найти максимальный поток, между вершинами s и t графа. Задача сводиться к стандартной через определение нового графа 𝐺0 , в котором каждой исходной вершине 𝑣 соответствуют две новые вершины 𝑣 + и 𝑣 − , без пропускных способностей. В этом новом графе, каждой дуге (𝑢, 𝑣), которая входит в вершину 𝑣 графа G, соответствует дуга (𝑢− , 𝑣 + ). А каждой исходящей дуге (𝑣, 𝑘) для вершины 𝑣 графа G, в графе 𝐺0 соответствует дуга (𝑣 − , 𝑘 + ). Таким образом, каждая вершина 𝐺 как бы расщепляется на две и между половинками проводится новая искусственная дуга (𝑣 + , 𝑣 − ) с пропускной способностью, равной пропускной способности 𝑤 исходной вершины. Полученный после преобразования граф соответствует условиям стандартной задачи, в которой максимальный поток следует искать между вершинами 𝑠 + и 𝑡 − графа 𝐺0 . Следует заметить, что если минимальный разрез, не содержит ребра вида (𝑣 + , 𝑣 − ), то пропускные способности вершин графа пассивны и излишни. Подобный случай возникает, если пропускная способность каждой вершины графа выше, чем суммарная пропускная способность входящих в вершину дуг. Рисунок 2.2 14 Рисунок 2.3 2.3. Графы, у которых пропускные способности дуг ограничены сверху и снизу. Рассмотрим вариант задачи, в которой дугам графа 𝐺 сопоставлен верхний порог пропускной способности 𝑐(𝑢, 𝑣) и нижний порог 𝑟(𝑢, 𝑣). В данной формулировке задачи ставиться вопрос о существовании такого допустимого потока между s и t, который бы удовлетворял не только условию сохранения потока для каждой вершины (поток, входящий в вершину равен потоку исходящему из вершины), но и неравенствам 𝑟(𝑢, 𝑣) ≤ 𝑓(𝑢, 𝑣) ≤ 𝑐(𝑢, 𝑣). Сведение осуществляется путем добавления нового источника 𝑠𝑎 и нового стока 𝑡𝑎 . Для каждой дуги графа (𝑢, 𝑣) строятся две искусственные дуги (𝑠𝑎 , 𝑣) и (𝑢, 𝑡𝑎 ), с верхней пропускной способностью равной 𝑟(𝑢, 𝑣) и нижней пропускной способностью равной 0. Верхняя пропускная способность каждой дуги (𝑢, 𝑣) графа задается равной с′ (𝑢, 𝑣) = 𝑐(𝑢, 𝑣) − 𝑟(𝑢, 𝑣), а нижняя – нулю. Кроме того, между прежним источником s и стоком t строиться дуга (𝑡, 𝑠), с верхней пропускной способностью 𝑐(𝑡, 𝑠) = ∞ и нижней 𝑟(𝑡, 𝑠) = 0. Найдем максимальный поток между 𝑠𝑎 и 𝑡𝑎 . Если все дуги, выходящие из 𝑠𝑎 и входящие в 𝑡𝑎 насыщены (𝑓(𝑠𝑎 , 𝑢𝑖 ) = 𝑐(𝑠𝑎 , 𝑢𝑖 ), 𝑓(𝑣𝑗 , 𝑡𝑎 ) = 𝑐(𝑣𝑗 , 𝑡𝑎 )), то в сети существует допустимый поток со значением 𝑓(𝑡, 𝑠). 15 Рисунок 2.4 Рисунок 2.5 16 2.4. Транспортные сети с циклами. Поскольку нахождение максимального потока предполагает поиск путей от источника к стоку, наличие в графе циклов делает эту задачу NP-трудной, время решения которой полиноминально возрастает с увеличением числа вершин и ребер графа. Таким образом, применение алгоритма Форда-Фалкерсона становиться неэффективным в случае больших транспортных сетей. В случае ациклических графов задача поиска легко решается за линейное время. Поскольку транспортные сети с циклами на практике встречаются чаще, чем идеальные ациклические графы, наличие методик преобразования сети в ациклический граф значительно расширяет область применения алгоритма Форда-Фалкерсона. Рассмотрим такое преобразование. Пусть дана сеть G(V, E) с циклами. Построим на её основе новый двудольный граф 𝐺0 с 2|𝑉| + 2 вершинами и |𝐸| + 3|𝑉| ребрами и долями 𝑉1 и 𝑉2 . В новом графе каждой вершине 𝑢 исходной сети соответствуют две новые вершины 𝑢 ∈ 𝑉1 и 𝑢∗ ∈ 𝑉2, а каждому ребру (𝑢, 𝑣) – ребро (𝑢, 𝑣 ∗ ) с такой же пропускной способностью. Добавим в граф новый источник s и новый сток t и для каждой вершины 𝑢 исходного графа ребро (𝑠, 𝑢) и ребро (𝑢∗ , 𝑡), пропускная способность каждого из которых равна суммарной пропускной способности ребер, исходящих из вершины 𝑢 в сети G. Кроме того, добавим ребра из (𝑢, 𝑢∗ ) с пропускной способностью 𝐶 = ∑𝑒∈𝐸 𝑐(𝑒) + 1. Проведя данные преобразования мы получим удобную структуру транспортной сети, в которой нет циклов. На рисунке 2.6. показан пример графа с циклом, а на рисунке 2.7. соответствующий ему двудольный граф. Рисунок 2.6. Рисунок 2.7. 17 3. Прикладные задачи. В данном разделе будут рассмотрены наиболее известные прикладные задачи, которые можно свести к задаче о максимальном потоке и решить с помощью алгоритма ФордаФалкерсона. 3.1. Задача о допустимом потоке. Пусть дан граф транспортной сети 𝐺 = (𝑉, 𝐸)(рисунок 4.1. ). Предположим, что каждой вершине 𝑣 ∈ 𝑉 транспортной сети дан вес 𝑤(𝑣) - положительное или отрицательное число, который можно рассматривать как предложение (если 𝑤 > 0) или спрос (если 𝑤 < 0), а сумма всех весов вершины равна нулю: ∑ 𝑤(𝑣) = 0 𝑣∈𝑉 Будем считать поток допустимым, если разность между притоком и оттоком каждой вершины равна весу этой вершины: предложению – если разность положительна, и спросу, если разность отрицательна: ∑ 𝑓(𝑢, 𝑣) − ∑ 𝑓(𝑣, 𝑘) = 𝑤(𝑣) 𝑢∈Г+ (𝑣) 𝑘∈Г− (𝑣) Требуется определить, возможен ли в сети поток, который удовлетворял бы вышеуказанным условиям. Вершины с предложением соответствуют складам в задаче о распределении товаров, вершины со спросом соответствуют розничным торговым точкам, а ребра соответствуют дорогам на маршрутах грузоперевозок. Задача о допустимом потоке формализует задачу распределения товаров и отвечает на вопрос: можно ли найти такой способ доставки товаров, при котором предложение везде соответствует спросу. Для сведения поставленной задачи к задаче нахождения максимального потока, построим сеть 𝐺 ′ = (𝑉 ′ , 𝐸 ′ ) с теми же вершинами и ребрами, но без весов и вершин (рисунок 4.2.). Добавим вершину источника s, ребра из которого ведут в каждую вершину с положительным весом, пропускную способность ребра зададим равной предложению соответствующей вершины 𝑐(𝑠, 𝑢) = 𝑤(𝑢). Добавим сток t, в который ведут ребра из всех вершин с отрицательным весом, с пропускной способностью равной спросу этих вершин: 𝑐(𝑣, 𝑡) = −𝑤(𝑣). Найдем максимальный поток между s и t. В исходной сети имеется допустимый поток, тогда и только тогда, когда все ребра, инцидентные стоку и источнику насыщены: ∀ 𝑢 ∈ Г− (𝑠) ∶ 𝑓(𝑠, 𝑢) = 𝑐(𝑠, 𝑢), ∀ 𝑣 ∈ Г+ (𝑡) ∶ 𝑓(𝑣, 𝑡) = 𝑐(𝑣, 𝑡). 18 Рисунок 3.1 Рисунок 3.2 3.2. Задача о максимальном паросочетании. Пусть дан двудольный неориентированный граф 𝐺 = (𝑉, 𝐸), вершины которого разбиты на два непересекающихся подмножества 𝑉 = 𝐿 ∪ 𝑅. Притом, все ребра 𝐸 из проходят между 𝐿 и 𝑅. Паросочетанием называется подмножество ребер 𝑀 ⊆ 𝐸, такое, что для всех вершин 𝑣 ∈ 𝑉 в 𝑀 содержится не более одного ребра, инцидентного 𝑣. Вершина 𝑣 ∈ 𝑉 является связной паросочетанием 𝑀, если в 𝑀 есть ребро инцидентное 𝑣 в противном случае вершина называется открытой. Максимальным паросочетанием называется паросочетание максимальной мощности, т.е. такое паросочетание 𝑀, что для любого паросочетания 𝑀′ |𝑀| ≥ |𝑀′ |. Требуется найти такое максимальное паросочетание. Задача нахождения максимального паросочетания формализует задачу о трудоустройстве, упомянутую во введении. В этой задаче вершины подмножества 𝐿 графа представляют собой соискателей, а вершины подмножества 𝑅 – работодателей. Ребра, соединяющие вершины этих множеств соответствуют отношению «взаимной заинтересованности в трудоустройстве». Решение задачи максимального паросочетания приводит к максимально возможному трудойстройству. 19 Для решения задачи максимального паросочетания построим на базе графа 𝐺 ориентированный граф 𝐺 ′ = (𝑉 ′ , 𝐸 ′ ), в который добавим две новые вершины источника s и стока t. Таким образом 𝑉 ′ = 𝑉 ∪ {𝑠, 𝑡}. Если разбиение вершин в графе 𝐺 задано как 𝑉 = 𝐿 ∪ 𝑅, ориентированными ребрами 𝐺 ′ будут ребра, направленные из 𝐿 в 𝑅, а также |𝑉| новых ребер: 𝐸 = {(𝑠, 𝑢)|𝑢 ∈ 𝐿} ∪ {(𝑢, 𝑣)|𝑢 ∈ 𝐿, 𝑣 ∈ 𝑅, (𝑢, 𝑣) ∈ 𝐸} ∪ {(𝑣, 𝑡)|𝑣 ∈ 𝑅} Присвоив каждому ребру (𝑢, 𝑣) ∈ 𝐸 ′ пропускную способность 𝑐(𝑢, 𝑣) = 1, мы получим транспортную сеть с источником s и стоком t. Найдем максимальный поток в этой сети. Минимальный разрез 𝑀, найденный в результате выполнения алгоритма Форда-Фалкерсона, будет искомым максимальным паросочетанием. Рисунок 3.3 Рисунок 3.4 На рисунке 3.3 изображен неориентированный двудольный граф 𝐺, а на рисунке 3.4. построенная на его основе транспортная сеть 𝐺 ′ . Жирным черным цветом выделены ребра максимального паросочетания. 20 4. Программная реализация метода Форда-Фалкерсона. Для демонстрации алгоритмов решения задачи о максимальном потоке и её производных, описанных в разделах 2 и 3, разработаем прикладную программу, которая позволяет задать (в режиме визуального проектирования) граф транспортной сети, назначить свойства её ребрам и вершинам и отобразить результаты вычислений – значение максимального потока и ребра минимального разреза. Разрабатываемая программа должна уметь вычислять максимальный поток в сетях общего вида, в сетях с циклами, с заданной нижней пропускной способностью или пропускной способностью вершин, а также в сетях, комбинирующих данные условия и ограничения. В качестве типа реализуемой программы выбрано однодокументное (Single-Document Interface, SDI) приложение, где документом будет математическая модель транспортной сети. Пользователь может строить сложные модели сетей (например – нефтепроводов), с возможностью редактирования и сохранения результата работы на диске. Построенная модель может быть затем использована для анализа и расчетов. Для удобства разработки приложения такого типа были выбраны Microsoft Visual Studio 2008 в качестве среды разработки и библиотека MFC в качестве фреймворка. Библиотека MFC (Microsoft Foundation Classes) выбрана как наиболее популярное решение для однопользовательских (декстопных) приложений, интегрированное в среду разработки Visual Studio. В частности среда имеет специальные мастера - генераторы кода для создания каркаса минимального приложения, создания обработчиков событий, диалоговых окон и т.д. И тем самым позволяет сосредоточить усилия на реализации нужных алгоритмов. 21 4.1. Структура данных для представления графа. Существует два основных способа представления графов на ЭВМ – матрицы смежности и списки смежности. Матрицы смежности занимают больше места в памяти (порядка 𝑂(|𝑉|2 ) ) и обычно эффективны в случае плотных и насыщенных ребрами графов. Однако для представления транспортных сетей, где полная степень каждой вершины относительно невелика (при моделировании городского трафика из улиц и перекрестков, например, это число может быть равно четырем) по сравнению с общим количеством вершин, которое может достигать сотен, была выбрана более эффективная для подобных графов реализация в виде списка смежности. Для хранения информации о графе 𝐺(𝑉, 𝐸), ей требуется памяти порядка 𝑂(|𝑉| + |𝐸|), что значительно меньше квадрата количества вершин графа. Экономия памяти особенно важна, если для решения задачи требуется избавиться от циклов, путем построения графа с 2|𝑉| + 2 вершинами и |𝐸| + 3|𝑉| ребрами на основе исходного. Впрочем, за экономию памяти приходится расплачиваться большим временем доступа к информации о ребрах графа, когда требуется узнать, существует ли ребро между данной парой вершин. Постоянное в случае матриц смежности, для списков смежности время доступа в худшем случае может быть порядка 𝑂(Δ(𝐺)), где Δ(𝐺) – максимальная степень вершины графа. Однако в случае алгоритма Форда-Фалкерсона, где последовательно обрабатываются все ребра, этот фактор не имеет значения. Помимо информации о ребрах и смежности вершин, структура данных графа также должна хранить данные, связанные с каждой вершиной и каждым ребром. Так с ребром транспортной сети связана пропускная способность, нижняя пропускная способность и поток. А с вершиной – нижняя и верхняя пропускная способность и вес. Тем не менее, набор данных, связанных с вершинами и ребрами может меняться от задачи к задаче и для сохранения универсальности основной структуры данных мы воспользуемся механизмом шаблонов языка С++ и библиотекой STL для реализации таких структур данных, как массив переменной длины и связанный список. Ниже приведен шаблонный класс графа, заданного списками смежности: 22 В данном классе вершины задаются порядковыми индексами, начиная с нуля. Из-за особенности реализации в конструкторе класса требуется указать максимальное число вершин графа, которое по умолчанию принято равным 100, чего обычно достаточно для всех демонстрационных примеров. Для работы многих алгоритмов, в том числе Форда-Фалкерсона, часто требуется возможность перебора ребер, инцидентных определенной вершине. Так, для того чтобы вычислить итоговое значение величины потока в сети, алгоритм должен перебрать все ребра, инцидентные источнику и просуммировать их потоки. Поскольку способ перебора может различаться для каждой реализации типа графа, о которой алгоритм не должен знать, перечисление ребер производит специальный класс-итератор, конструктор которого принимает в качестве параметров ссылку на класс графа и вершину. Далее приведен интерфейс класса итератора и пример его использования. 23 4.2. Реализация алгоритма пометок Форда-Фалкерсона. Алгоритм выдвигает дополнительные требования к структуре данных графа. Наиболее важными из них является возможность увеличения потока в дугах и расстановка пометок в вершинах при поиске аугментальных цепей. Алгоритму также нужно знать, является ли текущая обрабатываемая дуга прямой или обратной, а текущая вершина – помеченной или просмотренной. 24 Для хранения значений пропускной способности и величины потока выбран целочисленный тип данных. Это необходимо для того чтобы, гарантировать нахождение максимального потока за конечное число шагов алгоритма Форда-Фалкерсона. Выбор типа с плавающей точкой привел бы к тому, что алгоритм увеличивал поток на все меньшее значение, так и не достигнув насыщения ребер минимального разреза. Наиболее важными методами класса являются from, который возвращает истину, если дуга исходит из вершины, индекс которой передан в качестве параметра, метод capacityRto возвращает значение на которое надо уменьшить (или увеличить) поток, чтобы дуга стала насыщенной или пустой и наконец addFlowRto, которая увеличивает (или уменьшает) поток в дуге, в зависимости от того, прямая она или обратная. Ниже дан интерфейс класса вершины транспортной сети. Он позволяет хранить комплексные пометки, из которых потом выбирается минимальное значение для увеличения потока в сети. 25 Задав классы NetworkFlowEdge и NetworkFlowVertex в качестве шаблонных параметров класса графа SparceMultiGraph, мы получим структуру данных, которая прекрасно подходит для моделирования транспортной сети: Сам алгоритм вычисления максимального потока также реализован в виде класса. Поскольку алгоритм Форда-Фалкерсона не единственный существующий алгоритм для решения подобной задачи, и существуют другие реализации, будет полезно предусмотреть возможность легкой замены одного алгоритма другим в вызывающих подпрограммах, используя свойство полиморфизма классов С++. Замена может быть статической (при компиляции), либо динамической (во время работы программы), когда пользователь выбирает нужную реализацию из списка. Нахождение максимального потока осуществляет функция calculateMaxFlow, которой передаются в качестве параметров индекс вершины-источника s и вершины-стока t. Значение максимального потока возвращается в переменной outMaxFlow, а множество ребер минимального разреза в связанном списке outCut. Далее приведена блок-схема функции calculateMaxFlow. На рисунке 4.1.показана общая схема алгоритма. Для краткости такие сложные шаги алгоритма как поиск нового пути в графе и увеличение потока показаны на ней предопределенными процессами и вынесены на отдельные диаграммы. Рисунок 4.2. показывает часть алгоритма (1), где происходит поиск новой аугментальной цепи. Схема на рисунке 4.3. отображает процесс увеличения потока в найденной цепи соответствующей процессу (2) на общей блок-схеме. Схема на рисунке 4.4. показывает процесс формирования и вывода результата работы алгоритма. 26 Рисунок 4.1. 27 Рисунок 4.2 28 Рисунок 4.3 29 Рисунок 4.4. 30 Заключение. В ходе выполнения данной курсовой работы был рассмотрен класс ориентированных графов, известных как транспортные сети и изучены их основные свойства. Была рассмотрена основная задача транспортных сетей – задача нахождения максимального потока и метод её решения основанный на доказательстве теоремы Форда-Фалкерсона о максимальном потоке и минимальном разрезе. Приведены алгоритм решения задачи о максимальном потоке и алгоритмы сведения вариантов задач о максимальном потоке к стандартной формулировке. Рассмотрены и формализованы прикладные задачи (задача о допустимом потоке и задача о максимальном паросочетании), и их сведения к задаче о максимальном потоке. На основе изученных алгоритмов осуществлены их программные реализации и разработана программа для визуального моделирования транспортных сетей с заданными свойствами. Проведены эксперименты по нахождению максимального потока в транспортных сетях с использованием созданной программы, в ходе которой была протестирована работа реализованных алгоритмов. 31 Список использованной литературы. 1. Н. Кристофидес, Теория графов, алгоритмический подход, Мир, 1978 2. Л.Р. Форд. Д.Р. Фалкерсон, Потоки в сетях, Мир, 1966. 3. Р. Седжвик, Алгоритмы на С++, И.Д. «Вильямс», 2011. 4. Т. Кормен, Алгоритмы: построение и анализ, И.Д. «Вильямс», 2012 5. Д. Шеферд, Программирование на Microsoft Visual C++.NET, “Русская редакция”, 2007.