ПОТОКИ В СЕТЯХ

реклама
ПОТОКИ В СЕТЯХ
Определения
Сеть - связный ориентированный граф G = (V, A) без петель и
мультидуг, с 1 источником sV и 1 стоком tV.
(Запретим одновременное  дуг (i, j) и (j, i))
 дуге графа (i, j)  A, приписана пропускная способность bij ≥ 0,
целое число, которое задает max доп. величину потока по дуге.
Потоком из источника s в сток t (или st потоком) в сети G
назовем мн. неотрицательных чисел xij, (i, j)A, для которых
выполнены условия сохранения потока
 v, j  s,

xij   x jk  0, j  s, t ,

i:( i , j )A
k :( j , k )A
 v, j  t

и ограничения на
дуговые потоки
0  xij  bij, (i, j)  A
Максимальный поток
v
x
sj
j:( s , j )A
 max ;
x
 v, j  s,

xij   x jk  0, j  s, t ,

i:( i , j )A
k :( j , k )A
 v, j  t

0  xij  bij, (i, j)  A
З. ЛП  для ее решения применим аппарат ЛП.
Более того, mat ограничений удовлетворяет свойству
абсолютной унимодулярности…
Известно неск. полиномиальных алг., трудоемкость кот. O(|V|3).
Определения
Пусть задан доп. поток из s в t. Назовем увеличивающим путем
любой путь P из s в t в неориентированном графе, полученном из
графа G игнорированием направлений дуг, кот. обладает след.
свойствами:
1)  дуги (i, j)  E, проходимой путем P в прямом направлении (и
называемой прямой дугой), xij < bij, т. е. прямые дуги пути не
ненасыщенны;
2)  дуги (j, i)  E, проходимой путем P в обратном направлении
i  j (и называемой обратной дугой), xji > 0.
st разрезом ( X , X ) наз. разбиение мн. вершин V на подмн. X и X
Пропускная способность st разреза ( X , X ) равна
C( X , X ) 

( i , j )E:iX , jX
bij
st разрез является узким местом сети: v  C ( X , X ), s  X , t  X
Определения
Увеличивающий путь:
xij  bij
s
i
j
xkj  0
k
t
Разрез и его пропускная способность:
i
xij  bij
j
s
t
k
xlk  0
l
Теорема ФордаФалкерсона
Наз. st разрез минимальным, если он имеет min проп. спос.
среди всех st разрезов.
Теорема (ФордаФалкерсона). В  сети величина max st потока
= пропускной способности min st разреза.
Доказательство. Рассмотрим доп. поток {xij}. Если v = проп. спос.
некоторого разреза, то теорема доказана. В прот. сл. величину
потока можно  по приводимому ниже правилу до тех пор, пока v
не станет = проп. спос. нек. разреза.
Имея поток {xij}, находим подмн. в. Х по след. правилам:
0. Поместим источник s в мн. X.
1. Если i  X и xij < bij (дуга (i, j) не насыщена), то в. j  X.
2. Если i  X и xji > 0 ( > 0 поток по (j, i)), то в. j  X.
Доказательство теоремы ФордаФалкерсона
Вершины  Х поместим в мн. X
Исп-я пр. 0 – 2 для построения Х, получим 1 из 2-х результатов:
I. Сток t  X . Тогда  дуги (i, j)  E, i  X, j  X 
согласно пр. 1 вып. условие xij = bij и, согласно пр. 2, имеет место
равенство xji = 0 
x
ij
iX , jX

b
ij
iX , jX
и
x
ji
( i , j )E:iX , jX
0
 получен поток, величина кот. = C ( X , X )
II. Сток t  X . Тогда из опр. мн. Х   увеличивающий s-t путь
s,…,i,i+1,…,t, в кот. все прямые дуги (i, i+1) не насыщены, и 
>0 поток по всем обратным дугам пути xi+1,i > 0.
Доказательство теоремы ФордаФалкерсона
Пусть 1 = min(bi,i+1 – xi,i+1) по всем прямым дугам (i, i+1) пути,
2 = minxi+1,i по всем обратным дугам (i+1, i),
 = min{1, 2} > 0.
Проп. спос. bij  целые числа.
Начнем с целочисленного потока (например, 0).
   целое > 0
Можно увеличить на  потоки по всем прямым дугам пути и
уменьшить на  потоки по всем обратным дугам пути.
 величина st потока увеличится на , и новые значения
дуговых потоков останутся допустимыми.
Используя новый поток, можно построить новое мн. Х. Если t
попадет в Х, то можно снова увеличить поток и т. д.
Т.к. проп. спос. min разреза ограничена, и на каж. шаге величина
потока   на 1, то после конечного числа шагов получим
ситуацию I и  max поток.
Разрезы
Следствие. Поток max  не увеличивающего пути.
В сети может  несколько разл. max потоков и min разрезов.
Теорема. Пусть ( X , X ) и (Y , Y ) – min st разрезы. Тогда
( X  Y , X  Y ) и ( X  Y , X  Y ) также min st разрезы.
Теорема. Пусть ( X i , X i ) – min st разрезы, а ( X , X ) – разрез,
полученный в доказательстве теоремы ФордаФалкерсона. Тогда
X   Xi
i
В алгоритме  вершина может находиться в 1 из 3 состояний:
 не помечена,
 помечена,
 помечена и просмотрена.
