Задача о максимальном потоке и минимальной стоимости. Метод Форда - Фалкерсона

 

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

Теорема 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 итераций. (Проверить самостоятельно).

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: