Расчёт критического пути сетевого графика: формулы
Когда сетевой график уже построен - события пронумерованы, работы расставлены по дугам, длительности известны, - остаётся вычислительная задача: найти критический путь, то есть цепочку работ, которая жёстко задаёт минимальный срок проекта. Именно расчёт (а не построение самого графика) чаще всего встречается в контрольных по методам оптимизации: дают готовую топологию с длительностями и просят посчитать ранние и поздние времена событий, резервы и критический путь. Ниже - алгоритм расчёта по шагам с числовым примером на восьми работах, где критических путей сразу два. Чтобы почувствовать логику до формул, покрутите калькулятор ниже - он выполняет прямой и обратный проход мгновенно.
Топология для расчёта
Возьмём сетевой график с шестью событиями (0 - начальное, 5 - конечное) и восемью работами:
| Работа | Дуга | Длительность, дни |
|---|---|---|
| A | 0→1 | 4 |
| B | 0→2 | 6 |
| C | 1→2 | 3 |
| D | 1→3 | 8 |
| E | 2→3 | 5 |
| F | 2→4 | 7 |
| G | 3→5 | 9 |
| H | 4→5 | 6 |
Топология нарочно сложнее классического примера из пяти работ: есть развилка сразу после старта (A и B), «диагональная» работа C, срезающая путь через два события, и две ветки, сходящиеся в конце (через G и через H). На таком графе видно, где расчёт даёт неочевидный результат: путей максимальной длины может быть сразу два, а работа с нулевым резервом обоих своих событий не обязана быть критической.
Прямой проход: ранние времена событий
Прямой проход считает - самое раннее время, когда событие может наступить. Для начального события , для остальных - по формуле:
где максимум берётся по всем работам, входящим в событие : событие наступает только тогда, когда завершены абсолютно все предшествующие ему работы, поэтому в формуле стоит максимум, а не сумма и не минимум.
Расчёт для нашей топологии при указанных выше длительностях:
| Событие | Входящие работы | |
|---|---|---|
| 0 | - | 0 |
| 1 | A(0-1) = 4 | 4 |
| 2 | B(0-2) = 6, C(1-2) = 4+3=7 | max(6, 7) = 7 |
| 3 | D(1-3) = 4+8=12, E(2-3) = 7+5=12 | max(12, 12) = 12 |
| 4 | F(2-4) = 7+7=14 | 14 |
| 5 | G(3-5) = 12+9=21, H(4-5) = 14+6=20 | max(21, 20) = 21 |
Самый ранний срок завершения проекта - 21 день. К событию 3 ведут сразу две работы, D и связка C-E, и обе дают одинаковые 12 дней - первый признак, что в графике будет не один, а два критических пути.
Обратный проход: поздние времена событий
Обратный проход считает - самое позднее время события , при котором проект всё ещё укладывается в срок. Конечному событию присваивают , а дальше двигаются справа налево:
Минимум берётся по всем работам, исходящим из события : если хотя бы одна из последующих работ требует более раннего старта, всё событие сдвигается влево к этому ограничению.
| Событие | Исходящие работы | |
|---|---|---|
| 5 | - | 21 |
| 4 | H(4-5) | 21-6=15 |
| 3 | G(3-5) | 21-9=12 |
| 2 | E(2-3)=12-5=7, F(2-4)=15-7=8 | min(7, 8) = 7 |
| 1 | C(1-2)=7-3=4, D(1-3)=12-8=4 | min(4, 4) = 4 |
| 0 | A(0-1)=4-4=0, B(0-2)=7-6=1 | min(0, 1) = 0 |
Резервы событий и ловушка с критичностью работы
Резерв события показывает, на сколько его можно сдвинуть без нарушения срока проекта. Событие критическое, если . Для нашего графика: - все события критические, кроме события 4, у которого резерв 1 день.
Казалось бы, раз события 0 и 2 оба критические (), то и работа B(0-2) между ними тоже критическая. Но это не так - в этом главная ловушка расчёта. Условие критичности работы строже нулевого резерва её концов:
Для B: , но - равенство не выполняется, значит B не критическая, хотя оба её события формально безрезервные. Причина в том, что событие 2 определяется не работой B, а более длинной цепочкой A-C (). Проверка всех восьми работ даёт критические A, C, D, E, G и некритические B, F, H.
Полный и свободный резерв работы
Для каждой некритической работы считают два разных резерва, и путать их - вторая типичная ошибка расчёта.
Полный резерв - на сколько можно сдвинуть или растянуть работу, не выходя за срок всего проекта:
Свободный резерв - на сколько можно сдвинуть работу, не трогая при этом раннее время следующего события:
Возьмём работу F(2-4) длительностью 7 дней: день, а дней. Разница показательна: у F есть день запаса относительно всего проекта (событие 4 некритическое, ), но нет ни дня запаса относительно момента, когда должно наступить событие 4 по расчёту. Задержать F можно без срыва проекта, но это сдвинет зафиксированное раннее время события 4 - безопасно, только если от него больше ничего не зависит.

