2 4 5 2
2 1 29 10
3
2 12 39
7 0
0 15 39
1 0 5 4 2 5
0 17 8
7 8
8 8
3 0 23 31
8 6 0
t p 31
N R
t n
Рис. 2.10 - Сетевой график
Находим параметры по событиям.
1) Ранний срок наступления события i, tp ( i ).Это максимальный путь от начального события до i - го события:
tp( 1 ) = 0; tp( 2 ) = t1,2 = 2
В третье событие входят 2 работы : (2,3) и (1,3), значит
tp(3)=max{tp(2) + t2,3 ; tp(1) + t1,3}=max{2+5, 8}= 8
В четвертое событие входит одна работа (3,4)
tp(4) = tp(3)+t3,4 = 8+7=15
В пятое событие входят 2 работы : (2,5) и (4,5), значит
tp(5)=max{tp(2) + t2,5 ; tp() + t4,5}=max{2+4, 15+12}= 27
В шестое событие входят две работы : (4,6) и (3,6), значит
tp(6)=max{tp(4) + t2,5 ; tp(3) + t3,6}=max{15+4, 8+23}= 31
В седьмое событие входят три работы : (5,7); (4,7); (6,8) значит
tp(7)=max{tp(5) + t5,7 ; tp(4) + t4,7; tp(6) + t6,7}=
max{5+5, 27+10,31+8}= 39
2) Поздний срок наступления события i, tn ( i ) — это разность между продолжительностью максимального пути lmax и пути наибольшей продолжительности от данного события i до конечного события.
Рассчитывается tn ( i ) по обратной схеме tp ( i ). Значит, расчет начинаем от конечного события, ориентируемся на выходящие работы, берем минимум разности.
Для конечного события
tn(7) = tp(7)=39
Из шестого события выходит одна работа : (6,7)
tn(6) = tn(7) - t6,7 = 39 - 8 = 31
Из пятого события выходит одна работа : (5,7)
tn(5) = tn(7) - t5,7 = 39 - 10 = 29
Из четвертого события выходит 3 работы : (4,5);(4,6);(4,7)
tn(4) = min{ tn(5) - t4,5 ; tn(6) - t4,6 ; tn(7) - t4,7 }=
min{29 - 12; 31 - 4; 39 - 5}= 17
Из третьего события выходит 2 работы : (3,4);(3,6)
tn(3)=min{tn(4) - t3,4 ; tn(6) - t3,6}=min{17 - 7;31 - 23}= 8
Из второго события выходит 2 работы : (2,5);(2,3)
tn(2)=min{tn(5) - t2,5 ; tn(3) - t1,3}=min{8 - 5;29 - 4}= 3
Из начального события выходит 2 работы : (1,2);(1,3)
tn(1)=min{tn(2) - t1,2 ; tn(3) - t1,3}=min{3 - 2;8 - 8}= 0
Для начального события должно выполняться условие:
tp( 1 ) = tn ( 1 ) = 0 .
3) Находим резерв времени по событиям:
R( i ) = tn( i ) - tp( i ).
R(1) = 0; R(2) = 3-2 =1; R(3) = 8-8 = 0;
R(4) = 17-15 = 2; R(5) = 29-27 = 2; R(6) = 31-31 = 0;
R(7) = 39-39 = 0.
4) Критический путь проходит по событиям с нулевым резервом времени R( i ) = 0, т.е. 1, 3, 6, 7, (выделено на графе). Длина критического пути Lкр — это самый длинный путь от начального события до конечного :
Lкр = tp(7) = 39.
Рассчитаем необходимые параметры по работам.
5) Ранний срок окончания работы ( i , j ) :
tp.o( i , j )=tp( i ) + ti,j
tp.o(1,2)=tp(1) + t1,2 = 0+2 = 2;
tp.o(1,3)=tp(1) + t1,3 = 0+8 = 8;
tp.o(2,3)=tp(2) + t2,3 = 2+5 = 7;
tp.o(2,5)=tp(2) + t2,5 = 2+4 = 6;
tp.o(3,4)=tp(3) + t3,4 = 8+7 = 15;
tp.o(3,6)=tp(3) + t3,6 = 8+23 = 31;
tp.o(4,5)=tp(4) + t4,5 = 15+12 = 27;
tp.o(4,6)=tp(4) + t4,6 = 15+4 = 19;
tp.o(4,7)=tp(4) + t4,7 = 15+5 = 20;
tp.o(5,7)=tp(5) + t5,7 = 27+10 = 37;
tp.o(6,7)=tp(6) + t6,7 = 31+8 = 39;
6) Поздний срок наступления окончания работы ( i , j ):
tn.o (1,2) = tn(2) = 3; tn.o (2,3) = tn(3) = 8;
tn.o (1,3) = tn(3) = 8; tn.o (2,5) = tn(5) = 29;
tn.o (3,4) = tn(4) = 17; tn.o (4,5) = tn(5) = 29;
tn.o (3,6) = tn(6) = 31; tn.o (4,6) = tn(6) = 31;
tn.o (5,7) = tn(7) = 39; tn.o (4,7) = tn(7) = 39.
tn.o (6,7) = tn(7) = 39;
7) Полный резерв времени работы i , j — это время, на которое можно увеличить продолжительность данной работы, не изменяя при этом продолжительность критического пути Lкр.
Rn( i , j ) = tn ( j ) - tp( i ) - - ti,j;
Rn(1,2) = tn (2) - tp(1) - t1,2 = 3-0-2 = 1;
Rn(1,3) = tn (3) - tp(1) - t1,3 = 8-0-8 = 0;
Rn(2,3) = tn (3) - tp(2) - t2,3 = 8-2-5 = 1;
Rn(2,5) = tn (5) - tp(2) - t2,5 = 8-2-4 = 2;
Rn(3,4) = tn (4) - tp(3) - t3,4 = 17-8-7 = 2;
Rn(3,6) = tn (6) - tp(3) - t3,6 = 31-8-23 = 0;
Rn(4,5) = tn (5) - tp(4) - t4,5 = 29-15-12 = 2;
Rn(4,6) = tn (6) - tp(4) - t4,6 = 31-15-4 = 12;
Rn(5,7) = tn (7) - tp(5) - t5,7 = 39-27-10 = 2;
Rn(6,7) = tn (7) - tp(6) - t6,7 = 39-31-8 = 0;
Работа (4,7) имеет большой резерв времени (12), значит можно с этой работы снять на данном этапе ресурсы и перебросить их на работы лежащие на критическом пути. Аналогично, работы (2,5),(3,4),(4,5),(5,7) имеют резерв времени равный 2 . Работу (2,3) считаем под критической, а работы с нулевым резервом времени — критические. На рисунке критический путь отмечен жирной линией.
2.8. Оптимизация на сетях.
Пусть S - произвольная, частично ориентированная сеть, каждому ребру u которой приписанное неотъемлемое число c(u) - пропускная способность. Потоком в сети S называется пара (f, w), где w - некоторая ориентация всех неориентированных ребер сети, а f(u) -заданная на множестве всех ребер функция с не отрицательными значениями, которые не превосходят пропускных способностей, и такая, что в каждой внутренней вершине выполняется закон Кірхгофа, соответственно которой сумма значений потока по ребрам, которые входит в вершину, равно сумме потоков по ребрам, которые выходит с вершины . Иными словами, для f(u) выполняются условия:
0 f(u) c(u) для всех вершин сети;
R() = 0 для всех внутренних вершин, где
а () (соответственно '()) - множество всех ребер, которое выходят из (соответственно входящих в ) при ориентации w.
Поскольку сумма значений R() по всем вершинах сети, включая полюса, равно нулю (каждое ребро есть исходным для одной вершины и входным для другой), то R(s) = - R(s). Значение R = R(s) называется величиной потока.
Рассмотрим задачу определения максимального значения Rmax потока через сеть S при заданных значениях пропускных способностей. Ответ может быть получен в терминах сечений сети.
Сечением сети называется множество ребер, при удалении которых сеть становится несвязной, причем полюса попадают в разные компоненты связности. В сети на рис.2.11 примерами сечений есть {d, e, f}, {b, c, e, g, h}, {d, g, h, i}.
5
7 a d h 2
S 2 c 4 e 3 g S
3 b 4 i
1
f
Рис. 2.11 - Задача максимального потока
Сечение называется простым, если при удалении какого-нибудь его ребра, оно перестает быть сечением. Да, сечения {d, e, f} и {b, c, e, g, h} есть простыми, а сечение {d, g, h, i} не является таким. По-видимому, что для каждого ребра простого сечения можно указать цепь, что проходить через это ребро, но не проходит через иные ребра данного сечения.
Если в связной сети выполняется простое сечение, то сеть распадается ровно на две части: левую часть, что содержит S, и правую часть, что содержит S. Каждое ребро простого сечения связывает вершины с разных частей. Будем называть ребро сечения прямым, если оно в сети не ориентированное или ориентирован слева по правой сторону, и обратным в противном случае. Будет ориентированное ребро прямым или обратным, зависит от выбора сечения. Так, в примере ребро е в сечениях {d, e, f} и {b, c, e, g, h} - обратное, а в сечении {a, c, e, g, i}- прямое.
Каждому простому сечению W припишем пропускную способность c(W), равную сумме пропускных способностей всех его прямых ребер. В примере на рис.2.11 сечение {d, e, f} имеет пропускную состоятельность 5+1=6, а сечение {b, c, e, g, h} - 3+2+3+2=10.
Теорема о максимальной пропускной состоятельность сети сформулированная Фордом и Фалкерсоном в таком виде: Максимальный размер потока Rmax через сеть S равно минимальной с пропускных способностей cmin ее простых сечений. Доказательство этой теоремы приведено в [2]. Эта теорема положена в основу задачи определения максимальной пропускной состоятельности сети.
Рассмотрим алгоритм Форда-Фалкерсона определение максимального потока.
Шаг 0. Пусть источники помечены но не просмотрены, а все остальные узлы не помечены.
Шаг 1. Выбрать любой помеченный, но не просмотренный узел i.
Шаг 2. Просмотреть все дуги e (i, j) с пропускной способностью е 0, соединяющие узел i с еще не помеченными узлами j. Приписать пометки узлам j и отметить дуги e j = e = (i, j).Теперь узел i помечен и просмотрен, узлы j помечены, но не просмотрены. Если при этом сток оказался помеченным, то необходимая цепь найдена. В противном случае после просмотра по всем дугам (i, j) перейти к шагу 3.
Шаг 3. Пусть узел i помечен и просмотрен. Перейти к шагу 1 и повторять шаги алгоритма до тех пор, пока не останется помеченных и не просмотренных узлов. На этом поиск максимального потока заканчивается.
Рассмотрим пример.