В начале все в. не помечены.
Алгоритм расстановки пометок Форда-Фалкерсона
Шаг 1. (Расстановка пометок). Метка в. j состоит из 2 частей:
1) либо индекса i+, если можно  поток из i в j, либо индекса i,
если можно  поток из j в i;
2) числа (j), указывающего max величину, на кот. можно  s-j
поток, не нарушая ограничений на проп. спос.
Ист. s приписывается метка [s+, (s)=+]. Теперь в. s помечена, а
все остальные в. не помечены.
Выберем  помеч. но не просм. в. j. Она имеет метку [i+, (j)], или
[i, (j)].
Каж. непом. в. k : xjk < bjk, припишем метку [j+, (k)], где
(k)=min{(j), bjkxjk}. Такие в. k теперь помечены.
Всем непом. в. k : xkj > 0, припишем метки [j, (k)], где
(k)=min{(j), xkj}. Такие в. k теперь также помечены.
Когда все смежные с j в. помеч., в. j – помеч. и просмотренная.
Рассмотрим др. помеч., но не просм. в., пока t не окажется помеч.
либо нельзя > пометить ни 1 в. и t остался непомечен.
Алгоритм расстановки пометок Форда-Фалкерсона
Если t не помеч., то не  увеличивающего s-t пути, и текущий
поток max.
Если t помеч., то на шаге 2 поток по найденному увеличивающему
пути увеличивается.
Шаг 2. (Увеличение потока). Пусть t имеет метку [k+, (t)]. Тогда
положим xkt=xkt+(t) и перейдем к в. k.
Если k имеет метку [j+, (k)], то положим xjk=xjk+(t).
Если k имеет метку [j, (k)], то положим xkj=xkj(t).
Переходим к в. j.
Продолжим движение по увеличивающему пути от стока к
источнику, пока не придем в s. В результате величина потока
увеличится на (t).
Положим все вершины непомеченными и перейдем на шаг 1.
Если нельзя пометить более ни 1 в. и сток остался непомеч., то
( X , X ) – min разрез, и полученный поток max
Замечания
Замечание. Если bijR, то алг. может не быть конечным или
может сходиться не к max потоку.
 простые модификации алг. :
Шаг 1. Удалить из сети все насыщенные дуги и перейти на шаг 2.
Шаг 2. Найти увеличивающий путь и послать по нему max
возможный поток. Перейти на шаг 1.
Если такого пути нет, то перейти на шаг 3.
Шаг 3. Восстановить все дуги сети. Найти увеличивающий путь
и послать по нему max возможный поток. Перейти на шаг 1. Если
увеличивающего пути нет, то алг. завершает работу.
Трудоемкость алг. ФордаФалкерсона зависит от v и  является
псевдополиномиальной.
 методы, в которых среди увеличивающих путей находится путь
min длины (по количеству входящих в него дуг), имеющие
полиномиальную трудоемкость O(|V|3).
Пример
[2─,1]
1
1,1
проп. спос.
3,0
t [1+,1]
1,1
s
[s+,]
2,1
2,2
2
[s+,1]
поток
Пример
проп. спос.
1
1,1
3,1
1,0
s
t
[s+,]
2,1
2,1
2
[s+,1]
поток
[2+,1]
Пример
проп. спос.
1
1,1
3,1
1,1
s
t
[s+,]
2,2
2,2
2
поток
Потоки минимальной стоимости
Z
c x
( i , j ) A
ij ij
 min ;
x
 v, j  s,

x

x

0, j  s, t ,


ij
jk
i:( i , j )A
k :( j , k )A
 v, j  t

0  xij  bij, (i, j)  A
Если бы не было ограничений на проп. спос. дуг, то для решения
задачи достаточно найти кратчайший (по cij) путь из s в t и
пропустить по нему поток величины v.
Приведем 2 алгоритма для случая целочисленных bij
Алгоритм БасакераГоуэна
Шаг 0. Положить все дуговые потоки и  v = 0.
Шаг 1. Определить модифицированные дуговые стоимости
cij , 0  xij  bij ,

*
cij    , xij  bij ,
  c , x  0.
ji
ji

