Смекни!
smekni.com

работа по курсу «Дискретная математика» Тема: Разработка алгоритма и программного обеспечения для решения прикладной задачи теории графов (стр. 8 из 11)


Рис. 3.

Паросочетание графа G называется максимальным, если оно не содержится в паросочетании с большим числом ребер, и наибольшим, если число ребер в нем наибольшее среди всех паросочетаний графа G.

Число ребер в наибольшем паросочетании графа G называется числом паросочетания и обозначается a1(G).

Независимые множества ребер графа G находятся во взаимно однозначном соответствии с независимыми множествами вершин реберного графа L(G)=(V1,X1), который для графа G=(V,X) определяется следующими двумя условиями:

1. V1 = X,

2. вершины х1 и х2 смежны в L(G) тогда и только тогда, когда ребра х1 и х2 смежны в G.


Рис. 4

На рис. 4 изображены два графа – G и L(G). Вершины графа G – темные кружки, вершины графа L(G) – светлые кружки. Ребра графа G – тонкие линии, ребра графа L(G) – жирные линии.

ЗАДАНИЕ 20. Найти все максимальные паросочетания в заданном графе, используя алгоритм с возвратом для нахождения независимых множеств вершин реберного графа.

ЗАДАНИЕ 21. Найти наибольшее паросочетание в заданном графе, используя алгоритм с возвратом для нахождения независимых множеств вершин реберного графа.

Раздел 3. Потоки в сетях и родственные задачи

3.1. Потоки в сетях

3.1.1 Полный поток в транспортной сети

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

Введем основные понятия данной теории.

Транспортной сетью называется орграф D = (V,X) с множеством вершин V = {v1,…,vn}, для которого выполняются условия:

1) существует одна и только одна вершина v1, называемая источником, такая, что Г-1 (v1) = Æ (т.е. ни одна дуга не заходит в v1),

2) существует одна и только одна вершина vn, называемая стоком, такая, что Г(vn) = Æ (т.е. из vn не исходит ни одной дуги),

3) каждой дуге xÎX поставлено в соответствие целое число c (x) ³ 0, называемое пропускной способностью дуги.

Функция j(x), определенная на множестве X дуг транспортной сети D и принимающая целочисленные значения, называется допустимым потоком (или просто потоком) в транспортной сети D, если

1) для любой дуги xÎX величина j(x), называемая потоком по дуге x, удовлетворяет условию 0 £ j(x) £ c(x),

2) для любой промежуточной вершины v сумма потоков по дугам, заходящим в v, равна сумме потоков по дугам, исходящим из v.

Величиной потока j в транспортной сети D называется величина, равная сумме потоков по всем дугам, заходящим в сток, или, что то же самое сумме потоков по всем дугам, исходящим из источника.

Дуга xÎX называется насыщенной, если поток по ней равен ее пропускной способности. Поток j называется полным, если любой путь в сети из источника в сток содержит, по крайней мере, одну насыщенную дугу.

А л г о р и т м

построения полного потока в сети

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: полный поток в сети.

1) Полагаем для любой дуги xÎХ j(x) = 0 ( начинаем с нулевого потока ).

2) Полагаем D* = D.

3) Удаляем из орграфа D* все дуги, являющиеся насыщенными при потоке j в транспортной сети D. Полученный орграф снова обозначим через D*.

4) Ищем в D* простую цепь m из v1 в vn . Если такой цепи нет, то j - искомый полный поток в транспортной сети D. В противном случае переходим к шагу 5.

5) Увеличиваем поток j(x) по каждой дуге x из m на одинаковую величину a>0 такую, что, по крайней мере, одна дуга из m окажется насыщенной, а потоки по всем остальным дугам из m не превышают их пропускных способностей. При этом величина потока j также увеличится на a, а сам поток j в транспортной сети D остается допустимым. После этого перейдем к шагу 3.

3.1.2 Максимальный поток

