Глава 3. ОСНОВЫ ТЕОРИИ ГРАФОВ. 3.1. Граф и его характеристики. Совокупностью объектов произвольной природы и отношений между каждой парой этих объектов может быть изображено на плоскости в виде множества точек, являющихся образом множества объектов, и множества отрезков линий, соединяющих пары точек, что является образом множества отношений. Такой образ совокупности объектов и отношений принято называть графом. Множество точек, являющихся образом множества объектов, называют вершинами графа, а множество отрезков линий, являющихся образом множества отношений, - рёбрами или дугами графа. Вершинами графа могут быть узлы любой транспортной или электрической сети, операторы программы или команды операционной системы, события в любой сфере человеческой деятельности, а рёбрами или дугами - линии связи в транспортной или в электрической сети, в организации работы на компьютере или в любой сфере человеческой деятельности. Граф может быть задан в двух формах: а) G=<X;r>, где r={(xi;xj)|xi,xj X}(XX) или б) G=<X;h>, где h={{xj}Xi|xi,xj X}(XX) (см. 1.2). Обе формы представления графа имеют широкое распространение. Первая форма применяется в тех случаях, когда необходимо отмечать дополнительные характеристики об отрезках линий: протяжённость, загрузка, пропускная способность и т.п. Вторая форма применяется в тех случаях, когда необходимо фиксировать дополнительные характеристики о вершинах графа: время исполнения команды или оператора, надёжность или загруженность узла транспортной или электрической сети. Вторая форма наиболее экономна в использовании памяти компьютера и хорошо реализуется списочными структурами данных. Граф G=<X;r> называют неориентированным, если (xi;xj)=(xj;xi), в этом случае отрезок линии (xi;xj) называют ребром. Граф G=<X;r> называют ориентированным, если (xi;xj)(xj;xi), в этом случае отрезок линии (xi;xj) называют дугой. На рис. 16 приведены неориентированный и ориентированный графы. Любая программа или электронная схема, любой производственный или вычислительный процесс могут быть представленны ориентированным графом, а любая схема транспортной или электрической сети - неориентированным графом. Граф G=<X;r>, между двумя вершинами которого может быть задано несколько рёбер или дуг, называют мультиграфом. Для определения отношения принадлежности вершин графа ребру или дуге и, наоборот,рёбер или дуг-вершине вводится понятие “инциденции”, т.е. вершина xi инцидентна ребру или дуге (xi;xj), если она является концевой вершиной данного отрезка линии, а ребро или дуга (xi;xj) инцидентна вершине xi , если отрезок линии ограничен концевой вершиной xi . Следует обратить 52 внимание, что отношение принадлежности, определяющее понятие “инциденции”, устанавливает связь между элементами двух разных множеств X и r. Число вершин, инцидентных ребру или дуге, всегда равно 2, т.к. они являются концевыми вершинами отрезка линии. Число рёбер или дуг, инцидентных вершине xi, может быть произвольным. Его называют степенью или валентностью вершины xi и обозначают i=j(xi;xj). Число дуг для ориентированного графа G=<X;r>, исходящих из вершины xi, называют полустепенью вершины графа и обозначают i+=j(xi;xj)+. Вершину xi, инцидентную исходящей дуге (xi;xj)+, называют вершиной истоком. Число дуг для ориентированного графа G=<X;r>, заходящих в вершину xi, называют также полустепенью вершины графа и обозначают i=j(xi;xj) . Вершину xi, инцидентную заходящей дуге (xj;xi) , называют вершиной - стоком. а) x1 r1,3 r0,1 б) x3 r1,5 r3,5 x1 r1,3 r0,1 r1,5 r1,4 r3,5 r1,4 x0 x5 r0,4 r4,5 x0 x5 r0,4 r4,5 x4 x2 x3 x4 x2 r4,4 r4,4 Рис.16. Неориентированный (а) и ориентированный (б) графы. Две вершины графа называются смежными, если они различны и между ними существует ребро или дуга. Вершина xi, несмежная ни с одной вершиной графа, называется изолированной. На рис.16 изолированной является вершина x2 . Два ребра также называются смежными, если они различны и имеют общую вершину. Последовательность смежных рёбер или дуг, соединяющих вершины xi и xj , называют маршрутом и обозначают i,j=((xi,xk);…. . . (xl;xj)). Например, для графа на рис.16а) между вершинами x0 и x5 существует шесть маршрутов, т.е. 0;5={(r0;4;r4;5);(r0;1;r1;4;r4;5);(r0;1;r1;5);(r0;4;r4;1;r1;5);(r0;4;r4;1;r1;3;r3;5); (r0;1;r1;3;r3;5)}. Последовательность смежных вершин маршрута, соединяющего вершину xi и xj , называют переходом и обозначают i,j=(xi;…. . .xj). Например, для графа на рис.16а) между вершинами x0 и x5 существует шесть переходов, т.е. 0;5={(x0;x4;x5);(x0;x1;x4;x5);(x0;x1;x5);(x0;x4;x1;x5);(x0;x4;x1;x3;x5);(x0;x1;x3;x 5). 53 Маршрут неориентированного графа G=<X;r>, связывающий вершины xi и xj , называют цепью. Маршрут ориентированного графа G=<X;r>, связывающий вершины xi и xj , называют путём. Маршрут называют простым, если при его обходе каждая промежуточная вершина встречается не более одного раза. Маршрут называют открытым, если его концевые вершины различны, и замкнутым, если его концевые вершины совпадают. Замкнутый маршрут для неориентированного графа называют циклом, а для ориентированного графа - контуром. Маршрут называют эйлеровым, если он замкнут и проходит через каждое ребро графа только по одному разу. Маршрут называют гамильтоновым, если он замкнут и проходит через каждую вершину графа только по одному разу. Длина маршрута равна числу смежных рёбер, соединяющих вершины xi и xj , т.е. li;j=rk,l, где kl и ik,lj. Длину минимального маршрута, соединяющего вершины xi и xj называют расстоянием. Так расстояние между вершинами x0 и x5 графа, приведённого на рис.16а), равно 2. Замкнутый маршрут, который содержит только одно ребро или дугу (длина маршрута равна 1), называют петлёй. На рис.16 петля указана для вершины x4. Если ребро или дуга обладают дополнительной характеристикой протяжённостью lk,l, то длина маршрута равна сумме длин рёбер или дуг, его составляющих, т.е. li;j=k,l, где kl и ik,lj. Если ребро или дуга обладают дополнительной характеристикой пропускной способностью, то пропускная способность маршрута равна минимальной пропускной способности для множества рёбер или дуг, его составляющих. Граф G=<X;r> называют связным, если любые две его вершины можно соединить цепью. Для ориентированного графа выделяют сильную связность, когда любые две его вершины взаимодостижимы при наличии дуг, и слабую связность, когда любые две его вершины достижимы только при условии замены дуг на рёбра. Граф G=<X;r> называют полным, если любые две его вершины смежны между собой (см. рис.17а)). Граф G=<X;r> называют пустым, если любые две его вершины не смежны между собой (см. рис.17б)). Граф G=<X;r> называют дополнительным для графа G=<X;r>, если он опирается на множество вершин графа G, которые смежны для графа G только в случае их несмежности в графе G, т.е. r=r. Так пустой граф (см. рис.17б)) есть дополнительный для полного графа (см. рис.17а)). Граф G=<X;r> называют деревом, если он связный, но без циклов, петель и кратных рёбер или дуг (см. рис.18а)). Граф G=<X;r> называют лесом, если он несвязный и без циклов, петель и кратных рёбер или дуг (см. рис.18б)). Расстояние от вершины xi для графа типа дерево до наиболее удалённой вершины xj называют эксцентриситетом графа и обозначают i. 54 Множество вершин графа типа дерево, имеющих минимальный эксцентриситет, формируют центроид графа. Наибольшее значение эксцентриситета для множества вершин графа типа дерево определяет диаметр графа. Одна из вершин центроида по выбору формирует центр графа. На рис. 18 представлены основные характеристики графа типа дерево. Следует обратить внимание, что в связном графе типа дерево число рёбер всегда равно (n-1), где n - число вершин графа. x1 x1 а) б) x3 x2 x4 x5 x2 x3 x4 x3 Рис. 17. Полный (а) и пустой (б) графы. а) 6 диаметр эксцентриситет центроид 5 6 4 б) 7 3 6 3 2 5 2 2 2 2 центр 7 4 6 3 3 1 5 5 2 2 Рис. 18. Граф типа дерево (а) и лес (б). Если множество вершин графа G=<X;r> разбить на два подмножества X и X\X при условии, что X(X\X)=X и X(X\X)=, то множество рёбер графа, одни из концевых вершин которых принадлежат множеству X, а другие множеству (X\X), называют разрезом графа. Поиск разрезов сводится к определению отношения принадлежности xiX и xj(X\X) с последующим определениям множества рёбер, соединяющих X` и (X\X). На рис. 19 дан разрез графа, представленного на рис. 16а), для двух несмежных вершин x0 и x5 и одного из возможных разбиений множества вершин графа на два подмножества X={x0;x1;x2} и (X\X)={x3;x4;x5}. 55 Удаление множества рёбер или дуг разреза преобразует связный исходный граф G â несвязный. Наименьшее число рёбер, удаление которых превращает связный граф в несвязный, называется числом рёберной связности. Наименьшее число вершин, удаление которых превращает связный граф в несвязный, называют числом вершинной r1,3 x1 x0 x3 r1,5 X\X x5 X r1,4 x2 r0,4 x4 Рис. 19. Разрез графа. связности. Одна вершина, удаление которой превращает связный граф в несвязный, называется точкой сочленения, а одно ребро, удаление которого также превращает связный граф в несвязный, - мостом. На рис. 20 представлены точка и мост сочленения связного графа. Граф G=<X;r> называют двудольным или бихроматическим, если множество его вершин можно разбить на два подмножества X и (X\X) при условии, что X(X\X)=X и X(X\X)=. Двудольные графы удобны для исследования попарно несмежных рёбер, т.е. поиска паросочетаний, а также для задания бинарных отношений между элементами различных множеств. Граф G=<X;r> называют частичным для графа G=<X;r>, если он порождён подмножеством рёбер или дуг исходного графа, т.е. rr вместе с а) удаление точки сочленения x3 x1 x4 x1 x4 точка x0 x3 x2 x6 x0 x5 x6 x2 x5 б) удаление моста сочленения (x3; x4) x1 x5 x1 мост x0 x3 x2 x4 x7 x6 x0 x5 x3 x4 x2 x7 x6 Рис. 20. Точка(а) и мост(б) сочленения связанного графа. концевыми вершинами этих рёбер, т.е. XX. Например, для графа,приведённого на рис. 16а), задание подмножества рёбер r={r0;1;r0;4;r1;5;r4;5} формирует частичный граф G=<X;r>(см. рис. 21а)). 56 Граф G=<X;r> называют суграфом графа G=<X;r>, если он также порождён подмножеством рёбер или дуг исходного графа, т.е. rr, но использует все вершины исходного графа, т.е. X=X. Например, для графа, приведённого на рис. 16а), задание подмножества рёбер r={r0;1;r0;4;r1;5;r4;5} формирует частичный суграф G=<X;r>(см. рис. 21б)). Граф G=<X;r> называют подграфом графа G=<X;r>, если он порождён подмножеством вершин исходного графа, т.е. XX, вместе с рёбрами или дугами, обе концевые вершины принадлежат множеству X. Например, для графа, приведённого на рис. 16а), задание подмножества вершин X={x0;x1;x3;x4;x5} формирует подграф G=<X;r>(см. рис. 21в)). Суграф G=<X`;r`> связанного графа G=<X;r>, формируемый в виде дерева, т.е. без циклов, петель и кратных рёбер, называют остовом графа G=<X;r>. Например, для связанного подграфа, представленного на рис. 21в), остовом является суграф, представленный на рис. 21г). а) x1 б) x1 x3 r0,1 r1,5 r0,1 r1,5 x5 x0 x5 x0 r0,4 r4,5 r0,4 x4 в) r0,1 x2 г) x1 r1,3 x3 r3,5 r1,5 x0 r0,4 x5 r4,5 r4,5 x4 x1 r1,3 x3 r0,1 r1,5 x0 x5 r0,4 x4 x4 r4,4 Рис. 21. Частичный граф, суграф, подграф и остов графа G=<X;r>. Граф G=<X;r> называют плоским или планарным, если он может быть изображён на плоскости так, что вершинам соответствуют различные точки плоскости, а линии, соответствующие рёбрам и дугам графа, не пересекаются. Плоские графы используют при анализе и проектировании печатных плат, сетей коммуникации и т.п. На рис. рис. 16, 18, 20 приведены плоские графы, а на рис. 17а)-неплоский. Граф G=<X;r> называют взвешенным, если его рёбра или вершины имеют дополнительные характеристики: продолжительность во времени или протяжённость в пространстве, нагрузку или надёжность функционирования. Так время исполнения команды операционной системы или оператора программы, вероятность наступления события или надёжность эксплуатации узла и т.п. определяют вес вершины графа, а протяжённость линий транспортных или электрических сетей, их пропускная способность по какому57 либо параметру определяют вес ребра или дуги. На рис. 22 приведён взвешенный граф, дуги и вершины которого имеют условные веса. Взвешенные графы чаще называют сетями. (p1=0,4) x1 r1,3=2 x3 (p3=0,8) r0,1=2 x0 (p0=0,6) r3,5=3 r1,4=4 r1,5=5 x5 (p5=0,9) r4,5=3 r0,4=5 x4 Рис. 22. Взвешенный граф. Граф может быть задан для анализа с помощью таблиц или матриц. При табличном задании используют обе формы его представления, т.е. G=<X;r> и G=<X;h>. ri,j r0,1 r0,4 r1,3 r1,4 r1,5 r3,5 r4,4 r4,5 а) (xi;xj) (x0;x1) (x0;x4) (x1;x3) (x1;x4) (x1;x5) (x3;x5) (x4;x4) (x4;x5) б) ri,j r0,1 r0,4 r1,3 r1,4 r1,5 r3,5 r4,4 r4,5 li,j 2 5 2 4 5 3 0 3 xi x0 x1 x3 x4 x5 в) hXi={…} x1;x4 x3;x4;x5 x5 x5 0 г) xi x0 x1 x3 x4 x5 Pi 0,6 0,4 0,8 0,6 0,9 Рис. 23. Формы представления графа. На рис. 23а) указана форма для представления инциденции дуг и вершин графа. В левом столбце приведены индексированные дуги графа, а в правомвершины графа, им инцидентные. На рис. 23б) дана форма для рёберновзвешенного графа. Чаще всего эти две таблицы объединяют. На рис. 23в) указана форма для представления смежности вершин графа. В левом столбце приведены индексированные вершины графа, а в правомвершины, смежные им. На рис. 23г) дана форма для вершинно-взвешенного графа. Чаще всего эти две таблицы объединяют. Представление графа таблицами отношений G=<X;r>наиболее удобно для хранения и обработки информации о весе ребра или дуги и ускоренного поиска инцидентных им вершин, а представление графов таблицами отображений G=<X;h> наиболее удобно для хранения и обработки информации о весе вершины и ускоренного поиска смежных вершин. 58 Матричное описание графа удобно для вычисления различных чисел графа и выполнения различных алгебраических операций, т.к. опирается на глубоко разработанную теорию матриц. Матрица инциденции. Поскольку инциденция есть отношение принадлежности элемента одного множества X другому множеству r, то матрица инциденции ||hi;j|| есть прямоугольная, число строк которой равно мощности множества |r|=m, а число столбцов - мощности множества |X|=n. Элементы матрицы инциденции для неориентированного графа определяются Таблица 10. соотношением: h x0 x1 x2 x3 x4 x5 1, если ребро ri;j r0,1 +1 -1 0 0 0 0 инцидентно вершинам x i и x j; r0,4 +1 0 0 0 -1 0 X hi;j = r1,3 0 +1 0 -1 0 0 0, в противном r1,4 0 +1 0 0 -1 0 случае; r1,5 0 +1 0 0 0 -1 r3,5 0 0 0 +1 0 -1 В таблице 9 представлена r4,4 0 0 0 0 +1 0 матрица инциденции для r4,5 0 0 0 0 +1 -1 неориентированного графа (см. 3 0 1 2 0 i+ 2 рис. 16а)). Следует отметить, что в 1 0 1 3 3 i- 0 каждой строке матрицы количество единиц равно двум, что характеризует наличие двух концевых вершин для отрезка линии, представляющего ребро. В каждом столбце матрицы инциденции количество единиц равно степени вершины, т.е. i, поэтому для последующего анализа желательно выделить строку, раскрывающую степени вершин графа. Элементы матрицы инциденции для ориентированного графа определяются другим соотношением: { { +1, если дуга ri,j исходит из вершины xi; hi;j= 0, если дуга ri,j не инцидентна вершинам xi и xj; -1, если дуга ri,j Таблица 9. заходит в вершину xj. hX x0 x1 x2 x3 x4 x5 r0,1 1 1 0 0 0 0 В таблице 10 r0,4 1 0 0 0 1 0 представлена матрица r1,3 0 1 0 1 0 0 инциденции для r1,4 0 1 0 0 1 0 ориентированного графа (см. r1,5 0 1 0 0 0 1 рис. 16б)). Также можно r3,5 0 0 0 1 0 1 отметить, что в каждой строке r4,4 0 0 0 0 1 0 сумма “+1” и “-1” равна двум, r4,5 0 0 0 0 1 1 что характеризует наличие для 4 0 2 4 3 i 2 отрезка линии, представляющего дугу, одной вершины - истока и одной вершины - стока. 59 Таблица 11. x4 x5 i 1 0 2 1 1 4 0 0 0 0 1 2 1 1 4 1 0 3 4 3 Таблица 12. x0 x1 x2 x3 x0 x1 x2 x3 x4 x5 r r i+ x0 0 1 0 0 1 0 2 x0 0 1 0 0 x1 0 0 0 1 1 1 3 x1 1 0 0 1 x2 0 0 0 0 0 0 0 x2 0 0 0 0 x3 0 0 0 0 0 1 1 x3 0 1 0 0 x4 0 0 0 0 1 1 2 x4 1 1 0 0 x5 0 0 0 0 0 0 0 x5 0 1 0 1 0 1 3 3 i 0 1 i 2 4 0 2 В каждом столбце матрицы инциденции число “+1” равно + полустепени исхода вершины xi, т.е. i , а число “-1” равно полустепени захода вершины xi , т.е. i-. Для последующего анализа графа также желательно выделить строки, раскрывающие полустепени всех вершин графа. Матрицы прямоугольными { инциденции в скобками [ ]. 0 таблицах 9 и 10 выделены Матрица смежности. Поскольку смежность есть бинарное отношение между элементами одного множества, то матрица смежности ||ri,j|| есть квадратная матрица, число строк и столбцов которой равно мощности множества |X|=n. Элементы матрицы смежности определяются соотношением: 1, если вершина xi смежна вершине xj; ri,j= 0, в противном случае. В таблице 11 представлена матрица смежности для неориентированного графа (см. рис. 16а)). Элементы матрицы смежности, равные 1, расположены симметрично относительно главной диагонали. В каждой строке и в каждом столбце такой матрицы число “1” равно степени вершины, т.е. i. Поэтому можно выделить дополнительную строку или столбец для хранения информации о степени каждой вершины графа. В таблице 12 представлена матрица смежности для ориентированного графа (см. рис. 16б)), но при условии, что строки заданы вершинами-истоками графа, а столбцы - вершинами-стоками. Поэтому итоговый столбец таблицы- i+ показывает полустепень каждой вершины-истока, а итоговая строка- I- полустепень каждой вершины-стока. По структуре матрицы смежности можно сделать выводы: 1. каждый ненулевой элемент главной диагонали соответствует петле на графе; 2. матрица смежности для неориентированного графа симметрична относительно главной диагонали; 60 3. матрица смежности для ориентированного графа несимметрична относительно главной диагонали; 4. если в графе необходимо добавить вершину, несмежную с остальными вершинами, то к матрице смежности следует добавить столбец и строку, элементы которой содержат только “0”; 5. столбец ориентированного графа, все элементы которого имеют значение “0”, соответствует вершине-истоку всего графа; 6. строка ориентированного графа, все элементы которой имеют значение “0”, соответствует вершине-стоку всего графа. Матрица весов. Протяжённость ребра или дуги, а также затраты времени, энергии или финансов на перемещение пакета информации или транспортной единицы по ребру или дуге из вершины xi в вершину xj формирует рёберно-взвешенный граф. Элементы матрицы весов рёберно-взвешенного графа определяются соотношением: { ri,j= В r x0 0 2 5 x0 x1 x2 x3 x4 x5 x1 2 0 2 4 5 0, если i=j; li,j, если вершина xi смежна вершине xj и вес ребра li,j; , если вершина xi несмежна вершине xj. x2 Таблица 13. x3 x4 x5 5 2 4 5 0 3 3 0 3 3 0 В таблице 13 приведена матрица весов для рёберновзвешенного графа, представленного на рис. 22. Контрольные вопросы и задачи. 1. Граф задан таблицей отношений: rk (xi;xj) a) b) c) d) e) f) g) h) r1 (x1;x2) r2 (x1;x3) r3 (x2;x5) r4 (x3;x4) r5 (x2;x4) r6 (x4;x6) нарисуйте граф; определите степени вершин графа; укажите маршрут и переход из вершины x3 в вершину x6; сколько всего маршрутов между вершинами x1 и x6; найдите дополнительный граф; укажите разрез для X={x1;x2;x4} и X\X={x3;x5;x6}; какой подграф будет получен после удаления вершины x2; нарисуйте частичный граф на рёбрах {r2;r4;r6}; 61 r7 (x5;x6) i) нарисуйте суграф на рёбрах {r1;r3;r5;r7}; j) нарисуйте подграф на вершинах x2,x4,x5,x6; k) определите является ли плоским данный граф; l) нарисуйте матрицу инциденции графа; m) нарисуйте матрицу смежности графа. 2.Граф задан таблицей отображений : xi hXi x x2 a) b) c) d) e) f) g) h) i) x x1 , x4 x x4 x x2,x3,x5,x6 x x4 , x7 x x4 x x5,x8,x9 x x7 x x7 нарисуйте граф; определите эксцентриситет каждой вершины графа; найдите центр графа; найдите диаметр графа; определите степени вершин графа; найдите дополнительный граф; какие будут подграфы после удаления каждой вершины графа; нарисуйте матрицу инциденции графа; нарисуйте матрицу смежности графа. 3.2. Числовые характеристики графа. Функции, заданные на множестве графов {G=<X;r>} и принимающие значения на множестве целых чисел, называют числовыми характеристиками графа или просто числами графа. Наиболее очевидными и простыми числами графа являются: число вершин графа - n, число рёбер или дуг графа - m, степени и полустепени вершин графа - i(или i+/i-). Все остальные характеристики графа требуют поиска и вычисления их значений. Число компонент связности графа G=<X;r>. Если множество вершин графа G можно разбить на попарно непересекающиеся непустые подмножества X={X1;X2;…;Xæ} так, чтобы никакие две вершины из разных подмножеств не были смежны, то связанные подграфы G1=<X1;r1>, G2=<X2;r2>,…,Gæ=<Xæ;ræ> называются компонентами графа G=<X;r>, а их число æ- числом компонент связности графа G, которое обозначают æ(G). Формально поиск числа компонент связности графа есть результат решения системы соотношений: Xi=X; XiXj=, для ij, 1 i,j n; Gi=G; GiGj=, для ij, 1i,jn; { 62 G x2 x1 x3 x4 x7 x5 x6 x8 Рис. 25. Цикломатическое число графа G=<X;r>. Для поиска числа компонент связности графа используют механизм вычисления матрицы достижимости и определения полных подграфов. Подробнее см. 3.3. На рис. 24 в качестве примера дан трёхкомпонентный граф: G=<X;r>, где X={x1;x2;x3;x4;x5;x6;x7;x8;x9;x10;x11}, G1=<X1;r1>, где X1={x1;x2;x3;x4}, G2=<X2;r2>, где X2={x5;x6;x7;x8}, G3=<X3;r3>, где X3={x9;x10;x11}, X1X2X3=X; X1X2=; X1X3=; X2X3=; G1G2G3=G. Цикломатическое число графа G=<X;r>. Наименьшее число рёбер, удаление которых приводит к графу без циклов и петель, называют цикломатическим числом и обозначают (G). Цикломатическое число можно определить по формуле: (G)=m-n+æ(G), где m - число рёбер, n - число вершин, æ(G) - число компонент связности графа. G x2 x6 На рис. 25 дан пример определения цикломатического числа. Для графа G=<X;r> G1 G2 имеем: x1 x3 x5 x7 n=8, m=10, æ(G)=2. x10 x4 x8 Следовательно, (G)=10-8+2=4. G3 Можно убрать рёбра {(x1;x2),(x2;x3),(x2;x4),(x6;x8)} или x9 x11 {(x1;x5);(x4;x5);(x3;x4);(x6;x7)}. Выбор устраняемых рёбер для ликвидации циклов Рис. 24. Компоненты связности определяется другой задачей. графа G=<X;r>. Хроматическое число графа G=<X;r>. Раскраской вершин графа в цвета называют разбиение множества вершин графа на попарно непересекающиеся непустые подмножества, состоящие из попарно несмежных вершин, т.е. X=X1X2…X; XiXj=, где i j, 1i,j. 63 Тогда каждому подмножеству Xi можно соотнести особый цвет краски. В этом случае никакие две смежные вершины не могут быть окрашены в один цвет. Наименьшее число , при котором никакие две смежные вершины графа не могут быть окрашены в один цвет, называют хроматическим числом графа. Нахождение хроматического числа достаточно трудоёмкая задача, имеющая сложный алгоритм и требующая большого объёма вычислений. Однако, можно дать оценку этого числа. Так хроматическое число полного nвершинного графа равно n, пустого графа - 1, графа с циклом чётной длины - 2, графа с циклом нечётной длины - 3, графа типа дерево - 2. В отдельных случаях может быть рекомендована оценка по следующей формуле: maxi{i+1}. Например, для графа, приведённого на рис. 25, хроматическое число равно 3, т.к. он содержит циклы нечётной длины: пусть x1 - красный, x2 синий, x3 - зелёный, x4 - красный, x5 - зелёный, x6 - красный, x7 - синий, x8 зелёный. Плотность графа G=<X;r>. Наибольшее число вершин полного подграфа G=<X;r>, между всеми вершинами которого задано отношение смежности, называют плотностью графа G и обозначают (G), т.е. (G)= maxi{|Xi|}. Например, для графа, приведённого на рис. 24, плотность графа равна 3, а на рис. 17а) - 5. Подробнее см. 3.3. Неплотность графа G=<X;r>. Наибольшее число вершин пустого подграфа G=<X;r>, между всеми вершинами которого отсутствует отношение смежности, называют неплотностью графа G и обозначают (G), т.е.: (G)= maxi{|Xi|}. Очевидно, что(G)=(G) и (G)=(G). Для графа,приведённого на рис. 17б) неплотность графа равна 5. Число внутренней устойчивости графа G=<X;r>. Наибольшее число попарно несмежных вершин графа G формирует число внутренней устойчивости графа. Для поиска этого числа следует воспользоваться условием: hxiS=, где xiS, SX и S-множество несмежных вершин графа G. Таких подмножеств в графе G может быть несколько. Выбор из множества {S} подмножества с наибольшим числом вершин определяет число внутренней устойчивости, т.е. (G)=maxi{|Si|}. Подробнее о поиске числа внутренней устойчивости см. 3.3. Число внешней устойчивости графа G=<X;r>. Наименьшее число вершин графа G смежных со всеми остальными вершинами графа формирует число внешней устойчивости графа. Для поиска этого числа следует воспользоваться условием: hxiТxiT, TX и T-множество вершин графа G, смежных c вершинами X\T. 64 Таких подмножеств в графе G может быть несколько. Выбор из 1 2 3 4 5 6 7 8 множества {T} подмножества с наименьшим числом вершин определяет число 1 2 3 4 6 7 8 внешней устойчивости, т.е. 9 5 10 (G)=mini{|Ti|}. Подробнее о поиске числа внешней устойчивости см. 3.3. Контрольные вопросы и задачи. 1. Найти число компонент связности для графа 2. Найти цикломатическое число для графа 3. Указать хроматическое число для графа x1 x3 x0 x5 x2 x4 4. Найти число внешней устойчивости для графа (см.п.1). 5. Найти число внутренней устойчивости для графа (см.п.2). 3.3. Операции над графами. 65 Алгебраические операции можно выполнять над одним или несколькими графами. Операции над одним графом - унарные операции,- позволяют искать дополнение графа, выполнять слияние (конденсацию) вершин графа, удаление вершин или рёбер графа, поиск основных чисел графа (связности, плотности, устойчивости и т.п.). Операции над двумя графами - бинарные операции,позволяют выполнять операции объединения, пересечения, композиции, разности, произведения, поиска эквиваленции двух или нескольких графов. 3.3.1. Унарные операции. Дополнение графа G=<X;r>. Согласно определению (см.2.1) для формирования дополнительного графа G=<X;r> необходимо найти дополнение отношения r=r, матрица которого формируется в виде 1, если ri,j=0; r`i,j = 0, если ri,j=1. { Поэтому, используя матрицу смежности графа G, следует сформировать матрицу смежности для графа G по указанному правилу. На рис. 26а) дан граф G, а на рис. 26б) его дополнение G`. а) x1 б) x1 x5 x2 x4 r x1 x2 x3 x4 x5 i x5 x2 x3 x1 0 1 1 1 1 4 x2 1 0 1 0 0 2 x4 x3 1 1 0 1 0 2 x4 1 0 1 0 0 2 x5 1 0 0 0 0 1 r x1 x2 x3 x4 x5 i x3 x1 0 0 0 0 0 0 x2 0 0 0 1 1 2 x3 0 0 0 0 1 1 x4 0 1 0 0 1 2 x5 0 1 1 1 0 3 Рис. 26. Дополнение графа. Слияние (конденсация) вершин графа G=<X;r>. При анализе сложных графов возможно полные подграфы заменить фиктивной вершиной, что существенно упрощает весь процесс анализа. Поэтому прежде вcего необходимо найти полные подграфы для данного графа. Для поиска полных подграфов 66 удобно воспользоваться матрицей достижимости, определяющей связность любых вершин графа. Поскольку hxi={xj} - множество вершин графа, которые достижимы из xi за один “шаг”, то отображение h(h(xi))=hxi2 есть множество вершин достижимых из xi за два “шага”. Так как любая вершина связанного графа должна быть достижима за pn “шагов”, то множество вершин достижимых из вершины xi может быть представлено в виде: p qi+=xi hxihxi2… hxip=j=0 hxij. Для построения матрицы достижимости ||qi,j+|| удобно воспользоваться матрицей смежности ||ri,j||, т.е. n ||qi,j+||=||ri.j|| ||ri,j2 ||||ri,j3||…||ri,jn ||=p=1 ||ri,jp||. Для возведения в степень матрицы смежности следует использовать правила композиции двух отношений (см. 1.7): ri,j2=k=1 x2 (r n i,k rk,j); x4 x1 x6 x3 x5 ri,j3=k=1 n (ri,k rk,j2); и так далее. На рис. 27 показан процесс построения матрицы достижимости. Так как в графе есть ориентированные отрезки линий (дуги), то необходимо найти сильную связность. Для этого необходимо прежде всего построить матрицу обратной достижимости, т.е. n ||qi,j-1||=||ri,j-1 || ||ri,j-2 ||||ri,j-3|| …||ri,j-n ||=p=1 ||ri,j-p||, и найти пересечение матриц прямой и обратной достижимости. На рис. 28 показан процесс построения матрицы обратной достижимости ||qi,j-1||. r3 x1 x2 x3 x4 x5 x6 В результате исполнения x1 0 1 1 1 1 1 + операции ||q ||||q || выявлен полный x2 0 1 1 1 1 1 x3 0 1 1 1 1 0 подграф G=<X;r>, где x4 0 1 1 1 1 1 X={x2;x3;x4}. Мощность множества x5 0 0 0 0 0 0 X определяет плотность графа x6 0 0 0 0 0 0 G=<X;r>. Для данного примера (G)=3. Более того, для последующего анализа графа G=<X;r> подмножество X можно заменить фиктивной вершиной x*. Эта процедура называется “кондесацией” графа (см. рис. 29). 67 r-1 x2 0 0 1 1 0 0 x3 0 1 0 1 0 1 x4 0 1 1 0 1 0 x5 0 0 0 0 0 1 x6 0 0 0 0 0 0 r-2 x1 x2 x3 x4 x5 x6 x1 0 1 0 0 0 0 x2 0 1 1 1 1 1 x3 0 1 1 1 1 1 x4 0 1 1 1 1 1 x5 0 0 0 0 0 0 x6 0 0 0 0 0 0 q- x1 x2 x3 x4 x5 x6 x1 0 1 1 1 1 1 x1 x2 x3 x4 x5 x6 x1 0 0 0 0 0 0 x1 1 0 0 0 0 0 x2 1 0 1 1 0 0 x5 0 0 0 0 1 0 x6 0 0 0 1 1 0 x6 0 0 0 0 0 1 r2 r-3 q+q- r x1 x2 x3 x4 x5 x6 x2 0 1 1 1 0 0 x3 0 1 0 1 0 0 x3 0 1 1 1 0 0 x4 0 1 1 0 0 0 x4 0 1 1 1 0 0 x5 0 0 1 0 0 0 x1 x2 x3 x4 x5 x6 x1 0 0 1 1 0 0 x2 0 1 1 1 1 1 x3 0 1 1 1 1 0 x4 0 1 1 1 0 1 x5 0 0 0 0 0 0 x6 0 0 0 0 0 0 x1 x2 x3 x4 x5 x6 x1 1 1 1 1 1 1 x2 0 1 1 1 1 1 x3 0 1 1 1 1 1 x4 0 1 1 1 1 1 x5 0 0 0 0 1 1 x6 0 0 0 0 0 1 Рис. 27. Построение x1 x5 x6 матрицы достижимости. x1 x2 x3 x4 x5 x6 x1 0 0 0 0 0 0 x2 0 1 1 1 0 0 x1 x2 x3 x4 x5 x6 x1 1 0 0 0 0 0 x2 1 1 1 1 0 0 q+ Рис. 28. Построение матрицы контрдостижимости. x x3 1 1 1 1 0 0 x3 1 1 1 1 0 0 x4 1 1 1 1 0 0 x5 0 1 0 1 0 0 x6 0 1 1 0 0 0 x4 1 1 1 1 0 0 x5 1 1 1 1 1 0 x6 1 1 1 1 1 1 Рис. 29. Поиск ||qij+||||qij-||. Поиск числа компонент связности графа G=<X;r>. Пусть дан неориентированный граф, что может быть образом печатной платы (см. рис. 30). 68 Зрительно данный граф не является планарным и требует формирования многослойной печатной платы. Для решения задачи поиска числа компонент связности графа следует также воспользоваться матрицей достижимости, т.е. n qi,j+=p=1 ri,jp. Для этого следует задать матрицу смежности исходного графа (см. рис. 30б)) и возводить её в степень до тех пор пока в ней не будет изменений. Для данного графа достаточно вычислить ||ri,j2 ||, т.к. ||ri,j3 ||, ||ri,j4 ||… не дают какихлибо изменений. На рис. 30в) приведена матрица ||ri,j2 || , а на рис. 30г) - матрица достижимости ||qi,j+||=(||ri,j|| ||ri,j2||. Анализ этой матрицы показывает, что некоторые вершины взаимодостижимы не более, чем за два шага, а некоторые недостижимы за любое количество шагов. Если выполнить перестановку строк и столбцов матрицы для соответствующих вершин, то, не изменяя сути достижимости, можно сформировать два блока единичных подматриц (см. рис. а) x1 x2 x3 x4 x5 x6 x7 x8 30д)) для двух связанных подграфов. Первый блок опирается на вершины графа X1={x1;x4;x5;x6}, а второй - на вершины графа X2={x2;x3;x7;x8}. Эти два блока б) в) 2 r x1 x2 x3 x4 x5 x6 x7 x8 r x1 x2 x3 x4 x5 x6 x7 x8 x1 0 0 0 0 1 1 0 0 x1 1 0 0 1 1 1 0 0 x2 0 0 1 0 0 0 1 0 x2 0 1 1 0 0 0 1 1 x3 0 1 0 0 0 0 1 1 x3 0 1 1 0 0 0 1 1 x4 0 0 0 0 1 1 0 0 x4 1 0 0 1 1 1 0 0 x5 1 0 0 1 0 1 0 0 x5 1 0 0 1 1 1 0 0 x6 1 0 0 1 1 0 0 0 x6 1 0 0 1 1 1 0 0 x7 0 1 1 0 0 0 0 0 x7 0 1 1 0 0 0 1 1 x8 0 0 1 0 0 0 0 0 x8 0 1 1 0 0 0 1 1 формируют два подграфа G1=<X1;r1> и G2=<X2;r2>, не связанных между собой. То есть для исходного графа G=<X;r> число компонент связности равно æ(G)=2. При анализе ориентированного графа необходимо найти матрицы достижимости и контрдостижимости, определить сильную связность и, выполнив операции перестановки строк и столбцов для соответствующих вершин графа, найти число полных и независимых единичных подматриц. Число этих блоков определит число компонент связности для ориентированного графа. По этому же алгоритму выполняют поиск плотности графа (G) и, после определения дополнительного графа G, поиск неплотности графа (G)=(G). 69 Рис. 30. Поиск числа компонент связности графа. Удаление рёбер графа G=<X;r>. Пусть дан граф (см. рис. 31а)), у которого необходимо удалить рёбра r2,3,r2,7,r4,5,r4,6. Удаление рёбер удобно выполнять по матрице инциденции. В результате будет получена матрица, число строк которой уменьшится на число удаляемых рёбер, а число вершин б) а) x1 x2 r2,3 x3 h x4 r2,7 r1,6 r1,5 r3,8 r4,5 r4,6 r3,7 x5 r5,6 x6 x7 x8 останется G=<X;r>прежним. Так будет а) x1 h r1,5 1 r1,6 1 r3,7 0 r3,8 0 r5,6 0 2 Xi + q x1 x2 x3 x4 x5 x6 x7 x8 x2 0 0 0 0 0 0 x3 0 0 1 1 0 2 x4 0 0 0 0 0 0 x5 1 0 0 0 1 2 x6 0 1 0 0 1 2 x1 x2 x3 x4 x5 x6 x7 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 1 x1 r1,5 r1,6 r2,3 r2,7 r3,7 r3,8 r4,5 r4,6 r5,6 Xi 1 1 0 0 0 0 0 0 0 2 в) x7 0 0 1 0 0 1 г) x8 0 1 1 0 0 0 1 1 x8 0 0 0 1 0 1 q+ x1 x4 x5 x6 x2 x3 x7 x8 70 x2 0 0 1 1 0 0 0 0 0 2 x3 0 0 1 0 1 1 0 0 0 3 x4 0 0 0 0 0 0 1 1 0 2 x5 1 0 0 0 0 0 1 0 1 3 x6 0 1 0 0 0 0 0 1 1 3 x7 0 0 0 1 1 0 0 0 0 2 x8 0 0 0 0 0 1 0 0 0 1 получен суграф G=<X;r> графа G=<X;r>. На рис. 31 показан процесс удаления рёбер графа. д) x1 x4 x5 x6 x2 x3 x7 x8 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 x6 x7 б) x8 0 1 0 0 0 0 0 1 1 3 0 0 0 1 1 0 0 0 0 2 0 0 0 0 0 1 0 0 0 1 Рис. 31. Удаление рёбер графа. h Удаление вершины графа G=<X;r>. Пусть дан граф (см. рис. 32а), у которого необходимо удалить вершины x2,x4. Удаление вершин и поиск инцидентных им рёбер удобно выполнять по матрице инциденции. Если в результате удаления вершины в а) x1 x2 r2,3 x3 x4 h x1 x3 x5 r1,5 r2,7 1 0 1 r1,6 1 0 0 rr3,7 0 1 r3,80 1,6 0 r13,7 0 r1,5 r3,8 r5,6r4,5 0 0 1 2 Xi r4,6 2 2 x5 r5,6 x6 x7 x8 G=<X;r> x6 0 1 0 0 1 2 r1,5 r1,6 r2,3 r2,7 r3,7 r3,8 r4,5 r4,6 r5,6 Xi x7 в) x8 0 0 1 0 0 1 0 0 0 1 0 1 г) x1 1 1 0 0 0 0 0 0 0 2 x2 0 0 1 1 0 0 0 0 0 2 x1 x2 x3 0 0 1 0 1 1 0 0 0 3 x3 x4 0 0 0 0 0 0 1 1 0 2 x5 1 0 0 0 0 0 1 0 1 3 x4 г) x1 x3 r1,5 r1,6 r3,7 x5 r5,6 x6 x7 G=<X;r> r3,8 x8 x5 x6 x7 x8 G=<X;r> Рис. 32. Удаление вершин графа. строке матрицы инциденции будет одна “1”, то данную строку, являющуюся образом ребра или дуги, нужно удалить. В результате будет получена новая матрица инциденции, являющаяся образом подграфа G=<X;r> графа G=<X;r>. На рис. 32 показан процесс удаления вершин графа. Поиск числа внутренней устойчивости графа G=<X;r>. Пусть дан граф G=<X;r>, который может быть образом строительной конструкции, для которой необходимо найти наибольшее число несмежных вершин (см. рис. 33а)). Для этого удобно воспользоваться таблицами отображений, которые необходимо дополнить столбцом несмежных (hxi) вершин графа G (см. рис. 33б)). Если по 71 этой таблице найдутся несмежные вершины, то нужно сформировать двухэлементные множества из числа несмежных вершин и найти им образ hxi,xj и hxi,xj. Для формирования двухэлементных множеств несмежных вершин использовать процедуру сочетания из элементов x и hxi. Найти отображение двухэлементных множеств: hxi,xj и hxi,xj. Если найдутся элементы hxi,xj, то сформировать трёхэлементные множества из вершин, принадлежащих {xi,xj} и hxi,xj. Найти отображение трёхэлементных множеств {xi,xj,xk} и hxi,xj,xk. Если найдутся элементы hxi,xj,xk, то сформировать четырёхэлементные множества и т.д. Для нашего примера трёхэлементные множества hxi,xj,xk определяют {hxi,xj,xk}=0. Поэтому наибольшее подмножество несмежных вершин для данного графа содержит не более трёх вершин исходного графа. Множество несмежных вершин графа G содержит шесть подмножеств, среди которых два подмножества имеют наибольшее в) б) {x h(x i;xj} i;xj) h(x ;x i j) xi hXi xh 1 Xi x x x 1;x5 2;x3;x4;x7 6 x2;x3;x4 x5;x6;x7 а)x1 x1;x6 x2;x3;x4;x7 x5 x2 x3 x4 x5 x6 x7 x1;x3;x5 x1;x2;x4;x5;x6 x1;x3;x6 x2x2;x3;x7 x3;x4;x7 x5;x6 x5 x4;x6;x7 x7 x2;x5;x7 x1;x4;x6 x1;x2;x5 3 ;x ;x x1x ;x 2 3 4 x6 x1;x7 x2;x4 x2;x6 x4 x2;x7 x3;x7 x4;x5 x4;x7 x5;x6 x2;x3;x4;x5;x6 x1;x3;x5;x6 x1;x3;x4;x5;x7 x1;x3;x5;x6 x1;x2;x4;x5;x6 x1;x2;x3;x6;x7 x1;x3;x5;x6 x2;x3;x4;x7 x7 x4 x2 x1 г) {xi;xj;xk} x1;x5;x6 x2;x4;x7 h(xi;xj;xk) x2;x3;x4;x7 x1;x3;x5;x6 x7h(xi;xj;xk) число вершин. На рис. 33 дан процесс поиска числа внутренней устойчивости графа. д) S={{x1;x7};{x2;x6};{x3;x7}; {x4;x5};{x1;x5;x6};{x2;x4;x7}}. (G)=maxi{|Si|}=3. Рис. 33. Поиск внутренней усточивости графа. Поиск внешней устойчивости графа G=<X;r>. Пусть дан граф G=<X;r>, для которого необходимо найти наименьшее число вершин, смежных со всеми остальными вершинами (см. рис. 34а)). Для этого также следует воспользоваться таблицами отображений и дополнить их столбцом несмежных вершин hxi(см. рис. 34б)). При наличии несмежных вершин, т.е. вершин, принадлежащих hxi, сформировать двухэлементные подмножества {xi;xj} из всех вершин исходного графа, т.е. найти комбинаторные объекты сочетания из n элементов по два. Для двухэлементных подмножеств {xi;xj} найти множества элементов, принадлежащих hxi,xj и hxi,xj. Если найдётся {hxi,xj}=, то процесс 72 окончен, в противном случае - перейти к формированию трёхэлементных подмножеств исходного множества вершин и т.д. Наименьшее число вершин графа G=<X;r>, смежных со всеми остальными вершинами, равно двум, а число таких подмножеств вершин равно шести. Выбор одного из подмножеств вершин внешней устойчивости определяется другой задачей. Множество вершин графа, определяющих внешнюю и внутреннюю его устойчивости, формирует ядро графа. Для данного графа ядром является одно из трёх x1 а) x2 x4 x3 x5 x6 x7 подмножеств {{x1;x7};{x2;x6};{x3;x7};{x4;x5}}, выбор которого также определяется какой-то другой задачей. Процесс поиска внешней устойчивости показан на рис. 34. xi x1 x2 x3 x4 x5 x6 x7 hXi x2;x3;x4 x1;x3;x5 x1;x2;x4;x5;x6 x1;x3;x6 x2;x3;x7 x3;x4;x7 x5;x6 б) hXi x5;x6;x7 x4;x6;x7 x7 x2;x5;x7 x1;x4;x6 x1;x2;x5 x1;x2;x3;x4 г) T={{x1;x7};{x2;x6};{x3;x5}; {x3;x6};{x3;x7};{x4;x5}} (G)=mini{|Ti|}=2. Ядро={{x1;x7};{x2;x6};{x3;x7}; {x4;x5}}. {xi;xj} x1;x2 x1;x3 x1;x4 x1;x5 x1;x6 x1;x7 x2;x3 x2;x4 x2;x5 x2;x6 x2;x7 x3;x4 x3;x5 x3;x6 x3;x7 x4;x5 x4;x6 x4;x7 x5;x6 x5;x7 x6;x7 h(xi;xj) x3;x4;x5 x2;x4;x5;x6 x2;x3;x6 x2;x3;x6 x2;x3;x4;x7 x2;x3;x4;x5;x6 x1;x4;x5;x6 x1;x3;x5;x6 x1;x3;x7 x1;x3;x4;x5;x7 x1;x3;x5;x6 x1;x2;x5;x6 x1;x2;x4;x6;x7 x1;x2;x4;x5;x7 x1;x2;x4;x5;x6 x1;x2;x3;x6;x7 x1;x3;x7 x1;x3;x5;x6 x2;x3;x4;x7 x2;x3;x6 x3;x4;x5 Рис. 34. Поиск внешней устойчивости графа. 3.3.2. Бинарные операции. 73 в) h(xi;xj) x6;x7 x7 x5;x7 x7 x5 x7 x7 x4;x6 x4 x7 x2;x5 x2 x1 x1;x4 x1;x2 При исполнении операций над двумя графами G1=<X1;r1> и G2=<X2;r2> следует обратить внимание на наличие общих элементов, принадлежащих X1 и X2 или r1 и r2. Этот анализ позволяет выделить три варианта: 1. Вершины и рёбра (дуги) графов на имеют общих элементов, т.е. (X1X2)= и (r1r2)=; 2. Вершины графов имеют общие элементы, а рёбра (дуги) - нет, т.е. (X1X2) и (r1r2)=; 3. Вершины и рёбра (дуги) графов имеют общие элементы, т.е. (X1X2) и (r1r2); Для каждого из вариантов результат применения теоретикомножественной операции будет формировать граф, отличный от других вариантов. Объединение графов G1=<X1;r1> и G2=<X2;r2> есть граф G=<X;r>, для которого X=(X1X2) и r=(r1r2). Объединенние двух графов обозначается как G=(G1G2). На рис. 35 дана иллюстрация этой операции для трёх вариантов. Для исполнения этой операции можно воспользоваться матрицами инциденции и матрицами смежности. Матрица смежности для графа G=<X;r> будет иметь число строк и столбцов равным |X|=|X1X2|, а элементы матрицы определяются соотношением: ri,j=ri,j(1) ri,j(2). а) x2 x4 G1 x3 x2 x7 x4 x1 x3 x7 x5 x2 x4 G2 x1 x3 x2 x3 x2 x5 G x6 x4 G1 в) x2 G2 x1 б) x5 x6 x5 G x6 x3 x1 x3 x2 x6 x4 G G1 x1 G2 x3 x1 x4 x1 x3 Рис. 35. Объединение двух графов. Пересечение графов G1=<X1;r1> и G2=<X2;r2> есть граф G=<X;r>, для которого X=(X1X2) и r=(r1r2). Пересечение двух графов обозначается как G=(G1G2). На рис. 36 дана иллюстрация этой операции для трёх вариантов. Для исполнения этой операции также можно воспользоваться матрицами инциденции и матрицами смежности. Матрица смежности для графа G=<X;r> 74 будет иметь число строк и столбцов равным |X|=|X1X2|, а элементы матрицы определяются соотношением: ri,j=ri,j(1)ri,j(2). а) x2 x4 x5 G G1 x1 б) G2 x3 x2 x7 x6 x4 x5 G G1 G2 x3 x1 в) x3 x2 x3 x2 G1 x1 x6 x3 x2 G2 x3 G x1 x4 x1 x3 Рис. 36. Пересечение двух графов. Композиция графов G1=<X1;r1> и G2=<X2;r2> есть граф G=<X;r>, для которого X(X1X2), а ri,jr ориентирована от вершин графа G1 к вершинам графа G2 и существует тогда и только тогда, когда есть хотя бы одна вершина xk, принадлежащая двум графам G1 и G2, что обеспечивает маршрут через вершину xk , с началом маршрута в xi (1)X1 и концом в xj (2)X2. Композиция двух графов обозначается как G=(G1G2). Матрица смежности графа G=<X;r> имеет число строк и столбцов |X||X1X2|, а элементы матрицы определяются соотношением: ri,j= k=1 n(ri,k(1)rk,j(2)). На рис. 37 дана иллюстрация этой операции для трёх вариантов. 75 а) x2 x4 x5 G G1 x1 б) G2 x3 x2 x7 x6 x4 x5 x2 G x1 G1 x1 в) x4 G2 x3 x2 x3 x6 x2 x6 x3 x1 x2 G G1 x1 G2 x3 x1 x4 x4 x3 Рис. 37. Композиция графов. Модульное произведение графов G1=<X1;r1> и G2=<X2;r2> есть граф G=<X;r>, множество вершин которого X определяется прямым произведением (xi(1);xj(2))(X1X2), а множество рёбер ((xi(1);xj(2));…;(xk(1); xl (2)))r существует тогда и только тогда, когда в графах G1 и G2 есть соответственно рёбра (xi(1);xk(1))r1 и (xj(2);xl(2))r2. Модульное произведение обозначается как G=(G1G2). Для поиска смежности вершин графа G удобно использовать таблицы отображения вершин графов G1 и G2 и составить таблицу отображения для (xi(1);xj(2))X. Элементы таблицы отображения следует заполнить по правилу: h(xi(1),xj(2))={(hXi(1)hXj (2))}, где hXi(1)={x(1)}X1, hXi(2)={x(2)}X2. По результатам вычислений составить матрицу смежности графа G=<X;r>. На рис. 38 показан процесс вычисления модульного произведения двух неориентированных графов. 76 а)G1 G2 x2(1) xi(1) x1(1) x2(1) x3(1) x2(2) xj(2) x1(2) x2(2) hXi(1) x2(1) x1(1);x3(1) hXi(2) x2(2) x1(2) x2(1) x1(1) x3(1) б) h(xi(1);xj(2)) (x2(1);x2(2)) (x1(1);x2(2));(x3(1);x2(2)) (x2(1);x2(2)) (x2(1);x1(2)) (x1(1);x1(2));(x3(1);x1(2)) (x2(1);x1(2)) (xi(1);xj(2)) (x1(1);x1(2)) (x2(1);x1(2)) (x3(1);x1(2)) (x1(1);x2(2)) (x2(1);x2(2)) (x3(1);x2(2)) r (x1(1);x1(2)) (x2(1);x1(2)) (x3(1);x1(2)) (x1(1);x2(2)) (x2(1);x2(2)) (x3(1);x2(2)) г) x1(2) (x1(1); x1(2)) 0 0 0 0 1 0 x2(1) (x3(1); x1(2)) 0 0 0 0 1 0 x2(2) G1 x1(1) (x2(1); x1(2)) 0 0 0 1 0 1 (x1(1); x2(2)) 0 1 0 0 0 0 (x2(1); x2(2)) 1 0 1 0 0 0 (x1(1);x1(2)) (x2(1);x1(2)) (x3(1);x1(2)) G2 x3(1) в) (x3(1); x2(2)) 0 1 0 0 0 0 G x1(2) (x1(1);x2(2)) (x2(1);x2(2)) (x3(1);x2(2)) Рис. 38. Поиск модульного произведения графов. Декартова сумма графов G1=<X1;r1> и G2=<X2;r2> есть граф G=<X;r>, множество вершин которого X определяется также прямым произведением (xi(1);xj(2))(X1X2), а множество рёбер ((xi(1);xj(2));…(xk(1); xl (2)))r существует тогда и только тогда, когда существует только рёбро (xi(1);xk(1))r1 или только ребро (xj(2);xl(2))r2. Декартова сумма двух графов обозначается как G=(G1G2). Для поиска смежности вершин графа G также удобно использовать таблицы отображения вершин графов G1 и G2 и составить таблицу отображения для графа G. Элементы таблицы отображения графа G определяются по правилу: h(Xi(1),Xj(2))={(hXi(1)xj(2))}{(xi(1)hXj(2))}, где hXi(1)={x(1)}X1, hXi(2)={x(2)}X2, - знак исключающего или. По результатам вычислений (xi(1);xj(2)) заполнить таблицу отображения для графа G, затем составить матрицу смежности графа G=<X;r>. На рис. 39 показан процесс вычисления декартовой суммы двух неориентированных графов. 77 а)G1 G2 x2(1) xi(1) x1(1) x2(1) xx3(1) xj(2) x1(2) x2(2) hXi(1) x2(1) (1) x1 ;x3(1) x2(1) x1(1) h(xi(1);xj(2)) (x2(1);x1(2))(x1(1);x2(2)) ((x1(1);x1(2))(x3(1);x1(2)))(x2(1);x2(2)) (x2(1);x1(2))(x3(1);x2(2)) (x2(1);x2(2))(x1(1);x1(2)) (1) ((x1 ;x2(2))(x3(1);x2(2)))(x2(1);x1(2)) (x2(1);x2(2)) (x3(1);x1(2)) в) r (x1(1);x1(2)) (x2(1);x1(2)) (x3(1);x1(2)) (x1(1);x2(2)) (x2(1);x2(2)) (x3(1);x2(2)) г) (x1(1); x1(2)) 0 1 0 1 0 0 x2(1) (x2(1); x1(2)) 1 0 1 0 1 0 (x3(1); x1(2)) 0 1 0 0 0 1 x2(2) G1 x1(1) hXj(2) x2(2) x1(2) x1(2) x3(1) б) (xi(1);xj(2)) (x1(1);x1(2)) (x2(1);x1(2)) (x3(1);x1(2)) (x1(1);x2(2)) (x2(1);x2(2)) (x3(1);x2(2)) x2(2) x3(1) (x1(1); x2(2)) 1 0 0 0 1 0 (x2(1); x2(2)) 0 1 0 1 0 1 (x3(1); x2(2)) 0 0 1 0 1 0 (x1(1);x1(2)) (x2(1);x1(2)) (x3(1);x1(2)) G2 G x1(2) (x1(1);x2(2)) (x2(1);x2(2)) (x3(1);x2(2)) Рис. 23. Поиск декартова произведения двух графов. Изоморфизм графов G1=<X1;r1> и G2=<X2;r2>. Поскольку графы могут быть заданы различным способом: таблицами отношений или отображений, матрицами инциденции или смежности, графическими рисунками или чертежами, то вид и форма описания существенно зависят от исполнителя. Поэтому трудно иногда понять одинаковы ли предъявленные графы. Одинаковость состава и структуры графов определяется отношением изоморфизма. Пусть даны два графа G1=<X1;r1> и G2=<X2;r2> и дано взаимооднозначное отображение на множестве вершин и рёбер графов, т.е. X1X2 и -1X1 X2, r1r2 и -1r1 r2. 78 Обозначим упорядоченную пару (;т.е.=(,или-1=(-1,1 . Тогда граф G1 изоморфен графу G2, если вершина xi(1)X1 инцидентна ребру или дуге ri,j(1)r1 тогда и только тогда, когда вершина Xi(1)=x2X2 инцидентна ребру или дуге ri,j(1)=rl,m(2)r2, т.е. G1=G2 и наоборот, 1G2=G1. Если такой изоморфизм существует, то графы G1 и G2 изоморфны, и оба они могут быть представлены одинаковыми матрицами инциденции или смежности. Если два графа изоморфны, то они имеют одинаковые числа и результат исполнения операций над одним из графов справедлив применительно к а) x1 x4 x2 R x3 x5 x1 x2 x3 x4 x5 x6 I x1 0 0 0 1 1 1 3 x2 0 0 0 1 1 1 3 x3 0 0 0 1 1 1 3 x4 1 1 1 0 0 0 3 x5 1 1 1 0 0 0 3 x6 1 1 1 0 0 0 3 a b c d e f I a 0 1 0 1 0 1 3 b 1 0 1 0 1 0 3 c 0 1 0 1 0 1 3 d 1 0 1 0 1 0 3 e 0 1 0 1 0 1 3 f 1 0 1 0 1 0 3 1 2 3 4 5 6 I 1 0 1 0 1 1 0 3 2 1 0 1 0 0 1 3 3 0 1 0 1 1 0 3 4 1 0 1 0 0 1 3 5 1 0 1 0 0 1 3 6 0 1 0 1 1 0 3 x6 R б) a e f c b d R в) 1 6 5 4 2 3 Рис. 40. Изоморфизм графов. другому графу. Отношение изоморфизма рефлексивно, симметрично и транзитивно, т.е. является отношением эквиваленции. Следовательно, отношение изоморфизма разбивает всё множество графов на непустые и попарно непересекающие классы эквиваленции изоморфных графов. Необходимыми условиями изоморфизма графов являются: равенство числа вершин и рёбер, одинаковость числа петель и набора степеней вершин графов, а достаточными условиями - одинаковость матриц инциденции или смежности графов. Чтобы проверить одинаковость матриц инциденции или 79 смежности графов необходимо для n-вершинных графов выполнить n! перестановок строк и столбцов одного графа, каждый раз сравнивая с содержанием матрицы второго графа. На рис. 40 дан пример изоморфизма трёх графов. Матрицы смежности каждого графа содержат по шесть вершин и девять рёбер. Набор степеней вершин у всех графов также одинаков. Кстати, графы, у которых все вершины имеют одинаковую степень, называют однородными. Для проверки совместимости второго графа (см. рис. 40б)) с первым (см. рис. 40а)) наобходимо выполнить перестановки строк и столбцов матрицы смежности второго графа. Просмотр всех вариантов требует исполнения 720 перестановок. Однако, если поменять местами вершины b и e, поменяв местами соответствующие столбцы и строки матрицы смежности, то новая матрица второго графа будет тождественна матрице смежности первого графа. Для проверки совместимости третьего графа(см. рис. 40в)) также необходимо выполнить перестановки строк и столбцов матрицы смежности. Очевидно, если поменять местами вершины 2 и 6, соответственно столбцы и строки матрицы смежности, то получим матрицу третьего графа тождественную матрице первого графа. Итак, доказана изоморфность всех трёх графов, т.е. сформирован класс эквиваленции для трёх графов. Контрольные вопросы и задачи. 1.Найти дополнение к графу х4 x5 x3 x1 x1 x2 2.Найти полные подграфы графа x3 x5 x9 x2 x4 x6 x8 x11 x10 x7 3. Найти число компонент связности графа 80 x3 x7 x2 x4 x8 x6 x1 x10 x9 x5 4. Найти числа внешней и внутренней устойчивости графа а) x1 x3 x5 x0 x7 x2 x4 x6 x1 x3 x5 б) x0 x7 x2 x4 x6 5. Найти объединение и пересечение двух графов а) граф G1=<X;r1> ri r11 r12 r13 r14 (xi;xj) (x1;x3) (x2;x4) (x2;x5) (x3;x4) r11 (xi;xj) б) граф G2=<X;r2> r21 r22 (x1;x2) (x1;x5) r23 (x1;x4) r24 (x2;x3) r15 (x3;x5) r16 (x4;x5) r25 (x2;x4) r26 (x2;x5) 6. Найти модульное произведение двух графов х2(1) х1(1) х3(1) х4(1) х2(2) х1(2) х3(2) 7. Найти декартову сумму двух графов, приведенных в п.6. 8. Изоморфны ли графы 81 а) х1 х1 х6 х2 х5 x2 х3 х4 х5 х3 х6 х4 a б) a d e b c b e d c 3.4. Алгоритм построения покрывающего дерева. Остов графа G=<X;r> есть связанный суграф в виде дерева без циклов, петель и кратных ребер, опирающийся на все множество вершин исходного графа, т.е. G`=<X;r`>, где r`r. Так как остов опирается на все верщины графа G, то его называют покрывающим остовом или деревом. Остов, покрывающий n вершин графа G, содержит (n-1) ребро. Задача поиска покрывающего остова G`=<X;r`> возникает при разметке модулей баз данных, при организации сложных программных комплексов, при проектировании трасс вычислительных сетей и транспортных систем. Суть алгоритма заключена в просмотре ребер графа в произвольном порядке, формировании фрагмента остова графа, т.е. G`=<X`;r`>, где Х`Х подмножество вершин графа и r`r - подмножество ребер, включаемых во фрагмент: шаг 1: выбрать любое ребро, не являющееся петлей, сформировать фрагмент, а концевые вершины ребра включить в подмножество Х`; шаг 2: выбрать любое ребро, не принадлежащее фрагменту и не являющееся петлей: а) если одна концевая вершина выбранного ребра принадлежит фрагменту, то вторую концевую вершину включить в подмножество Х`, а ребро включить в фрагмент остова G`=<X`;r`>; б) если ни одна концевая вершина ребра не принадлежит фрагменту остова, то сформировать фрагмент другого остова; в) если коцевые вершины принадлежат различным остовам, то соединить фрагменты и вернуться к шагу 2; шаг 3: если все вершины графа вошли во фрагмент остова, т.е. Х`=Х, то конец, иначе перейти у шагу 2. 82 G=<X;r> х2 х5 х4 х1 х7 х3 х6 Рис. 41. Построение покрывающего остова графа. На рис. 41 показан процесс поиска покрывающего остова графа, где pшаг итерации. На первом шаге итерации произвольно выбрано ребро (х2;х4), на втором шаге - (х6;х7), на третьем шаге - (х1;х3). При этом согласно пункту алгоритма 2б) формировались независимые фрагменты остова G`31, G`32 и G`33. На четвертом шаге при выборе ребра (х5;х6) согласно пункту 2а) алгоритма сформирован фрагмент G`43 типа дерево. На пятом шаге при выборе ребра (х1;х2) согласно пункту 2в) произошло слияние двух фрагментов G`41 и G`42. И 83 наконец, на шестом шаге итерации при выборе ребра (х4;х6) сформирован остов графа G`6=<X;r`>. Следует обратить внимание, что число итераций равно числу присоединяемых к фрагменту ребер, а их количество должно быть меньше числа вершин на единицу. Иногда возникает задача не только найти покрывающий остов, но использовать определенный набор покрывающих ребер. Для этого необходимо прежде всего определить цикломатическое число (G), которое позволит знать число ребер, удаление которых ликвидирует циклы. Далее, используя элементы комбинаторики, найти число вариантов формирования остова. Для графа, приведенного на рис. 42 цикломатическое число равно (G)=m-n+(G)=5-4+1=2. Следовательно, необходимо убрать два ребра, чтобы получить остов х2 а) х2 д) х2 х1 х4 х1 х3 G=<X;r> б) х1 G`1 х4 х1 х3 х2 G`2 е) х4 х1 х3 в) х4 х3 х2 х4 G`6 х3 х2 х1 G`3 ж) х4 х1 х3 х2 G`7 х4 х3 з) г) х2 х2 х1 G`5 G`4 х4 х1 G`8 х4 х3 х3 Рис. 42. Остовы графа графа. Число возможных конфигураций для графа, опирающегося на четыре вершины и три ребра, определяется числом сочетаний из пяти по три, т.е. ( ) =( ) = m n 5 3 5!/(3!2!)=10. Две конфигурации сохраняют циклы в графе G`=<X;r`>. Это графы использующие ребра r`1={(х1;х2);(х2;х3);(х3;х1)} и r`2={(х2;х3);(х3;х4);(х4;х2)}. Оставшиеся восемь конфигураций остовов позволяют выбрать один, но по 84 иным критериям. Например, безотказной работы. по надежности, стоимости, вероятности 3.5. Алгоритм построения остова минимального веса. Решение такой задачи имеет большое значение в проектировании вычислительных систем с минимальной протяженностью каналов передачи информации, в организации грузоперевозок по транспортной сети при минимальных финансовых или энергетических затратах. Основная идея нахождения остова минимального веса состоит в следующем: если есть некоторый фрагмент остова G`=<X`;r`> и ребро или дуга минимального веса l(хi;хj), одна из концевых вершин которого хi принадлежит фрагменту G`, то включить в фрагмент вторую вершину ребра х j и само ребро l(хi;хj); процедуру продолжать до включения во фрагмент (n-1) ребра или дуги графа, где n-число его вершин. Фрагментом остова является суграф в виде дерева. Эта идея реализуется двумя алгоритмами. Алгоритм Дейкстра. Предусматривает заданной начальную вершину фрагмента и последовательное присоединение ребер или дуг графа, имеющих минимальный вес, к фрагменту остова. Такая постановка задачи характерна для заданной корневой вершины базы данных, для заданного узла транспортной системы, для заданного места установки сервера локальной вычислительной сети и т.п. шаг 1: выбрать ребро минимального веса, смежное начальной вершине и сформировать фрагмент G`=<X`;r`>, включив вторую концевую вершину в подмножество Х`; шаг 2: выбрать ребро минимального веса, смежное вершинам фрагмента и не являющееся петлей: а) если вторая концевая вершина не принадлежит фрагменту, то включить ее в подмножество Х`, ребро включить в фрагмент остова G`=<X`;r`>; б) если вторая концевая вершина принадлежит фрагменту, что формирует цикл, то отбросить данное ребро из анализа; шаг 3: если все вершины графа вошли во фрагмент остова, т.е. Х`=Х, то конец, иначе перейти к шагу 2. 85 Рис. 43. Построение остова графа по алгоритму Дейкстра. На рис. 43 показан процесс построения остова графа минимального веса по алгоритму Дейкстра для начальной вершины x1, где p-шаг итерации. Максимальная протяженность минимального остова равна 15 условным единицам. Алгоритм Краскала. При работе по этому алгоритму необходимо установить частичный порядок на ребрах графа, поставив на первое место ребро минимального веса, а на последнее - максимального веса. Последовательно присоединяя к фрагменту по одному ребру формируют фрагмент остова минимального веса. шаг 1: выбрать ребро минимального веса, не являющееся петлей, сформировать фрагмент остова G`=<X`;r`>, а концевые вершины ребра 86 включить в подмножество Х`Х; если несколько ребер имеют одинаковый вес, то выбрать ребро произвольно; шаг 2: выбрать ребро минимального веса, не являющееся петлей и не принадлежащее фрагменту: шаг 2.1: если фрагменту принадлежит одна вершина ребра, то вторую концевую вершину включить в подмножество Х`, ребро включить в фрагмент остова Gp`=<X`;r`>; шаг 2.2: если ни одна концевая вершина ребра не принадлежит фрагменту остова, то сформировать фрагмент другого остова; шаг 2.3: если коцевые вершины принадлежат резличным остовам, то соединить фрагменты и вернуться к шагу 2; если ребра имеют одинаковый вес, то выбрать ребро произвольно; шаг 3: если все вершины графа вошли во фрагмент остова, то конец, иначе перейти к шагу 2. На рис. 44 показан процесс построения остова графа минимального веса по алгоритму Краскала. Максимальная протяженность минимального остова также равна 15 условным единицам, что подтверждает единое решение о минимальном весе для двух алгоритмов (Дейкстра и Краскала). 87 Рис. 44. Построение остова графа по алгоритму Краскала. На каждом этапе построения остова графа формируется суграф G` графа G. В [7] даны примеры использования алгоритмов поиска остова графа минимального веса и программное обеспечение. Так в одном из примеров решается задача использования финансовых ресурсов отделом автомобильных дорог для проведения ремонтных работ на участках дорог, соединяющих n населенных пунктов. При этом длина каждого участка дороги соответствовала затратам на производство ремонтных работ. В другом примере предложена схема прокладки телевизионных кабелей системы кабельного телевидения. В третьем примере решается задача коммивояжера, который должен выехать из данного города, побывать в каждом из остальных (n-1) городов данного округа по одному разу. При этом известна длина маршрута между любой парой городов. 3.6. Алгоритмы поиска путей на графе. 88 Подобные задачи возникают при выборе маршрутов в вычислительных сетях и транспортных системах. В вычислительных сетях решение подобных задач определяет правила сетевых протоколов, которые могут быть реализованы аппаратно-программными средствами для обслуживания движения пакетов информации по сети. Для этого по данным о загрузке каналов сети, о состоянии ее узлов в сервере или коммутационной машине вычисляется наиболее оптимальный маршрут прохождения б) пакета информации. К пакету информации lp x0 .. xi xp xj .. xn добавляется заголовок, в котором x0 0 .. l0i ∞ l0j .. l0n содержится перечень узлов сети перехода .. .. 0 .. .. .. .. .. от вершины хi к вершине хj или следующая xi li0 .. 0 lip lij .. lin вершина перехода, формируемая xp ∞ .. lpi 0 lpj .. lpn коммутационной машиной. В xj lj0 .. lji ljp 0 .. ljn транспортных системах решение подобных .. .. .. .. .. .. 0 .. задач определяет наиболее экономный по xn ln0 .. lni lnp lnj .. 0nn стоимости или времени маршрут движения транспортной единицы. Образом таких систем является реберно-взвешенный граф, т.е. граф, у которого каждое ребро или дуга имеют вес. Кратчайший путь в таком графе всегда простой, т.е. каждая вершина в переходе используется только один раз. Длина кратчайшего пути определяется суммой весов ребер перехода i,j=(хi;...хk;...хj): Li,j=m,n lm,n, где im, nj, mn. В основе всех алгоритмов лежит операция сравнения двух простых маршрутов. На рис. 45а) показаны два простых маршрута, соединяющих а) хp li,p lp,j xi xj li,j вершины хi и хj. Поэтому выбор кратчайшего пути между вершинами хi x0 и хj есть результат сравнения длин двух p x0 x0 маршрутов, т.е. Li,j=min{li,j;(li,p+ lp,j)}. .. x0 Если существует несколько xi x0 вершин, смежных с вершинами хi и хj x p x0 следует выполнять процедуру xj x0 последовательно, сравнивая длины .. x0 двух маршрутов для каждой вершины. xn x0 Рис. 45. Выбор маршрута между вершинами хi и хj. .. .. .. .. .. .. .. .. xi xi xi xi xi xi xi xi xp xp xp xp xp xp xp xp xj xj xj xj xj xj xj xj .. .. .. .. .. .. .. .. xn xn xn xn xn xn xn xn Для поиска кратчайших путей разработаны несколько алгоритмов. Алгоритмы Форда-Беллмана и Дейкстра позволяют найти кратчайшие пути от заданной вершины графа до любой другой. В результате этих вычислений формируется граф типа “дерево” с корнем в заданной вершине. 89 Протяженность от начальной вершины до любой концевой вершины дерева есть кратчайший путь. Алгоритмы Форда-Беллмана и Дейкстра можно использовать для поиска остова минимального веса. Алгоритмы Флойда и Данцига позволяют искать кратчайшие пути между любой парой вершин графа. Для текущих оценок кратчайших путей между парами вершин удобно использовать матрицы (nn), где n-число вершин графа. Для того чтобы выбирать кратчайшие путь и переход, необходимо использовать две матрицы: матрицу кратчайших путей ║l(n;n)║ и матрицу кратчайших переходов ║(n;n)║. На рис. 45б) приведены две матрицы для выбора кратчайших путей и переходов. Вершина х p позволяет выбрать кратчайший путь между любой парой вершин, смежных с вершиной х p. Поэтому вершина хp называется базовой, а строка и столбец матрицы ║lp║ базовыми. Если все вершины графа индексировать целыми числами 0;1;2;...n и, в качестве базовой, использовать последовательно все вершины, начиная с вершины х0, то за (n-1) итераций можно найти кратчайшие пути между любой парой вершин. Для p=0 матрица ║l0║ есть матрица весов графа, элементы которой определяются так: li,j0= , { 0, если i=j; li,j,если вершины хi и хj смежны, вес ребра равен li,j; если вершины хi и хj не смежны. Как уже отмечалось базовая вершина позволяет найти (li,p+ lp,j) для любой пары вершин смежных с вершиной хp и представить этот результат p-ой итерации для выбора кратчайшего пути по формулам: а) если (li,p+ lp,j)li,j, то сохранить для итерации (p+1) прежнее значение li,j; б) если (li,p+ lp,j)<li,j, то заменить для итерации (p+1) прежнее значение li,j на (li,p+ lp,j). Матрица переходов p производна относительно матрицы путей. Для p=0 элементы матрицы 0 есть концевые вершины перехода из хi в хj. Поэтому в каждом столбце хj матрицы 0 указана вершина хj. Результатом p-ой итерации при выборе кратчайшего маршрута происходит замена вершины перехода вершиной кратчайшего перехода по формулам: а) если (li,p+ lp,j)li,j, то i,j(p+1)=i,jp=хj; б) если (li,p+ lp,j)<li,j, то i,j(p+1)=хp. Следовательно, для анализа n-вершинного графа необходимо последовательно построить n матриц кратчайших путей и кратчайших переходов. Алгоритм Данцига отличен от алгоритма Флойда только технологией построения матриц кратчайших путей и переходов. Алгоритм Флойда. шаг 1: присвоить каждой вершине графа целое число от 0 до n; шаг 2: составить матрицу весов ║l0║ и матрицу переходов ║0║; 90 шаг 3: принять p=0, где p-шаг итерации; шаг 4: определить вершину p базовой и выделить базовые строки и столбец; шаг 5: вычеркнуть строки и столбцы, базовые элементы которых имеют значение , т.к. (li,p+) и (+ lp,j) всегда больше конечного значения li,j; шаг 6: сравнить каждый невычеркнутый элемент ║lp║ с суммой (li,pp+ lp,jp): шаг 6.1: если (li,pp+ lp,jp)<li,jp, то li,jp+1=(li,pp+ lp,jp); i,j(p+1)=p шаг 6.2: если (li,pp+ lp,jp)>li,jp, то li,jp+1=li,jp; i,j(p+1)= i,jp. l0 x0 x1 x2 x3 x4 x5 x6 x7 x0 0 9 ∞ 3 ∞ ∞ ∞ ∞ x1 9 0 2 ∞ 7 ∞ ∞ ∞ x2 ∞ 2 0 2 4 8 6 ∞ x3 3 ∞ 2 0 ∞ ∞ 5 ∞ x4 ∞ 7 4 ∞ 0 10 ∞ 9 x5 ∞ ∞ 8 ∞ 10 0 7 12 x6 ∞ ∞ 6 5 ∞ 7 0 10 x7 ∞ ∞ ∞ ∞ 9 12 10 0 0 x0 x1 x2 x3 x4 x5 x6 x7 1 0 9 ∞ 3 ∞ ∞ ∞ ∞ 9 0 2 12 7 ∞ ∞ ∞ ∞ 2 0 2 4 8 6 ∞ 3 12 2 0 ∞ ∞ 5 ∞ ∞ 7 4 ∞ 0 10 ∞ 9 ∞ ∞ 8 ∞ 10 0 7 12 ∞ ∞ 6 5 ∞ 7 0 10 ∞ ∞ ∞ ∞ 9 12 10 0 шаг 7: если p<n, то принять p=p+1 2 и вернуться к шагу 4, иначе конец. На рис. 46 дан пример расчета кратчайших путей по алгоритму Флойда. На каждой итерации заштрихованы базовые столбец и строка, кружками выделены элементы матриц ║lp+1║ и ║p+1║, которые получили изменение относительно матриц ║lp║ и ║p║. На 7-ой итерации (p=7) процесс вычисления окончен и никаких изменений маршрутов нет. x0 x1 x2 x3 x4 x5 x6 x7 x0 x0 x0 x0 x0 x0 x0 x0 x0 x0 x1 x2 x3 x4 x5 x6 x7 x0 x0 x0 x0 x0 x0 x0 x0 x0 x1 x1 x1 x1 x0 x1 x1 x1 x1 x2 x2 x2 x2 x2 x2 x2 x2 x2 x3 x3 x0 x3 x3 x3 x3 x3 x3 x4 x4 x4 x4 x4 x4 x4 x4 x4 x5 x5 x5 x5 x5 x5 x5 x5 x5 x6 x6 x6 x6 x6 x6 x6 x6 x6 x7 x7 x7 x7 x7 x7 x7 x7 x7 x0 x1 x2 x3 x4 x5 x6 x7 x0 x0 x0 x1 x0 x1 x0 x0 x0 x1 x1 x1 x1 x0 x1 x1 x1 x1 x2 x1 x2 x2 x2 x2 x2 x2 x2 x3 x3 x0 x3 x3 x1 x3 x3 x3 x4 x1 x4 x4 x1 x4 x4 x4 x4 x5 x5 x5 x5 x5 x5 x5 x5 x5 x6 x6 x6 x6 x6 x6 x6 x6 x6 x7 x7 x7 x7 x7 x7 x7 x7 x7 l1 x0 x1 x2 x3 x4 x5 x6 x7 91 x1 x1 x1 x1 x1 x1 x1 x1 x1 x2 x2 x2 x2 x2 x2 x2 x2 x2 x3 x3 x3 x3 x3 x3 x3 x3 x3 x4 x4 x4 x4 x4 x4 x4 x4 x4 x5 x5 x5 x5 x5 x5 x5 x5 x5 x6 x6 x6 x6 x6 x6 x6 x6 x6 x7 x7 x7 x7 x7 x7 x7 x7 x7 в матрицах кратчайших путей и l4 x0 x1 x2 x3 x4 x5 x6 x7 x0 0 7 5 3 9 13 8 ∞ x1 7 0 2 4 6 10 8 ∞ x2 5 2 0 2 4 8 6 ∞ x3 3 4 2 0 6 10 5 ∞ x4 9 6 4 6 0 10 10 9 x5 13 10 8 10 10 0 7 12 x6 8 8 6 5 10 7 0 10 x7 ∞ ∞ ∞ ∞ 9 12 10 0 x0 x1 x2 x3 x4 x5 x6 x7 x0 0 7 5 3 9 13 8 18 x1 7 0 2 4 6 10 8 15 x2 5 2 0 2 4 8 6 13 x3 3 4 2 0 6 10 5 15 x4 9 6 4 6 0 10 10 9 x5 13 10 8 10 10 0 7 12 x6 8 8 6 5 10 7 0 10 x7 18 15 13 15 9 12 10 0 l5 4 x0 x1 x2 x3 x4 x5 x6 x7 x0 x0 x3 x3 x0 x3 x3 x3 x0 x1 x3 x1 x1 x2 x2 x2 x2 x1 x2 x3 x2 x2 x2 x2 x2 x2 x2 x3 x3 x2 x3 x3 x2 x2 x3 x3 x4 x3 x2 x4 x2 x4 x4 x2 x4 x5 x3 x2 x5 x2 x5 x5 x5 x5 x6 x3 x2 x6 x6 x2 x6 x6 x6 x7 x7 x7 x7 x7 x7 x7 x7 x7 x0 x1 x2 x3 x4 x5 x6 x7 x0 x0 x3 x3 x0 x3 x3 x3 x4 x1 x3 x1 x1 x2 x2 x2 x2 x4 x2 x3 x2 x2 x2 x2 x2 x2 x4 x3 x3 x2 x3 x3 x2 x2 x3 x4 x4 x3 x2 x4 x2 x4 x4 x2 x4 x5 x3 x2 x5 x2 x5 x5 x5 x5 x6 x3 x2 x6 x6 x2 x6 x6 x6 x7 x4 x4 x4 x4 x7 x7 x7 x7 6 l2 x0 x1 x2 x3 x4 x5 x6 x7 l3 x0 x1 x2 x3 x4 x5 x6 x7 x0 0 9 11 3 16 ∞ ∞ ∞ x1 9 0 2 12 7 ∞ ∞ ∞ x2 11 2 0 2 4 8 6 ∞ x3 3 12 2 0 19 ∞ 5 ∞ x4 16 7 4 19 0 10 ∞ 9 x5 ∞ ∞ 8 ∞ 10 0 7 12 x6 ∞ ∞ 6 5 ∞ 7 0 10 x7 ∞ ∞ ∞ ∞ 9 12 10 0 x0 0 9 11 3 15 19 17 ∞ x1 9 0 2 4 6 10 8 ∞ x2 11 2 0 2 4 8 6 ∞ x3 3 4 2 0 6 10 5 ∞ x4 15 6 4 6 0 10 10 9 x5 19 10 8 10 10 0 7 12 x6 17 8 6 5 10 7 0 10 x7 ∞ ∞ ∞ ∞ 9 12 10 0 3 x0 x1 x2 x3 x4 x5 x6 x7 92 x0 x0 x0 x1 x0 x2 x2 x2 x0 x1 x1 x1 x1 x2 x2 x2 x2 x1 x2 x1 x2 x2 x2 x2 x2 x2 x2 x3 x3 x2 x3 x3 x2 x2 x3 x3 x4 x2 x2 x4 x2 x4 x4 x2 x4 x5 x2 x2 x5 x2 x5 x5 x5 x5 x6 x2 x2 x6 x6 x2 x6 x6 x6 x7 x7 x7 x7 x7 x7 x7 x7 x7 Рис. 46. Выбор кратчайшего пути по алгоритму Флойда. По матрицам l7 и 7 можно найти длину и переход между любой парой вершин исходного графа. Например, между вершинами х0 и х7 длина кратчайшего пути равна 18, а переход опирается на вершины (х0;х3;х2;х4;х7), между вершинами х1 и х6 длина кратчайшего пути равна 8, а переход опирается на вершины (х1;х2;х6) и т.д. При решении практических задач возникает необходимость поиска нескольких путей линейно упорядоченных относительно кратчайшего пути. Это возможно в силу загруженности канала на определенном участке или неисправности узла. x0 x1 x2 x3 x4 x5 x6 x7 5 Для решения подобных задач x0 x0 x3 x3 x3 x3 x3 x3 x4 разработаны алгоритмы двойного x1 x3 x1 x2 x2 x2 x2 x2 x4 поиска, обобщенные алгоритмы x2 x3 x1 x2 x3 x4 x5 x6 x4 Флойда и Данцига. В основе x3 x0 x2 x2 x3 x2 x2 x6 x4 обобщенных алгоритмов лежат те же x4 x3 x2 x2 x2 x4 x5 x2 x7 идеи, которые были использованы в x5 x3 x2 x2 x2 x4 x5 x6 x7 построении исходного алгоритма x6 x3 x2 x2 x3 x2 x5 x6 x7 Флойда. Отличие состоит в том, что в x7 x4 x4 x4 x4 x4 x5 x6 x7 обобщенных алгоритмах обычные l6 x0 x1 x2 x3 x4 x5 x6 x7 операции сложения и сравнения над x0 0 7 5 3 9 13 8 18 числами, оценивающими длину пути от x1 7 0 2 4 6 10 8 15 вершины х к вершине х , заменяются i j x2 5 2 0 2 4 8 6 13 обобщенными операциями сложения и x3 3 4 2 0 6 10 5 15 сравнения. Суть обобщенных операций x4 9 6 4 6 0 10 10 9 сложения и сравнения заключена в x5 13 10 8 10 10 0 7 12 операндах этих операций, в роли которых x6 8 8 6 5 10 7 0 10 выступают кортежи (li,j(1);li,j(2);...li,j(k)), x7 18 15 13 15 9 12 10 0 компоненты которых li,jm есть длина m-го x0 x1 x2 x3 x4 x5 x6 x7 x0 x1 x2 x3 x4 x5 x6 x7 7 x0 0 7 5 3 9 13 8 18 x0 x0 x3 x3 x3 x3 x3 x3 x4 x1 7 0 2 4 6 10 8 15 x1 x3 x1 x2 x2 x2 x2 x2 x4 x2 5 2 0 2 4 8 6 13 x2 x3 x1 x2 x3 x4 x5 x6 x4 x3 3 4 2 0 6 10 5 15 x3 x0 x2 x2 x3 x2 x2 x6 x4 x4 9 6 4 6 0 10 10 9 x4 x3 x2 x2 x2 x4 x5 x2 x7 x5 13 10 8 10 10 0 7 12 x5 x3 x2 x2 x2 x4 x5 x6 x7 x6 8 8 6 5 10 7 0 10 x6 x3 x2 x2 x3 x2 x5 x6 x7 x7 18 15 13 15 9 12 10 0 x7 x4 x4 x4 x4 x4 x5 x6 x7 пути между вершинами хi и хj, а индекс k указывает число путей, обеспечивающих решение поставленной задачи. Следует обратить внимание на упорядоченность длин, т.е. li,j(1)<li,j(2)<...<li,j(k). Другая особенность обобщенных алгоритмов заключена в учете возможности возникновения контуров на кратчайших путях. В [7] подробно описаны обобщеные алгоритмы Флойда и Данцига и даны примеры их использования. l7 93 3.7. Алгоритм поиска максимального потока. При обмене информацией между абонентами вычислительной сети, при параллельных вычислениях на многомашинном комплексе, когда решение задачи распределяется между несколькими процессорами, при использовании в вычислительной сети общей памяти, когда каждый процессор получает доступ к общим модулям на ограниченный отрезок времени, возникает задача передачи максимального объема информации в заданный отрезок времени. При работе транспортной системы, когда осуществляется обмен транспотными единицами между узлами сети также возникает задача передачи максимального объема транспортных единиц за заданный отрезок времени. При передаче энергии в электрических сетях, жидкости в различных трубопроводных системах также возникает задача передачи максимального объема энергии или вещества в заданный отрезок времени. Объем информации, энергии или вещества, передаваемый от одного узла к другому, называют потоком и обозначают i,j. Граф, являющийся образом транспортной системы, называют сетью. Особенностью сети является отсутствие петель и кратных дуг, ориентация всех отрезков линий, т.е. наличие дуг в графе, наличие вершины-истока и вершиныстока в сети. Наибольший поток, который может пропустить дуга сети, называют пропускной способностью дуги и обозначают Сi,j. Очевидно, что 0i,j Сi,j. В вершине-истоке х0 величина потока есть сумма потоков по всем дугам, исходящим из вершины х0, т.е.=i0i+. В вершине-стоке хk величина потока есть сумма потоков по всем дугам, заходящим в вершину хk, т.е.=iik-. Для любой промежуточной вершины хi сумма исходящих потоков равна сумме заходящих потоков, т.е. jij+=kik-. На рис. 47 показана условная сеть, содержащая вершину-исток х0, вершину-сток хk и две промежуточные вершины хi и хj. На каждой дуге в круглых скобках приведены обозначения потока и пропускной способности соответствующей дуги. При этом поток, подводимый к сети равен =(0i+0j), поток отводимый от сети равен =(ik+jk), поток из вершины хi в вершину хj равен ij. Для вершины хi имеем 0i=(ij+ik), для вершину хj - jk=(0j+ij). Если множество вершин графа разбить на два непересекающихся подмножества, одно из которых содержит вершину-исток, а другое - вершинусток, то множество дуг, соединяющих эти два множества, формируют разрез А, пропускная способность которого равна сумме пропускных способностей дуг. Таких разрезов может быть несколько. Очевидно, что величина максимального потока ограничена минимальной пропускной способностью разреза, т.е. max=min{СAi}. Для примера на рис. 47 приведена схема, объясняющая множество пропускных способностей разрезов. Для разреза А1 имеем Х^={x0} и X\Х^={хi;хj;хk}, для А2 - Х^={х0;хj} и X\Х^={хi;хk}, для А3 - Х^={х0;хi} и X\Х^={хj;хk}, для А4 - Х^={х0;хi;хj} и X\Х^={хk}. 94 CA2 xi CA3 CA4 CA1 (0i;C0i) (ik;Cik) x0 (ij;Cij) xk (0j;C0j) (jk;Cjk) A1 A3 xj A4 A2 пропускная способность дуги Сi,j Разрез А1 А2 А3 А4 С0,i 1 1 0 0 С0,j Сi,j Сi,k Сj,k 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 Рис. 47. Условная сеть и множество разрезов. пропускная способность разреза СAi С0,i+ С0,j С0,i+Сi,j+Сj,k С0,j+Сi,j+Сi,k Сi,k+Сj,k Итак, максимальный поток в сети с ограниченной пропускной способностью можно находить, вычисляя пропускные способности всех разрезов и выбирая среди полученных значений минимальное. Однако при таком решении задачи остается неизвестным распределение потока по дугам графа. Для поиска распределения потока по дугам графа разработано несколько алгоритмов, особое место среди которых занимает алгоритм Форда-Фалкерсона, суть которого состоит в разметке вершин графа. Метка вершины графа указывает на возможность изменения потока через эту вершину и указывает источник этого изменения. На рис. 48 дан фрагмент сети, объясняющий суть алгоритма. xi xj xi xs +si si +s +i tj -j +t xj +tj xt Рис. 48. Пометка вершин сети. Если по дуге (хs;хi) возможно увеличение потока, т.е. si<Csi, то вершину хi следует пометить +s , что указывает на источник увеличения потока. Если по дуге (хi;хj) также возможно увеличение потока ij<Cij, то вершину хj пометить +i . Это означает, что приращение потока si пойдет по направлению дуги (хi;хj) от вершины хs. 95 Если по дуге (хt;хj) возможно увеличение потока, т.е. tj<Ctj, то вершину хj следует пометить +t , что указывает на источник увеличения потока. Однако, если вершина хj не имеет пометки +i , то для увеличения потока в фрагменте сети, следует уменьшить поток в дуге (хi;хj) и направить его далее по другим дугам фрагмента на сток. Для указания вершины, от которой необходимо уменьшить поток, ставят пометку -j. Это означает что на участке (хi;хj) поток должен быть уменьшен на величину tj. Следует отметить, что вершины хi и хj могут иметь одновременно по нескольку подходящих и отходящих дуг. В примере, показанном на рис. 48 одновременно при допустимых si и tj могут быть для вершины хj две метки +t и +i для вершины хi также две метки +s и -j, что свидетельствует о свободе выбора приращения потока либо на величину si, либо tj. Если дуга (хs;хi) насыщена, т.е. si=Сsi, то метку “+s” у вершины хi ставить нельзя. Также, если насыщена дуга (хt;хj), т.е. tj=Сtj, то метку “+t” у вершины хj ставить нельзя. Если вершина хj не помечена, то нельзя ставить метку “-j” у вершины хi. Когда обе вершины графа (хi и хj) не имеют меток, то это означает невозможность увеличения потока на дугах-стока. Так достигают максимального значения потока от двух вершин-истоков хs и хt по дугам-стока, исходящим из вершин хi и хj. Алгоритм Форда-Фалкерсона. шаг 1: присвоить всем вершинам графа индексы 0,1,2,...k; где 0-индекс вершины-истока графа, k -индекс вершины-стока графа; шаг 2: присвоить начальной вершине метку “0”; шаг 3: все непомеченные вершины хi, в которые идут ненасыщенные дуги из помеченной вершины хs, пометить индексом “+s”, что свидетельствует о возможности увеличения потока из вершины хs по дуге (хs;хi); шаг 4: все непомеченные вершины хi, из которых идут дуги (насыщенные или ненасыщенные) в помеченную вершину хj, пометить индексом “-j”, что свидетельствует о возможности уменьшения потока в вершину хj по дуге (хi;хj); шаг 5: если в результате этих операций окажется помеченной вершинасток, то между начальной и конечной вершинами сети найдется маршрут, все вершины которого различны и с точностью до знака помечены индексами предыдущих вершин, формирующих переход, по которому можно увеличить поток, и перейти к шагу 6, иначе конец. шаг 6: увеличить поток в маршруте, сформированном на шаге 5, на единицу и перейти к шагу 3. Для иллюстрации работы алгоритма распределения максимального потока по дугам графа рассмотрим граф (см. рис. 49а)). Каждой дуге графа (хi;хj) приписаны величина потока и пропускная способность (ij;Сij). Все расчеты по алгоритму сведены в две таблицы. В таблице 14 на каждом шаге итерации для каждой вершины графа указаны возможные метки, формирующие маршрут. В таблице 15 даны приращения потока по дугам графа (хi;хj). Насыщение дуги показано в таблице 15 знаком . Итак, в результате выполнения первой итерации возможны маршруты для увеличения потока на единицу:1=(хk;х1;х0); 2=(хk;х2;х0); 3=(хk;х2;х3;х0); 4=(хk;х2;х3;х1;х0); 5=(хk;х3;х0); 6=(хk;х3;х1;х0), из множества которых был выбран для второй итерации маршрут 5. При 96 увеличении потока на единицу по данному маршруту оказалась насыщенной дуга (х3;хk). В результате расстановки меток на второй итерации возможны маршруты: 1=(хk;х1;х0); 2=(хk;х2;х0); 3=(хk;х2;х3;х0); 4=(хk;х2;х3;х1;х0), из множества которых выбран маршрут 4. При увеличении потока на единицу по данному маршруту оказалась насыщенной дуга (х3;х2). В результате расстановки меток на третьей итерации возможны маршруты: 1=(хk;х1;х0); 2=(хk;х2;х0), из а) x1 (0;4) x3 (0;2) (0;3) (0;2) =0 (0;3) =0 x0 (0;1) xk (0;1) (0;2 ) p=0 x2 которых выбрали маршрут 1. При увеличении потока по этому маршруту оказалась насыщенной дуга (х0;х1). Следует отметить, что на этой итерации не использовали метку у вершины х3. В результате расстановки меток на четвертом этапе вершина х3 помечена +0, а вершина х1 не может быть помечена “+0”, т.к. дуга (х0;х1) -насыщена. Таблица 14 показывает возможность для вершины х 1 поставить метку-3, что приведет к перераспределению потоков в дугах графа, но общему увеличению. Итак, на четвертом этапе имеем возможные маршруты: 1=(хk;х1;-х3;х0); 2=(хk;х2;х0), из которых выбран маршрут 1. При перераспределении потоков (уменьшение потока в дуге (х1;х3), насыщении дуги (х0;х3)) удалось увеличить поток еще на одну единицу. При установке меток на пятой итерации разнообразие маршрутов сведено к одному - 1=(хk;х1;х0). 97 Таблица 14. хi 1 2 х0 0 0 х1 +0 +0 х2 +0;+3 +0;+3 (ххi;х3 j) Сij +0;+1 +0;+1 1 хk +1;+2;+3 +1;+2 (х0;х1) 2 0 (х ;х ) 1 0 б) 0 2 (х0;х3) x (0;4) 3 1 x3 1 (х1;х3)(0;2) 4 (1;2) 0 (х1;хk) (1;3)3 (0;3) 01=1 (х2;хk)x0 2 (0;1) xk 0 (х3;х2) (0;1) 1 (0;2) 0 (х3;хk) 2 1 p=1 x2 г) шаг итерации pi=i 3 4 5 6 0 0 0 0 +0 -3 Таблица +0 +0 +0 - 15. pi=i +0;+1 шаг итерации +0 2 +1;+2 3 4 5 +1;+2 +2 -6 0 1 2 2 2 0 0 0 0 1 в) x1 (0;4) x3 2 2 2 3 (2;2) 3 0 1 (0;2) (2;3)0 (0;3) 0 2=2 0 0 1x0 2 (0;1) x2k 0 1 1 (0;1) (0;2)2 0 1 1 1 1 2 2 2p=2 2 x22 x1 (1;4) x3 д) (1;2) (2;2) (2;3) (0;3) x0 (1;1) xk 3=3 (0;1) (1;2) p=3 x2 x1 (1;4) x3 (2;2) (2;2) (2;3) (1;3) x0 (1;1) xk 4=4 (0;1) (1;2) p=4 x2 е) ж) x1 (1;4) x3 (2;2) (2;2) (3;3) (2;3) 5=5 x0 (1;1) xk (0;1) (1;2) p=5 x2 x1 (0;4) x3 (2;2) (2;2) (3;3) (2;3) 6=6 x0 (1;1) xk (1;1) (2;2) p=6 x2 Рис. 49. Максимальный поток в сети. 98 На последней шестой итерации =6, дуги (х0;х1), (х0;х2), (х0;х3), (х2;хk), (х3;х2), (х3;хk) - насыщены, невозможно поставить метки у вершин х 1, х2, х3. Следовательно, нельзя поставить метку и у концевой вершины-стока хk. В [7] даны алгоритмы поиска потока минимальной стоимости, алгоритмы дефекта, алгоритмы поиска максимального потока в неориентированной сети и при наличии большого числа истоков и стоков. Все алгоритмы подкреплены примерами и программными модулями для компьютера. 3.8. Алгоритмы управления проектами. Обучение в школе или подготовка специалиста в институте, разработка документации на автоматизированное рабочее место или автоматизированную систему управления, строительство сооружений включает в себя большое количество операций (работ) и большое количество исполнителей этих работ. Условно объединим эти виды деятельности под общим понятием - проект. Тогда задача управления проектом состоит в том, чтобы с учетом взаимосвязей работ и необходимости исполнения каждой работы завершить исполнение проекта в заданные сроки и с заданными затратами трудовых, финансовых или материальных ресурсов. Для управления проектом разработан метод сетевого планирования и управления (СПУ), в основу которого положен метод критического пути (МКП). Этот метод позволяет: 1) планировать работу над проектом и предвидеть возможные затруднения и задержки в исполнении каждой работы и проекта в целом; 2) координировать и контролировать исполнение работ всеми исполнителями в заданные сроки и при заданном ресурсном обеспечении; 3) устанавливать последовательность и сроки использования ограниченных ресурсов в течении всего времени исполнения проекта; 4) выполнять анализ компромиссных решений между затратами и сроками выполнения работ с учетом резерва времени; 5) планировать ускоренное завершение всего проекта с учетом исполнения всех работ. Каждый проект должен иметь перечень всех работ, продолжительность исполнения каждой работы, перечень работ, непосредственно предшествующих и определяющих начало каждой операции. Граф типа сеть является идеальным образом исполнения проекта. В этом графе одна вершина-исток, определяющая начало исполнения проекта, одна вершина-сток, формирующая окончание исполнения проекта, множество дуг, характеризующих работы по продолжительности исполнения или по затратам трудовых или финансовых ресурсов (ij), множество событий, фиксирующих начало и окончание каждой работы, комплекса работ или проекта в целом. Комплекс работ характерен наличием нескольких дуг заходящих или исходящих из данной вершины. В сетевом графе не должно быть петель и контуров. 99 Рассмотрим фрагмент графа (см. рис. 50), õ2 включающий в себя пять 02 2k вершин-событий и шесть дугработ. х0-начало проекта, хkокончание проекта, 01 и 02õ0 õk 12 работы, которые могут быть начаты с началом работ над 01 3k проектом. Событие х1 есть õ1 13 õ3 окончание работы 01 и определяет начало комплекса Ðèñ. 50. Ñåòåâàÿ ì î äåëü ðàáî ò. работ 12 и 13. Событие х2 есть окончание комплекса работ 02 и 12 и определяет начало работ 2k. Событие х3 есть окончание работы 13 и определяет начало работы 3k, и наконец, работы 2k и 3k обеспечивают завершение проекта, которые могут быть начаты только после окончание работ 12, 13, 02 и 01. Итак, существует три различных пути на графе, которые должны быть пройдены для завершение всех работ проекта: 1) (02+2k); 2) (01+12+2k); tp(х1)=4 x1 1,4=6 tp(х2)=7 tp(х4)=12 x2 2,4=5 x4 tp(х3)=5 3,4=3 x3 tp(х3)=5 3,4 tp(х2)=7 2,4 tp(х1)=4 1,4 5 10 t Рис. 51. Ранний момент наступления события. 3) (01+13+3k). Продолжительность работ на каждом пути различная. Наибольшая продолжительность есть критический путь для всего проекта, т.к. только он определяет продолжительность исполнения всего проекта. Работы на критическом пути не допускают никакой задержки в исполнении. Поэтому их также называют критическими работами. Для критических работ и критического пути нет резерва времени. Так как каждое событие характеризуется временем его наступления, то при наличии комплекса работ для события х i можно рассматривать ранний момент наступления события tp(хi) и поздний момент наступления события tn(хi). Для иллюстрации определения tp(хi) и tn(хi) рассмотрим фрагмент сети (см. рис. 51 и 52). На рис. 51 события х1, х2 и х3 пусть имеют ранние моменты наступления: tp(х1)=4; tp(х2)=7; tp(х3)=5, т.е. любые работы, которые предшествовали событиям х1, х2 и х3, оказались законченными к указанным моментам времени tp(х1), tp(х2), tp(х3). Ранний момент наступления события tp(х4) определяется наиболее поздним окончанием одной из работ, предшествующих этому событию, т.е. (4+6)=10; (7+5)=12; (5+3)=8. Следовательно tp(х4)=12. 100 Обобщая эти рассуждения, можно сделать заключение: tp(хj)=maxi{(tp(хi)+i,j)}, где tp(хj)-ранний момент наступления события хj; tp(хi)-ранние моменты наступления событий хi, определяющих начало работ, непосредственно предшествующих событию хj; i,j-продолжительность работы, предшествующей событию хj; Таким образом, если для начального события х0 принять известным ранний момент наступления события (например, tp(х0)=0), то можно найти ранние моменты наступления всех последующих событий до хk включительно. На рис. 52 события х2, х3 и х4 имеют поздние допустимые моменты наступления tn(х2), tn(х3), tn(х4), т.е. работы 12, 13 и 14 должны быть закончены не позднее наступления tn(х2), tn(х3), tn(х4). Следовательно, при оценке позднего момента наступления tn(х1) события необходимо искать наиболее протяженные пути от конца проекта, т.е. продвигаяться в обратном направлении. Поздний момент наступления события х1 определяется наименьшим значением начала одной из работ, следующих после события х1, т.е. (12-7)=5; (15-7)=8; (10-3)=7. Следовательно, tn(х1)=5. tn(х2)=12 х2 tn(х3)=15 1,3 tn(х2)=12 1,2=7 tn(х1)=5 х1 1,2 1,3=7 tn(х3)=15 х3 1,4=3 tn(х4)=10 х4 tn(х4)=10 1,4 t 5 10 15 Рис. 52. Поздний момент наступления события. Обобщая эти рассуждения можно сделать заключение: tn(хj)=mini{(tn(хi)-j,i)}, где tn(хj)-поздний момент наступления события хj, определяющего начало работ j,i; tn(хi)-поздний момент наступления событий х i, определяющего окончание работы j,i; j,i-продолжительность работы j,i, обусловленной событием хj. Таким образом, если для конечного события хk принять известным поздний момент наступления события (например, tn(хk)=tp(хk)), то можно найти поздний момент наступления всех предшествующих событий до х 0 включительно. Особое место в анализе сетевых графиков занимают фиктивные работы, к которым можно отнести ожидание. На рис. 53 дан фрагмент сети с ожиданием для одновременного исполнения работ 35 и 46. 101 х1 2,4 4,6 tт(х6)=15 1,3 3,5 tт(х2)=15 tp(х1)=5 1,3 3,5 tp(х1)=5 tp(х3)=10 1,3=5 х3 3,5=4 х5 tp(х2)=2 tp(х4)=10 х2 2,4=6 х4 4,6=5 х6 2,4 4,6 tp(х2)=2 t 10 5 Рис. 53. Фиктивная работа-ожидание. Фиктивная работа имеет продолжительность равную нулю, но события связанные с ожиданием (х3, х4 на рис. 53) обуславливают возможность только одновременного начала работ (35 и 46 на рис. 53). На сетевых графах ожидание обозначают пунктирной линией. При расчетах раннего и позднего моментов наступления событий, связанных с ожиданием (х3, х4 на рис. 53), используют вышеприведенные соотношения, т.е. tpожид.(х3;х4)=max{tp(х3); tp(х4)}, tnожид.(х3;х4)=min{tn(х3); tn(х4)}. Максимально время, на которое можно задержать наступление некоторого события без задержки срока завершения всего проекта, называют резервом времени для данного события. Поэтому для каждого события резерв времени есть t0(хi)=tn(хi)- tp(хi). Если наиболее поздний и наиболее ранний сроки наступления события х i одинаковы, то задержка наступления этого события не допускается. Событие с нулевым резервом времени находятся на критическом пути, соединяющим начальную и конечную вершины сетевой модели проекта. Критический путь представляет собой взаимосвязную последовательность работ и событий, имеющих нулевой резерв времени. Поэтому для построения критического пути необходимо вычислить резерв времени на исполнение работ. t p(x2)= 4 Очевидно, никакая õ2 t n(x2)= 4 работа i,j не может начаться ранее наступления события хi 1,2= 2 2,3= 4 и не должна закончиться позже события хj. Таким x1 x3 1,3= 4 образом, без задержки всего t p(x1)= 2 t p(x3)= 8 проекта можно выделить на t n(x1)= 2 t n(x3)= 8 исполнение операции (tn(хj)tp(хi)) единиц времени. Ðèñ. 54. Âû áî ð êðèòè÷åñêî ãî ï óòè. Если i,j0=(tn(хj)- tp(хi)i,j) равно нулю, то данная работа (i,j) не имеет резерва времени, т.е. находится на критическом пути. Величину i,j0=(tn(хj)- tp(хi)-i,j)0 называют полным резервом времени операции (i,j). На рис. 54 дан пример поиска полного резерва времени для трех операций. Все события для данного примера имеют нулевой резерв времени, но для поиска критического пути необходимо также найти резерв времени по работам. В данном примере резерв времени по работам равен: 102 1,20=(4-2-2)=0; 1,30=(8-2-4)=2; 2,30=(8-4-4)=0. Следовательно, работы (х1;х2) и (х2;х3) лежат на критическом пути, а работа (х1;х3) имеет резерв времени. Резерв времени является показателем гибкости планирования сроков в сетевой модели. Поэтому кроме критического пути с помощью полного резерва времени на исполнение операций, решают задачи по использованию трудовых, материальных и финансовх ресурсов, по перераспределению работ на определенный период года, месяца или суток. Для этого привлекают знания о свободном, независимом и гарантированном резерве времени. Интересно отметить, что все эти резервы времени могут быть сведены в таблицу (см. таблицу16), которая показывает взаимосвязь различных показателей резерва времени. ранний момент события хj tp(xj) свободный резерв времени ранний момент работы (хi;хj) события хi i,j0 своб. tp(xi) поздний момент независимый резерв времени события хi работы (хi;хj) tn(xi) i,j0 незав. Таблица 16. поздний момент события хj tn(xj) полный резерв времени работы (хi;хj) i,j0 полн. гарантированный резерв времени работы (хi;хj) i,j0 гаран. i,j0 полн.=(tn(хj)- tp(хi)-j,i); i,j0 своб.=(tp(хj)- tp(хi)-j,i); i,j0 незав.=(tp(хj)- tn(хi)-j,i); i,j0 гаран.=(tn(хj)- tn(хi)-j,i). Для иллюстрации возможностей сетевого планирования и управления рассмотрим сетевую модель (см. рис. 55). Для компактного изображения всех показателей каждого события каждую вершину графа представим в виде круга, разбитого на четыре сектора. В каждом секторе указаны четыре показателя: индекс вершины (i), ранний момент наступления события tp(xi), поздний момент наступления события tn(xi) и время ожидания события t0(i). Дуги графа изображают работы, а пунктирная линия-ожидание. Для упорядочения расчета раннего и позднего моментов наступления событий необходимо выполнить правильную нумерацию вершин графа. Алгоритм нумерации вершин графа: шаг 1: присвоить начальной вершине сетевой модели индекс “0”; принять p=0, где p-шаг итерации; шаг 2: присвоить на шаге итерации p любой неиндексированный вершине, смежной с индексированными вершинами, индекс (p+1); шаг 3: если p=(n+1), то конец, при этом индекс (n+1)=k, иначе принять p=(p+1) и перейти к шагу 2 алгоритма. Следует отметить, что нумерация вершин ациклического графа называется правильной на дуге (хi;хj)G, если i<j, и правильной на графе G, если она правильна на всех его дугах. 103 Алгоритм расчета раннего момента наступления событий. шаг 1: принять для начальной вершины графа tp(0)=0, p=0, где p-шаг итерации; шаг 2: определить на шаге итерации p ранний момент наступления события j по формуле: tp(j)=(tp(i)+j,i), где tp(i)-события i с известным ранним моментом наступления; j,i-продолжительность работы (i,j) от события, имеющего tp(i); а) если к вершине j подходит одна дуга (i,j), то принять tp(j)=(tp(i)+j,i), б) если к вершине j подходит несколько дуг {(i,j)}, то сравнить и найти максимальное значение раннего момента наступления события j по формуле: tp(j)=maxi{tp(i)+i,j}. шаг 3: если p=(n+1), то конец, иначе принять p=(p+1) и перейти к шагу 2 алгоритма. Результаты вычислений раннего момента наступления событий удобно представить таблицей (см. таблицу 17) pi 0 i 0 1 1 2 3 4 2 3 4 5 5 6 7 6 7 j=i 1 2 2 3 5 4 5 6 7 6 k k k tp(j)={tp(i)+i,j} tp(1)=tp(0)+0,1=3 tp(2)=tp(0)+0,2=2 tp(2)=tp(1)+0,2=8 tp(3)=tp(1)+1,3=5 tp(5)=tp(1)+1,5=10 tp(4)=tp(2)+2,4=18 tp(5)=tp(3)+3,5=13 tp(6)=tp(4)+4,6=20 tp(7)=tp(4)+4,7=22 tp(6)=tp(5)+4,6=22 104 tp(k)=tp(5)+5,k=24 tp(k)=tp(6)+6,k=27 tp(k)=tp(7)+7,k=23 Таблица 17. tp(j)=maxi{tp(i)+i,j} tp(1)=3 tp(2)=8 tp(3)=5 tp(4)=tp(5)=18 tp(7)=22 tp(6)=22 tp(k)=27 Рис. 55. Сетевая модель. Алгоритм расчета позднего момента наступления события. шаг 1: принять для конечной вершины графа tn(k)=tp(k); р=0, где р-шаг итерации; шаг 2: определить на шаге итерации р поздний момент наступления события j по формуле: tn(j)=(tn(i)-j,i), где tn(i)-событие i с известным поздним моментом наступления; j,i-продолжительность работы (i,j) от события, имеющего tn(i); а) если от вершины j отходит одна дуга (i,j),то принять tn(j)=(tn(i)-j,i); б) если от вершины j отходит несколько дуг (i,j), то сравнить и найти минимальное значение позднего момента наступления события j по формуле: tn(j)=mini{(tn(i)-j,i)}; шаг 3: если р=(n+1), то конец, иначе принять р=(р+1) и перейти к шагу 2 алгоритма. Результаты вычисления позднего момента наступления события удобно представить таблицей (см. таблицу 18). pi 0 i k 1 2 7 6 3 5 4 5 6 4 3 2 7 1 j=i 7 6 5 4 5 4 3 1 2 1 1 0 0 -1 tn(j)=(tn(i)-j,i) tn(7)=(tn(k)-k,7)=26 tn(6)=(tn(k)-k,6)=22 tn(5)=(tn(k)-k,5)=21 tn(4)=(tn(7)-4,7)=22 tn(5)=(tn(6)-5,6)=18 tn(4)=(tn(6)-4,6)=20 tn(3)=(tn(5)-3,5)=10 tn(1)=(tn(5)-1,5)=11 tn(2)=(tn(4)-2,4)=8 tn(1)=(tn(3)-1,3)=8 tn(1)=(tn(2)-1,2)=3 tn(0)=(tn(2)-0,2)=6 tn(0)=(tn(1)-0,1)=0 Таблица 18. tn(j)=mini{(tn(i)-j,i)} tn(7)=26 tn(6)=22 tn(5)=tn(4)=18 tn(3)=10 tn(2)=8 tn(1)=3 tn(0)=0 Алгоритм расчета резерва времени события. шаг 1: принять р=0, где р-шаг итерации; шаг 2: определить на шаге итерации р индекс события и резерв его ожидания по формуле: t0(i)=(tn(i)-tp(i)); шаг 3: если р=(n+1), то конец, иначе принять р=(р+1) и перейти к шагу 2. Результаты вычислений резервов времени для событий удобно представить таблицей (см. таблицу 19). 105 pi i t0(i) 0 0 0 1 1 0 2 2 0 3 3 5 4 4 0 5 5 0 6 6 0 7 7 4 Таблица 19. 8 k 0 Алгоритм расчета резерва времени на работы. шаг 1: принять р=1 и выделить любую дугу (i,j); шаг 2: определить резерв времени для работы (i,j) по формулам: а) полный резерв времени: i,j0 полн.=(tn(j)- tp(i)-j,i); б) свободный резерв времени: i,j0 своб.=(tp(j)- tp(i)-j,i); в) независимый резерв времени: i,j0 незав.=(tp(j)- tn(i)-j,i); г) гарантированный резерв времени: i,j0 гаран.=(tn(j)- tn(i)-j,i); Таблица 20. (i,j) pi i,j i,j i,j i,j (0,1) 0 0 0 0 1 (0,2) 6 6 6 6 2 (1,2) 0 0 0 0 3 (1,3) 5 0 0 5 4 (1,5) 8 8 8 8 5 (2,4) 0 0 0 0 6 (3,5) 5 5 0 0 7 (4,6) 2 2 2 2 8 (4,7) 4 0 0 4 9 (5,6) 0 0 0 0 10 (5,k) 3 3 3 3 11 (6,k) 0 0 0 0 12 (7,k) 4 4 0 0 13 шаг 3: если р=m, где m-число дуг сетевой модели, то конец, иначе р=(р+1), выделить новую дугу (i,j) и перейти к шагу 2 алгоритма. Результаты расчетов резервов времени для выполнения работ приведены в таблице 20. 0 полн. 0 своб. 0 незав. 0 гарант. Выполненный анализ показывает, что 1) события, за которыми нужно следить с особым вниманием, имеют резерв времени равный нулю; это события 0;1;2;4;5;6;k; 2) работы, которые лимитируют продолжительность всего проекта, имеют полный резерв времени равный нулю; это работы (0;1); (1;2); (2;4); (5;6); (6;k); 3) работы, которые имеют резерв времени (полный, свободный, независимый и гарантированный), позволяют соответственно уменьшить затраты трудовых, финансовых или материальных ресурсов и продлить исполнение этих работ, но не более указанных резервов; это работы (0;2); (1;5); (4;6); (5;k); 4) работы, которые имеют свободный резерв времени равным нулю, определяют необходимость контроля за ранним моментом наступления событий, предшествующих данной работе и влияющих на начало последующих работ; это работы (1;3); (4;7); 106 5) работы, которые имеют независимый резерв времени равным нулю, определяют необходимость контроля за поздним моментом наступления событий, предшествующих данной работе, и влияющих на развитие последующих работ, что является удобным показателем свободы планирования; это работы (1;3); (3;5); (4;7); (7;k); 6) работы, которые имеют гарантированный резерв времени равным нулю, являются удобным показателем планирования работ проекта, т.к. они не влияют на исполнение всего проекта, но позволяют гарантированно отслеживать исполнение отдельных работ; это работы (3;5); (4;7). Контрольные вопросы и задачи. х2 х1 х3 х5 х4 1. Что такое остов графа? 2. Чему равно цикломатическое число графа и сколько можно построить покрывающих остовов? 3. Найти остов графа по алгоритму Дейкстра (см. приложение 1). 4. Найти остов графа по алгоритму Краскала (см. приложение 1). 5. Найти кратчайшие пути на графе по алгоритму Флойда (см. приложение 2). 6. Найти распределение максимального потока в сети по алгоритму Форда-Фалкерсона (см. приложение 3). 7. Найти критический путь по алгоритму управления проектом (СПУ) (см. приложение 4). 8. Определить числа графа (см. приложение 5). 107