Вначале этого параграфа приведем формулировки двух теорем, на которых основывается метод решения задачи о максимальном потоке и минимальной стоимости.
Теорема 1.
Если имеется оптимальное решение для задачи с матрицей cij, то это решение будет оптимальным и для задачи с преобразованной матрицей cij’=cij+d,t(i,j).
Теорема 2.
Для того, чтобы искомое решение преобразованной задачи было оптимальным, необходимо и достаточно, чтобы выполнялись следующие условия оптимизации:
1) cij>0, xij=0;
2) cij<0, xij=dij;
3) cij=0, 0£xij£di.j.
Алгоритм метода Форда-Фалкерсона:
10. Добавим начальные и конечные узлы S и t, причем полагаем и .
20. Начальный поток xij считаем равным 0 по всем дугам.
30. Пометим вершину S =[-, ].
40. Проведем процесс расстановки пометок для смежных с S вершин, пытаясь достичь вершины t.
Правила расстановки таковы:
Узел j может быть помечен из узла i, если:
а) cij’£0, xij<dij
б) cij’³0, xij>0
Если узел i имеет пометку i=[k±,ei], то узел j получает пометку:
j=[i+, ej=min(ei, dij-xij)] в случае (а),
j=[i-, ej=min(ei, xij)] в случае (б).
|
|
Знаки ± ставят в зависимости от того, по прямой или обратной дуге происходит пометка, т.е. в случае (а) ставится «+», в случае (б) – «-». Шаг 40 продолжается до тех пор, пока не пометим конечную вершину.
Если происходит прорыв, то переходим к шагу 50, если непрорыв – к шагу 60.
50. Если произошел прорыв, т.е. если узел t получил пометку, т.е. из s в t найден путь, то изменяем потоки следующим образом:
xij+et, (i,j)Î прямой дуге;
xij’ = xij-et, (i,j)Î обратной дуге;
xij, в остальных случаях.
Также изменяем значение as’=as-et. Переходим к шагу 30.
60. Если происходит непрорыв, то производим изменение стоимости дуг, для этого выделяем множества:
A1={(i,j)/iÎ , jÎ , cij³0}
A2={(j,i)/iÎ , jÎ , cij<0}
Где – множество помеченных вершин, – множество непомеченных.
Тогда d1=minA1cij, d2=minA2|cij|, d=min(d1, d2).
cij-d, iÎ , jÎ ;
cij’ = cij+d, iÎ , jÎ ;
cij, в остальных случаях.
Таким образом вводят в рассмотрение по крайней мере еще одну допустимую дугу из A1 или A2. Переход к шагу 30.
70. Вычисления заканчиваются, когда либо as=0, либо A1 и A2 равны 0, т.е. получен минимальный разрез.
Пример 2
Рис.2
1) Вводим вершины s и t.
as=åaj=30+50+70=150
2) Полагаем xij=0 "(i,j).
3) Помечаем вершину s=[-, es=as=150]
Из S можно пометить 1, 2, 3, т.к. csj=0:
1=[S+,e1=min(es, ds1-xs1)=min(150,30-0)=30]
2=[S+,e2=min(es, ds2-xs2)=min(150,50-0)=50]
3=[S+,e3=min(es, ds3-xs3)=min(150,70-0)=70]
Другие вершины не можем пометить, т.к. не выполняются условия cij³0, xij>0 (последний равен 0)
6) Произошел непрорыв, поэтому вводим два множества:
A1={"cij>0: (1,5), (1,4), (2,4), (2,7), (3,5), (3,7)}
A2=0, т.к. нет (i,j) с cij<0.
Стоимости дуг, входящих в A1, A2:
d1=min(7,4,5,8,6,7)=4, d2=¥, d=min(d1, d2)=4.
Изменяем стоимости дуг по множеству A1 (на рисунке). Теперь можно пометить вершину 4.
|
|
4=[1+,e4=min(e1, d14-x14)=min(80,15-0)=15]
6) Произошел непрорыв, т.к. из вершины 4 нельзя пометить вершину t:
A1={(1,5), (4,5), (4,6), (2,7), (3,5), (3,7)}. Здесь дуга (2,4) не рассматривается (Ответьте, почему?).
A2=0.
d1=min(3,3,5,4,2,3)=2, d=4.
Во всех дугах множества A1 стоимости меняются на cij-2 (на рисунке).
Можно пометить следующие вершины:
5=[3+,e5=min(e3, d35-x35)=min(70,30-0)=30]
t=[5+,et=min(e5, d5t-x5t)=min(30,40-0)=30]
4) Произошел прорыв, т.е. найден следующий путь S®3®5®t, по которому провозится 30 единиц товара. Потоки по этим дугам меняем на 30 ед., дуга (3,5) насыщена, в дальнейшем она не рассматривается.
5) as=150-30=120. Заново помечаем вершины, начиная с вершины s
……...
При применении вычислительного алгоритма метода Форда – Фалкерсона будет проведено 11 итераций. (Проверить самостоятельно).