Поток j называется максимальным, если его величина принимает максимальное значение по сравнению с другими допустимыми потоками в транспортной сети D. Максимальный поток всегда является полным (обратное, вообще говоря, неверно).

Введем для заданной транспортной сети D и допустимого потока j в этой сети орграф приращений I(D,j), имеющий те же вершины, что и сеть D. Каждой дуге x = (v,w) Î X транспортной сети D в орграфе приращений I(D, j) соответствуют две дуги: x и x* = (w,v) – дуга, противоположная по направлению дуге x. Припишем дугам x и x* орграфа приращений I(D, j) длину l:

0, если j(x) < c(x),

l(x) =

¥, если j(x) = c(x),

0, если j(x) > 0,

l(x*) =

¥, если j(x) = 0.

А л г о р и т м

построения максимального потока

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: максимальный поток в сети.

1) Полагаем i = 0. Пусть j0 – любой допустимый поток в транспортной сети D (например, полный или нулевой).

2) По сети D и потоку ji строим орграф приращений I(D, ji).

3) Находим простую цепь mi, являющуюся минимальным путем из v1 в vn в нагруженном орграфе I(D, ji) (можно использовать любой описанный выше алгоритм). Если длина этой цепи равна ¥, то поток ji максимален и работа алгоритма заканчивается. В противном случае увеличиваем поток вдоль цепи mi на максимально допустимую величину ai > 0, где aiÎZ (прибавляя ее для каждой дуги xÎX, через которую проходит цепь mi, к уже имеющейся величине потока по дуге x, если дуга x входит в mi, и вычитая, если дуга x* входит в mi), такую, что при этом сохраняется условие допустимого потока. В результате меняется поток в транспортной сети D, т.е. от потока ji переходим к потоку ji+1, который является допустимым, и при этом величина его увеличивается на ai. Присваиваем i = i + 1 и переходим к шагу 2.

Алгоритм меток для нахождения максимального потока

Рассмотрим другой алгоритм построения максимального потока в транспортной сети, использующий метки вершин.

Помечивающий алгоритм Форда – Фалкерсона

для нахождения максимального потока

Данные: транспортная сеть D, заданная матрицей пропускных способностей дуг.

Результат: максимальный поток в сети.

1) Построить произвольный поток φ на транспортной сети D (например, положить φ(u) = 0 для любой дуги u ).

2) Просмотреть пути, соединяющие вход сети v1 с выходом vn. Если поток φ полный, то перейти к п.4.

3) В противном случае рассмотреть путь μ, соединяющий вход сети v1 с выходом vn, все дуги которого не насыщены. Построить новый поток φ´:

где

. Повторить этот процесс до получения

полного потока φ.

4) Присвоить целочисленные метки вершинам сети D и знаки «+» или «-» дугам по правилам:

· входу v1 присвоить метку 0,

· если вершина vi получила некоторую метку, а y - еще непомеченная вершина, то вершине y

Гvi, такой что φ((vi,y))<c((vi,y)) присвоить метку i, а дуге (vi,y) – знак «+»; вершине y
Г-1vi , такой, что φ((y,vi))>0, присвоить метку i, а дуге (y,vi) – «-». Остальные непомеченные вершины и дуги метки и знаки не получают;

· повторять процесс, описанный в предыдущем пункте до тех пор, пока не прекратится появление новых отмеченных вершин и дуг. Если в результате выполнения этого пункта вершина vn не получит метки, то поток является максимальным. В противном случае перейти к п.5.

5) Рассмотреть последовательность отмеченных вершин λ=(vn, vi1, vi2,…,v1), каждая из которых имеет метку, равную номеру последующей вершины, и последовательность μ (не обязательно путь), соединяющих последовательные вершины из λ. Построить новый поток φ´:

Перейти к пункту 4.

Пример. Рассмотрим транспортную сеть D и полный поток φ, для которого

= 14:

2

(1,+)