Шаг 2. Найти путь из s в t min длины и увеличить на 1 поток по
этому пути. Если величина нового потока равна v, то алг.
останавливается. В противном сл. перейти на шаг 1.
Пример
3
1,1
s
1
1,1
v=2
1,2
1,2
2
1,1
2,2
2,2
4
t
стоимость
проп. спос.
Шаг 0. Полагаем xij = 0.
Шаг 1. Определяем модиф. стоимости cij*  cij
Шаг 2. Находим путь из s в t min длины, например, {s, 1, 2, t}.
Полагаем xs1 = x12 = x2t =1. Перейдем на Шаг 1.
Пример
3
1,0
s
1
1,1
1,1
2,0
Шаг 1.
v=2
1,0
2
1,1
2,0
4
поток
проп. спос.
cs*1  
c  
c2t*  
c1*s  1
*
c21
 2
ct*2  1
*
12
t
Шаг 2. Находим путь {s, 3, 2, 1, 4, t} min длины 5. Пропустим 1
потока по этому пути:
Пример
3
1,1
s
1,1
1
1,1
1,0
2,1
2
1,1
2,1
4
v=2
t
поток
проп. спос.
Алгоритм Клейна
Шаг 0. Найти произвольный доп. st поток величины v.
Шаг 1. Определить модифицированные дуговые стоимости
cij , 0  xij  bij ,

*
cij    , xij  bij ,
  c , x  0.
ji
ji

Шаг 2. Найти цикл <0 стоимости (назовем его отрицательным),
где стоимость цикла равна сумме модиф. стоимостей входящих в
него дуг. Увеличить поток по <0 циклу на  =min{bij – xij, xji}, где
min берется по всем прямым (i, j) и обрат. (j, i) дугам цикла, и
перейти на шаг 2.
Если <0 цикла нет, то найденный поток opt!
(Если в сети  несколько <0 циклов, то увеличить поток по каж. из
них.)
Корректность алгоритма Клейна
Теорема. Поток величины v opt  в сети с модиф. дуговыми
стоимостями не  отрицательных циклов.
Доказательство.  следует из того, что в случае  < 0 цикла
можно добавить циркуляцию по этому циклу, сохранив величину
потока и уменьшив его стоимость, что противоречит opt потока.
. Рассмотрим нек. поток, для кот. в сети не  < 0 циклов.
Предположим, что opt поток имеет < стоимость.
Разложим opt поток на v путей, обозначим их oi, i = 1,…,v, по каж.
из кот. пропущен 1-ый поток.
Аналогично разложим рассматриваемый поток на v путей
pi, i = 1,…,v, по каж. из кот. пропущен 1-ый поток.
Ввиду того, что opt поток имеет < стоимость,  пути oi и pi :
стоимость потока по oi < стоимости потока по pi. Тогда эти пути:
a) либо не имеют общих дуг,
b) либо частично совпадают.
Доказательство теоремы
Случай a. Рассмотрим цикл из s в t по oi, затем из t в s по пути pi.
Это отрицательный цикл (для модифицированных стоимостей).
Получили противоречие.
s
oi
t
pi
Случай b. Обозн. через f 1-ю в., после кот. пути oi и pi начинают
различаться, а через l – 1-ю в., после кот. они совпадают.
Стоимость потока по участку пути oi от f в l меньше стоимости по
участку пути pi от f в l.  найден <0 цикл: из f в l по пути oi, а из l
в f по пути pi. Это противоречие доказывает теорему.
s
f
oi
pi
l
t
Нахождение отрицательных циклов
Для нахождения <0 циклов можно воспользоваться след. проц.
ФлойдаУоршелла.
Пусть dij – веса дуг (i, j)E. Рассмотрим след. тернарную
(3-местную) операцию, определенную для нек. фикс. в. j:
dik=min{dik, dij+djk}, i,k  j
(*)
Если выполнить операцию (*)  в. j, то в случае  0 весов получ. в
результате зн. dik = длинам кратчайших путей из i в k  пар вер.
j
i
k
Положим dii=+ и применим (*)  j, i и k.
Если  в. i : dii < 0  она  <0 циклу. Сам <0 цикл
восстанавливается переходя из в. i в смежную в. j, у кот. djj < 0. Из
в. j переходим в новую в. k с dkk < 0… пока не вернемся в в. i.
T=O(n3).
Пример
1
25,2
50,3
50,2
s
30,6
15,8
4
15,8
10,3
10,1
3
10,2
10,1
10,8
45,1
2
15,2
90,9
6
60,5
5
20,3
проп. спос.
80,4
7
10,3
10,1
9
20,2
8
стоимость
10,3
t
Пример
1
25
40
30
15
20
4
15
s
6
10
5
15
2
15
3
5
65
7
20
10
10
10
10
t
10
10
9
20
8
20
v = 85
0
Пример
i\j
s
1
2
4
6
s

-3
-6


1
3
2
4
6

2



1


9

-2
-2

-1



-9
1
40
s
20
5
2
3
3
6
20
5
-1
4
25
30
s
5
15
5


7
 10 -5
810 -3 
9
t

7



15
15
2

25
50
4
15
i\j
1
25
7
15
8
10
9


10 
5
3

t
5

 10 -2

4


3

-1
65
-4
3



-3
t

20
Скачать