Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
UchebnoePosobie.doc
Скачиваний:
72
Добавлен:
11.11.2019
Размер:
6.36 Mб
Скачать

3.5.4. Поиск максимального потока в сети

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

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

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

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

Объем информации, энергии или вещества, передаваемый в сети от узла xi к узлу xj, называют потоком и обозначают ij.

Наибольший поток, который может пропустить дуга (xi, xj), называют пропускной способностью дуги и обозначают сij.

Очевидно, что 0ij сij.

В вершине-истоке х0 величина потока есть сумма потоков по всем дугам, исходящим из вершины х0, т.е. =i0i+.

В вершине-стоке хk величина потока есть сумма потоков по всем дугам, заходящим в вершину хk, т.е. =iik-.

Для любой промежуточной вершины хi сумма исходящих потоков равна сумме заходящих потоков, т.е. jij+=kik-.

На рис. 3.29 показана условная сеть, содержащая вершину-исток х0, вершину-сток хk и две промежуточные вершины хi и хj. На каждой дуге в круглых скобках приведены обозначения потока и пропускной способности соответствующей дуги. При этом поток, подводимый к сети равен =(0i+0j), поток отводимый от сети равен =(ik+jk), поток из вершины хi в вершину хj равен ij. Для вершины хi имеем 0i=(ij+ik), для вершину хj - jk=(0j+ij).

Если множество вершин графа разбить на два непересекающихся подмножества, одно из которых содержит вершину-исток, а другое - вершину-сток, то множество дуг, соединяющих эти два множества, формируют разрез Аi, пропускная способность которого равна сумме пропускных способностей дуг. Таких разрезов может быть несколько.

В таблице приведены четыре разреза для сети на рис. 3.29

Разрез

пропускная способность дуги Сij

пропускная

способность

С0 i

С0 j

Сi j

Сi k

Сjk

разреза С(Ai)

А1

1

1

0

0

0

С0i+ С0j

А2

0

1

1

1

0

С0jijik

А3

0

0

0

1

1

Сikjk

А4

1

0

1

0

1

С0iijjk


Например, для разреза А1 имеем Х’={x0} и X\Х’={хi, хj, хk}, для А2 - Х’={х0, хi} и X\Х’={хj, хk}, для А3 - Х’={х0, хi, xj} и X\Х’={хk}, для А4 - Х’={х0, хj} и X\Х’={xi, хk}.

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

max=min{С(Ai)}

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

Для поиска распределения потока по дугам разработано несколько алгоритмов. Особое место среди них занимает алгоритм Форда-Фалкерсона, суть которого состоит в разметке вершин графа.

Метка вершины графа указывает на возможность изменения потока через данную вершину и указывает источник этого изменения. На рис. 3.30 дан фрагмент сети, объясняющий суть алгоритма.

Если по дуге (хs, хi) возможно увеличение потока ( si< csi), то вершину хi следует пометить +s , что указывает на источник увеличения потока.

Если по дуге (хi, хj) возможно увеличение потока  ij< cij, то вершину хj пометить +i . Это означает, что приращение потока si пойдет по направлению дуги (хi, хj) от вершины хs.

Если насыщена дуга (хs, хi), т.е.  si=csi, то метку +s нельзя ставить у вершины хi. Следовательно, если вершина xi не помечена, то у вершины xj нельзя ставить метку +i.

Если по дуге (хt, хj) возможно увеличение потока, т.е.  tj< ctj, то вершину хj следует пометить +t , что указывает на источник увеличения потока.

Если вершина хj не имеет пометки +i , то для увеличения потока в фрагменте сети, следует уменьшить поток в дуге (хi, хj) и направить его далее по другим дугам фрагмента на сток. Для указания этого у вершины xi ставят метку – j. Это означает что при общем приращении потока на участке (хi, хj) он должен быть уменьшен на величину tj.

Если насыщена дуга (хt, хj), т.е.  tj=ctj, то метку +t нельзя ставить у вершины хj. Следовательно, если вершина xj не помечена, то у вершины xi нельзя ставить метку -j.

Если насыщены обе дуги (хs, хi) и (хt, хj), что означает невозможность приращения потока  si и  tj, то нельзя ставить метки у вершин xi и xj и продолжения разметки следующих вершин сети до вершины-стока.

Так достигают максимального значения потока от вершин-истоков хs и хt по дугам к вершинам - стокам хi и хj.

Алгоритм Форда-Фалкерсона:

шаг 1: присвоить всем вершинам графа индексы 0,1,2,...k; где 0-индекс вершины-истока графа, k -индекс вершины-стока графа;

шаг 2: присвоить начальной вершине метку “0”;

