Критическим путем в ориентированном графе G =(X, U) с источником s и стоком t называется самый длинный путь максимальной длины
m[ s, t ] между этими вершинами. Если кратчайший путь в орграфе не существует при наличии контуров отрицательной длины, то критический путь не существует в ориентированном графе с контурами [1].
Таким образом, задача поиска критического пути в графе G =(X, U) имеет решение только в том случае, если этот граф является бесконтурным. Понятие "критический путь" является фундаментальным для методов PERT и CPM управления выполнением проекта и соответствует минимальному времени, необходимому для реализации проекта (см. раздел 1.5). Самый длинный путь m[ s, t ] в сети PERT или CPM называется критическим, так как дуги (xi, xj)Îm[ s, t ] отображают этапы операции проекта, для которых любая задержка начала выполнения приводит к увеличению срока завершения проекта в целом.
Совершенно очевидно сходство задачи поиска критического пути с задачей о кратчайшем пути между источником и стоком. Ее можно решить с помощью любого алгоритма построения кратчайшего пути из раздела 1. Для этого используется два подхода:
|
|
- модификация графовой модели задачи;
- модификация алгоритма поиска пути.
В первом случае изменяются веса l (xi, xj) всех дуг (xi, xj) Î U исходного графа G =(X, U) на значения l '(xi, xj) = - l (xi, xj) или l '(xi, xj) = 1/(xi, xj). Затем применяется любой алгоритм поиска кратчайшего пути без каких-либо изменений. Результат будет определять критический путь в исходном графе G =(X, U).
Второй способ предполагает модификацию применяемого алгоритма. Для этого все операции min заменяются на max, а значения элементов dij = ¥ матрицы весов D (c ij = ¥ для матрицы C в алгоритме Флойда), где (xi, xj) Ï U, заменяются на d ' ij = -¥ и c ' ij = -¥ соответственно. Необходимо отметить, что при поиске критического пути m[ s, t ] изменяется смысл пометок l*(xi) и g*(xi) вершин графа. Значение l*(xi) определяет длину максимального пути m[ s, xi ] от источника s до вершины xi, а g*(xi) - длину максимального пути m[ xi, t ] от xi до стока t.
Учитывая различную трудоемкость алгоритмов поиска кратчайших путей и обязательное отсутствие контуров в графовых моделях, наиболее целесообразным для определения критического пути m[ s, t ] является применение метода динамического программирования. В качестве примера модификации алгоритма ниже приводится процедура поиска критического пути методом динамического программирования, которая базируется на использовании пометок l(xi) вершин графа.
Алгоритм 2.1 (поиск критического пути m [ s,t ] методом динамического программирования)
Данные: бесконтурный граф G = (X, U) с n вершинами, имеющими правильную нумерацию; выделенные источник s = x 1 и сток t; произвольные веса дуг l (xi, xj).
|
|
Результат: длина l*(t) критического пути m[ s, t ].
Шаг 1 (присвоение начальных значений)
Задать пометки l*(x 1)= -¥ вершинам xi Î X \ s и l*(x 1)= 0 для s = x 1. Присвоить j =1.
Шаг 2 (изменение пометок)
Присвоить j = j +1 и для вершины xj вычислить окончательное значение пометки
(2.1)
где T = Г-1(xj). При T =Ø пометка вершины xj не изменяется.
Шаг 3 (проверка условия окончания)
Если xj = t, то конец алгоритма. Иначе переход к шагу 2.
Очевидно, что выражение (2.1) обеспечивает корректный результат только при правильной нумерации вершин графа (см. раздел 1.5), для которой индексы вершин любой дуги (xi, xj)Î U удовлетворяют условию i < j. Построение критического пути m[ s, t ] может быть выполнено на основе известного соотношения (1.2) или с помощью двойных пометок вида [l*(xj), mj ], где l*(xj) - длина максимального пути от источника s до вершины xj.
Наиболее близким к задаче поиска критического пути на графе являются следующие задачи:
- определить пути m[ s, xj ] максимальной длины от источника s = x 1 до всех других вершин xj Î X \ s;
- определить пути m[ s, t ] максимальной длины от всех вершин xi Î X \ t; до стока t = xn;
- определить пути максимальной длины m[ xi, xj ] между всеми парами вершин xi, xj Î X.
Для решения первых двух задач успешно применяется метод динамического программирования (с пометками вершин l(xi) и g(xi) соответственно). Последняя задача может быть решена по алгоритму Флойда после необходимой модификации (см. выше).
У П Р А Ж Н Е Н И Я
2.1. Сформулировать задачу поиска критического пути в бесконтурном ориентированном графе в виде задачи целочисленного линейного программирования.
2.2. Почему при решении задачи поиска критического пути в графе не допускается существование контуров?
2.3. Перечислить основные методы определения путей максимальной длины в ориентированных бесконтурных графах.
2.4. Что показывают пометки l(xi) и g(xi), приписываемые вершинам графа в алгоритмах поиска путей максимальной длины?
2.5. Модифицировать алгоритмы Форда-Беллмана и Дейкстры для решения задачи поиска путей максимальной длины.
2.6. Составить программу для построения критичеcкого пути в ориентированном графе методом динамического программирования.
2.7.Определить по методу Дейкстры критический путь от источника s = x 1 до стока t = x 9 в графе, показанном на рис. 1.7.
2.8. Методом динамического программирования определить длину максимального пути от вершины x 1 до вершины x 8 для графа на рис. 1.8.
2.9. Разработать алгоритм построения путей максимальной длины между всеми парами вершин по методу Флойда.
2.10. Определить пути максимальной длины m[ xi, xj ] для всех пар вершин xi и xj в графе, приведенном на рис. 1.9.