Метод построения сетевого графика
Теперь нам нужно разработать метод построения графа, который бы удовлетворял нашим требованиям. В начале разработки проекта у нас есть следующие данные: множество процессов W, и, для каждого процесса w ∈W, задано множество его предшественников Pw⊂W (заметим, что множество Pw может оказаться пустым, более того, обязательно найдется процесс w∗, для которого Pw∗=∅).
Замечание.Данная ситуация конечно далека от реальной жизни, ведь некоторые процессы могут быть “связаны” общими ресурсами, кроме того, не всегда возможно сразу определить все связи между процессами. Реальные данные могут оказаться противоречивы. Например, некоторые процессы могут образовать контур, тогда они вообще никогда не начнутся. Размыкание контуров происходит вне рамок математической модели и эту проблему мы далее рассматривать не будем. Мы полагаем, что наши данные полны и непротиворечивы.
Рассмотрим следующий пример:
Пример Пусть W = {a,b,c,d,e,f,g,h,i,j,k} Pa= Pb= Pc= ∅, Pd=
{b}, Pe= Pf = {a}, Pg= Pk= {c}, Ph= {b,d,e,k}, Pj = {f,g,h}, Pi={c,g} Тогда можно составить следующую таблицу, отражающую отношение предшествования:

Где в каждой строчке выписаны предшественники соответствующего процесса.
Для того чтобы определить всех предшественников для каждого процесса выполним транзитивное замыкание множества работ P, при этом получим множество¯P. Для нашего примера новое множество запишется следующим образом:

Теперь мы хотим конструктивно разделить множество процессов на подмножества. Видимо, нам нужны процессы с одинаковым множеством предшественников, с одной стороны, и сами множества предшественников (точнее множества “одинаковых” предшественников, то есть тех процессов, которые являются предшественниками только одновременно), с другой стороны. Далее мы формально проделаем вышеупомянутые опеации.
Наше множество работ W разобьем на группы по следующему признаку: будем группировать процессы с одинаковым набором предшественников. Таким образом, получим набор множеств πα, α ∈A, причем каждому w∈W соответствует индекс α(w), и¯Pw = πα(w). То есть мы сопоставили одинаковые номера множествам процессов с одним набором предшественников. Добавим к таблице еще один столбец, в котором выписаны соответствующие множества πα.

Номера α по сути соответствуют одинаковым строкам в таблице. Перейдем к следующему шагу процесса. Разобьем процессы на группы одинаково входящих или не входящих в множества πα. Это будут группы ρα, состоящие из процессов которые вместе либо входят, либо не входят в соответствующие множества, или, для нашей таблицы, группы процессов встречающихся в строчках только “вместе”.

Теперь строго опишем только что произведенное действие.
Напомним, что совокупность непустых дизъюнктных подмножеств множества M называется его разбиением, если множество M равно их объединению. Произведением двух разбиений называется самое крупное из измельчений этих двух разбиений.
Сопоставим каждому множеству πα разбиение Πα:
W = πα∪(W \πα).
Рассмотрим произведение соответствующих разбиений Πα и обозначим его как¯Π = {ρβ}β∈B. Тогда каждое множество πα есть объединение некоторого набора множеств ρβ, то есть
πα= ∪β∈B(α)ρβ.
В нашем примере:
π0= ∅
π1= {b} = ρ2
π2= {a} = ρ1
π3= {c} = ρ3
π4= {a,b,c,d,e,k} = ρ1∪ρ2∪ρ3∪ρ5
π5= {c,g} = ρ3∪ρ4
π6= {a,b,c,d,e,f,g,h,k} = ρ1∪ρ2∪ρ3∪ρ4∪ρ5∪ρ6
Таким образом, мы занумеровали процессы индексами β. Теперь если дуга соответствует процессу, то началу дуги соответствует индекс из множества A, а концу – из множества B, то существует дуга (соответствующая процессу) соединяет элемент πα c элементом ρβ. Здесь πα трактуется как индекс.
Пример.В нашем примере π4стоит в строке h, а в столбце h стоит ρ6, значит будет дуга из π4в ρ6.
Добавим фиктивные работы, то есть дуги соответствующие парам (β,α), где начало дуги – β ∈B(α), а конец – α∈A. Эти дуги соединяют элемент πα, с теми элементами ρβ, объединением которых он является, но ведущие от элементов ρβк элементу πα. Множество этих дуг обозначим буквой F.
Пример. В нашем примере π4 является следующим объединением: π4={a,b,c,d,e,k} = ρ1∪ρ2∪ρ3∪ρ5 значит, будут фиктивные дуги из ρ1, ρ2, ρ3, ρ5в π4.
Таким образом получим граф.

Данное представление проекта трудно назвать очень наглядным, но данный граф можно существенно упростить совершив некоторые преобразования:
(i) Если начало и конец фиктивной дуги соединены путем не содержащим этой дуги, то такая дуга может быть удалена из графа.
(ii) Если какая либо фиктивная дуга – единственная дуга, входящая в вершину (выходящая из вершины) то она может быть удалена из графа склеиванием ее начала и конца в одну точку, так как мы полагаем, что фиктивная работа имеет нулевую продолжительность.
Например, из нашего графа можно удалить дугу (ρ1,π6), так как существует путь ρ1→ π2→ ρ6→ π6. На рисунке путь выделен синим, а удаляемая дуга красным цветом.

После всех упрощений получаем граф.

Такой граф, называемый сетевым графиком проекта, дает наглядное представление о предстоящей работе.
Кстати, для “плохого случая” из первого примера получим следующее представление:

Где серые дуги – фиктивные.