шаг 3: все непомеченные вершины хi, в которые идут ненасыщенные дуги из помеченной вершины хs, пометить индексом “+s”, что свидетельствует о возможности увеличения потока из вершины хs по дуге (хs, хi);

шаг 4: все непомеченные вершины хi, из которых идут дуги (насыщенные или ненасыщенные) в помеченную вершину хj, пометить индексом “-j”, что свидетельствует о возможности уменьшения потока в вершину хj по дуге (хi, хj);

шаг 5: если в результате этих операций окажется помеченной вершина-сток xk, то между начальной и конечной вершинами сети найдется маршрут, все вершины которого различны и с точностью до знака помечены индексами предыдущих вершин, формирующих переход, по которому можно увеличить поток, и перейти к шагу 6, иначе конец.

шаг 6: увеличить поток в маршруте, сформированном на шаге 5, на единицу и перейти к шагу 3.

Признаком окончания работы алгоритма является невозможность пометки вершины-стока.

Пример: На рис. 3.31 дан граф. Найти величину максимального потока и его распределение в сети.

На каждой дуге (хi, хj) указаны величина потока и пропускная способность - (ij, cij).

Все расчеты сведены в две таблицы таблица а)

хi

шаг итерации

1

2

3

4

5

6

7

х0

0

0

0

0

0

0

0

х1

+0

+0

+0

+0, -3

-3

-

-

х2

+0;+3

+0;+3

+0

+0

+0

+0

-

х3

+0;+1

+0;+1

+0;+1

+0

+0

-

-

хk

+1;+2;+3

+1;+2

+1;+2

+1;+2

+1,+2

+2

-

таблица b)

i, хj)

Сij

шаг итерации

1

2

3

4

5

6

7

0, х1)

2

0

0

1

2

2

2

2

0, х2)

1

0

0

0

0

0

1

1

0, х3)

3

1

2

2

2

3

3

3

1, х3)

4

0

0

1

1

0

0

0

1, хk)

3

0

0

0

1

2

2

2

2, хk)

2

0

0

1

1

1

2

2

3, х2)

1

0

0

1

1

1

1

1

3, хk)

2

1

2

2

2

2

2

2

. В таблице а) на каждом шаге итерации для каждой вершины графа указаны возможные метки, а в таблице b) даны приращения потока по дугам (хi, хj). Полужирным шрифтом выделены насыщенные дуги графа

В результате выполнения первого шага итерации возможны переходы: 0k={(хk, х1, х0); (хk, х2, х0); (хk, х2, х3, х0); (хk, х2, х3, х1, х0);

k, х3, х0); (хk, х3, х1, х0)}. Пусть выбран 0k=(хk, х3, х0). Приращение потока на =1 проходит по маршруту =((х0, х3), (х3, хk)).

На втором шаге возможны те же переходы. Пусть выбран переход 0k=(хk, х3, х0). Приращение потока на =1 проходит по маршруту ={(х0, х3), (х3, хk)}. При этом дуга (х3, хk) оказывается насыщенной, т. е. 3k=c3k=2.

На третьем шага возможны переходы: 0k={(хk, х1, х0); (хk, х2, х0); (хk, х2, х3, х0); (хk, х2, х3, х1, х0)}. Пусть выбран 0k=(хk, х2, х3, х1, х0). Приращение потока на =1 проходит по маршруту =((x0, x1), (x1, x3), (x3, x2), (x2, xk)). При этом оказывается насыщенной дуга (х3, х2), т. е. 32=c32=1.

На четвертом шаге возможны переходы: 0k={(хk, х1, х0); (хk, х2, х0)}. Пусть выбран ok=(хk, х1, х0). Приращение потока на =1 проходит по маршруту =((x0, x1), (x1, xk)),. При этом оказывается насыщенной дуга (х0, х1), т. е. 01=c01=2.

На пятом шаге возможны переходы: 0k={(хk, х1, -x3, х0); (хk, х2, х0)}. Пусть выбран ok=(хk, х1, -x3, х0). Приращение потока на =1 проходит по маршруту =((x0, x3), (x3, x1), (x1, xk))),. При этом оказывается насыщенной дуга (х0, х3), т. е. 03=c03=3.

На шестом шаге возможен только один переход 0k=(хk, х2, х0), так как дуги (x0, x1) и (x0, x3) насыщены. Приращение потока на =1 проходит по маршруту =((x0, x2), (x2, xk)),. При этом оказывается насыщенной дуга (х0, х2), т. е. 02=c02=1.

На седьмом шаге невозможны ни один переход от xo к xk, так как дуги (x0, x1), (x0, x3) и (х0, х2) насыщены и невозможно поставить метки у вершин x1, x2, и x3.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]