Когда критических путей несколько
В нашем примере ровно два пути набирают максимальную длину 21 день: A-D-G () и A-C-E-G (). Это нормальная ситуация для сетевых графиков: задержка на любом из двух путей одинаково сдвигает срок проекта, поэтому оба требуют одинакового контроля.
Критический путь не закреплён навсегда за одной цепочкой работ - он определяется текущими длительностями и может «переключиться» при их изменении. Увеличьте B всего на 2 дня (с 6 до 8) - путь B-E-G вырастет до дней и станет новым и единственным критическим путём, а прежние A-D-G и A-C-E-G (по-прежнему по 21 дню) станут некритическими. Проверить это можно прямо в калькуляторе выше, сдвинув ползунок B.
Пример полного расчёта
Соберём весь алгоритм в один проход по шагам - именно так оформляют решение в контрольной работе:
- Прямой проход: для событий 0-5 (расчёт - в разделе выше).
- Обратный проход: .
- Резервы событий: - критичны все события, кроме события 4.
- Критические работы: проверка условия при нулевых резервах концов даёт A, C, D, E, G; работа B отсеивается, несмотря на нулевые резервы своих событий.
- Критический путь: длина 21 день, представлен двумя равными путями A-D-G и A-C-E-G.
- Резервы некритических работ: B - полный 1, свободный 1; F - полный 1, свободный 0; H - полный 1, свободный 1.
Если сам сетевой график ещё не построен - то есть неизвестно, как разложить список работ с предшественниками на события и дуги, - этот шаг разобран отдельно в статье про построение сетевого графика методом CPM; здесь же мы считаем критический путь на уже готовой топологии.
Частые ошибки
- Нулевой резерв обоих событий принимают за признак критичности работы. Как на работе B выше - это необходимое, но не достаточное условие; проверяйте равенство .
- Путают полный и свободный резерв. Полный - запас относительно всего проекта, свободный - запас, не трогающий раннее время следующего события; свободный всегда не больше полного.
- В прямом проходе берут первую попавшуюся входящую работу вместо максимума. Если к событию ведут несколько работ, нужен максимум суммы - иначе занижается и расчёт съезжает.
- Обратный проход начинают раньше, чем закончен прямой. Поздние времена нельзя посчитать, пока не известны все ранние - только последовательно.
- Не проверяют, что критических путей может быть несколько. Одна «первая найденная» цепочка легко пропускает второй путь той же длины.
FAQ
С чего начать расчёт, если топология графика уже дана? С прямого прохода: начальному событию , дальше по возрастанию номеров - максимум по входящим работам. Только когда посчитаны все ранние времена, включая конечное событие, переходят к обратному проходу.
Как проверить расчёт критического пути на ошибку? Пересчитать длину каждого пути от начала до конца вручную и сравнить с последнего события - они обязаны совпасть. Отрицательный резерв события означает, что в проходах перепутаны максимум и минимум.
Может ли резерв события быть отрицательным? При обычном расчёте - нет: последнего события всегда равен его же . Отрицательные резервы появляются, только если директивный срок проекта меньше длины критического пути - сигнал, что план не укладывается в срок ни при каком порядке работ.
Коротко
Расчёт критического пути сетевого графика - это два последовательных прохода: прямой находит ранние времена событий через максимум по входящим работам, обратный - поздние времена через минимум по исходящим. Резерв события определяет, критическое ли оно, но для самой работы этого недостаточно - нужно ещё и равенство . Критических путей в графике может быть несколько одновременно, а полный резерв работы всегда не меньше свободного - это и есть три места, где чаще всего ошибаются при расчёте вручную.
Читайте также

Полный резерв времени работы сетевого графика: формула
Полный резерв времени работы сетевого графика: как его найти по формуле t_п(j) минус t_р(i) минус длительность, чем он отличается от свободного резерва и что означает для сроков задачи.

Сетевое планирование: построение сетевого графика
Как построить сетевой график проекта: прямой и обратный проходы, ранние и поздние времена событий, критический путь и резервы работ - с примером расчёта и калькулятором.

Атрибуты сущности в ER-модели: пять типов и примеры
Разбираем пять типов атрибутов сущности в ER-модели: простой, составной, ключевой, многозначный, производный, с примерами и переходом к столбцам и таблицам реляционной схемы.

Циркуляция векторного поля по контуру: формула и смысл
Циркуляция векторного поля по контуру: что это такое, как вычислить линейный интеграл по параметризации и через ротор поля с теоремой Грина, разбор типичных ошибок и примеров расчёта.

Динамическое программирование: основы и идея мемоизации
Что такое динамическое программирование простыми словами: перекрывающиеся подзадачи, оптимальная подструктура, мемоизация и табуляция на примере чисел Фибоначчи, разница с наивной рекурсией.

Кодировка Unicode и UTF-8: как кодируются символы
Кодировка Unicode и UTF-8 простыми словами: как код символа превращается в байты, почему кириллица и эмодзи занимают 2-4 байта и как устроены префиксы 110, 1110, 10.