EssayAI
Блог
Блог
Математика и алгоритмы

Расчёт критического пути сетевого графика: формулы

11 июня 2026Время чтения: 9 минут
#критический путь#метод cpm#резерв времени#сетевой график#расчёт проекта

Когда сетевой график уже построен - события пронумерованы, работы расставлены по дугам, длительности известны, - остаётся вычислительная задача: найти критический путь, то есть цепочку работ, которая жёстко задаёт минимальный срок проекта. Именно расчёт (а не построение самого графика) чаще всего встречается в контрольных по методам оптимизации: дают готовую топологию с длительностями и просят посчитать ранние и поздние времена событий, резервы и критический путь. Ниже - алгоритм расчёта по шагам с числовым примером на восьми работах, где критических путей сразу два. Чтобы почувствовать логику до формул, покрутите калькулятор ниже - он выполняет прямой и обратный проход мгновенно.

Топология для расчёта

Возьмём сетевой график с шестью событиями (0 - начальное, 5 - конечное) и восемью работами:

РаботаДугаДлительность, дни
A0→14
B0→26
C1→23
D1→38
E2→35
F2→47
G3→59
H4→56

Топология нарочно сложнее классического примера из пяти работ: есть развилка сразу после старта (A и B), «диагональная» работа C, срезающая путь через два события, и две ветки, сходящиеся в конце (через G и через H). На таком графе видно, где расчёт даёт неочевидный результат: путей максимальной длины может быть сразу два, а работа с нулевым резервом обоих своих событий не обязана быть критической.

Прямой проход: ранние времена событий

Прямой проход считает Tран[j]T_{\text{ран}}[j] - самое раннее время, когда событие jj может наступить. Для начального события Tран[0]=0T_{\text{ран}}[0] = 0, для остальных - по формуле:

Tран[j]=max(i,j)(Tран[i]+tij),T_{\text{ран}}[j] = \max_{(i,j)} \bigl(T_{\text{ран}}[i] + t_{ij}\bigr),

где максимум берётся по всем работам, входящим в событие jj: событие наступает только тогда, когда завершены абсолютно все предшествующие ему работы, поэтому в формуле стоит максимум, а не сумма и не минимум.

Прямой проход слева направо: T_ран каждого события подсвечивается по мере вычисления, следом справа налево идёт обратный проход T_поз. В конце критические работы загораются красным - это и есть искомый путь

Расчёт для нашей топологии при указанных выше длительностях:

СобытиеВходящие работыTранT_{\text{ран}}
0-0
1A(0-1) = 44
2B(0-2) = 6, C(1-2) = 4+3=7max(6, 7) = 7
3D(1-3) = 4+8=12, E(2-3) = 7+5=12max(12, 12) = 12
4F(2-4) = 7+7=1414
5G(3-5) = 12+9=21, H(4-5) = 14+6=20max(21, 20) = 21

Самый ранний срок завершения проекта - 21 день. К событию 3 ведут сразу две работы, D и связка C-E, и обе дают одинаковые 12 дней - первый признак, что в графике будет не один, а два критических пути.

Обратный проход: поздние времена событий

Обратный проход считает Tпоз[i]T_{\text{поз}}[i] - самое позднее время события ii, при котором проект всё ещё укладывается в срок. Конечному событию присваивают Tпоз[n]=Tран[n]T_{\text{поз}}[n] = T_{\text{ран}}[n], а дальше двигаются справа налево:

Tпоз[i]=min(i,j)(Tпоз[j]tij).T_{\text{поз}}[i] = \min_{(i,j)} \bigl(T_{\text{поз}}[j] - t_{ij}\bigr).

Минимум берётся по всем работам, исходящим из события ii: если хотя бы одна из последующих работ требует более раннего старта, всё событие сдвигается влево к этому ограничению.

СобытиеИсходящие работыTпозT_{\text{поз}}
5-21
4H(4-5)21-6=15
3G(3-5)21-9=12
2E(2-3)=12-5=7, F(2-4)=15-7=8min(7, 8) = 7
1C(1-2)=7-3=4, D(1-3)=12-8=4min(4, 4) = 4
0A(0-1)=4-4=0, B(0-2)=7-6=1min(0, 1) = 0

Резервы событий и ловушка с критичностью работы

Резерв события R[i]=Tпоз[i]Tран[i]R[i] = T_{\text{поз}}[i] - T_{\text{ран}}[i] показывает, на сколько его можно сдвинуть без нарушения срока проекта. Событие критическое, если R[i]=0R[i] = 0. Для нашего графика: R=[0,0,0,0,1,0]R = [0, 0, 0, 0, 1, 0] - все события критические, кроме события 4, у которого резерв 1 день.

Казалось бы, раз события 0 и 2 оба критические (R[0]=R[2]=0R[0]=R[2]=0), то и работа B(0-2) между ними тоже критическая. Но это не так - в этом главная ловушка расчёта. Условие критичности работы строже нулевого резерва её концов:

R[i]=0,R[j]=0,Tран[i]+tij=Tран[j].R[i] = 0, \quad R[j] = 0, \quad T_{\text{ран}}[i] + t_{ij} = T_{\text{ран}}[j].

Для B: Tран[0]+6=6T_{\text{ран}}[0] + 6 = 6, но Tран[2]=7T_{\text{ран}}[2] = 7 - равенство не выполняется, значит B не критическая, хотя оба её события формально безрезервные. Причина в том, что событие 2 определяется не работой B, а более длинной цепочкой A-C (4+3=74+3=7). Проверка всех восьми работ даёт критические A, C, D, E, G и некритические B, F, H.

Полный и свободный резерв работы

Для каждой некритической работы считают два разных резерва, и путать их - вторая типичная ошибка расчёта.

Полный резерв - на сколько можно сдвинуть или растянуть работу, не выходя за срок всего проекта:

Rп(i,j)=Tпоз[j]Tран[i]tij.R_{\text{п}}(i,j) = T_{\text{поз}}[j] - T_{\text{ран}}[i] - t_{ij}.

Свободный резерв - на сколько можно сдвинуть работу, не трогая при этом раннее время следующего события:

Rсв(i,j)=Tран[j]Tран[i]tij.R_{\text{св}}(i,j) = T_{\text{ран}}[j] - T_{\text{ран}}[i] - t_{ij}.

Возьмём работу F(2-4) длительностью 7 дней: Rп=1577=1R_{\text{п}} = 15 - 7 - 7 = 1 день, а Rсв=1477=0R_{\text{св}} = 14 - 7 - 7 = 0 дней. Разница показательна: у F есть день запаса относительно всего проекта (событие 4 некритическое, R[4]=1R[4]=1), но нет ни дня запаса относительно момента, когда должно наступить событие 4 по расчёту. Задержать F можно без срыва проекта, но это сдвинет зафиксированное раннее время события 4 - безопасно, только если от него больше ничего не зависит.

Диаграмма резервов сетевого графика: полосы работ с отмеченным полным резервом, скобка измеряет промежуток между окончанием работы и предельно допустимым сроком
Диаграмма резервов сетевого графика: полосы работ с отмеченным полным резервом, скобка измеряет промежуток между окончанием работы и предельно допустимым сроком

Когда критических путей несколько

В нашем примере ровно два пути набирают максимальную длину 21 день: A-D-G (4+8+9=214+8+9=21) и A-C-E-G (4+3+5+9=214+3+5+9=21). Это нормальная ситуация для сетевых графиков: задержка на любом из двух путей одинаково сдвигает срок проекта, поэтому оба требуют одинакового контроля.

Длительность работы B растёт от 6 до 8 дней: путь через B-E-G удлиняется и обгоняет прежние критические пути A-D-G и A-C-E-G, критический путь переключается на новую цепочку

Критический путь не закреплён навсегда за одной цепочкой работ - он определяется текущими длительностями и может «переключиться» при их изменении. Увеличьте B всего на 2 дня (с 6 до 8) - путь B-E-G вырастет до 8+5+9=228+5+9=22 дней и станет новым и единственным критическим путём, а прежние A-D-G и A-C-E-G (по-прежнему по 21 дню) станут некритическими. Проверить это можно прямо в калькуляторе выше, сдвинув ползунок B.

Пример полного расчёта

Соберём весь алгоритм в один проход по шагам - именно так оформляют решение в контрольной работе:

  1. Прямой проход: Tран=[0, 4, 7, 12, 14, 21]T_{\text{ран}} = [0,\ 4,\ 7,\ 12,\ 14,\ 21] для событий 0-5 (расчёт - в разделе выше).
  2. Обратный проход: Tпоз=[0, 4, 7, 12, 15, 21]T_{\text{поз}} = [0,\ 4,\ 7,\ 12,\ 15,\ 21].
  3. Резервы событий: R=[0,0,0,0,1,0]R = [0, 0, 0, 0, 1, 0] - критичны все события, кроме события 4.
  4. Критические работы: проверка условия Tран[i]+tij=Tран[j]T_{\text{ран}}[i]+t_{ij}=T_{\text{ран}}[j] при нулевых резервах концов даёт A, C, D, E, G; работа B отсеивается, несмотря на нулевые резервы своих событий.
  5. Критический путь: длина 21 день, представлен двумя равными путями A-D-G и A-C-E-G.
  6. Резервы некритических работ: B - полный 1, свободный 1; F - полный 1, свободный 0; H - полный 1, свободный 1.

Если сам сетевой график ещё не построен - то есть неизвестно, как разложить список работ с предшественниками на события и дуги, - этот шаг разобран отдельно в статье про построение сетевого графика методом CPM; здесь же мы считаем критический путь на уже готовой топологии.

Частые ошибки

  • Нулевой резерв обоих событий принимают за признак критичности работы. Как на работе B выше - это необходимое, но не достаточное условие; проверяйте равенство Tран[i]+tij=Tран[j]T_{\text{ран}}[i]+t_{ij}=T_{\text{ран}}[j].
  • Путают полный и свободный резерв. Полный - запас относительно всего проекта, свободный - запас, не трогающий раннее время следующего события; свободный всегда не больше полного.
  • В прямом проходе берут первую попавшуюся входящую работу вместо максимума. Если к событию ведут несколько работ, нужен максимум суммы - иначе TранT_{\text{ран}} занижается и расчёт съезжает.
  • Обратный проход начинают раньше, чем закончен прямой. Поздние времена нельзя посчитать, пока не известны все ранние - только последовательно.
  • Не проверяют, что критических путей может быть несколько. Одна «первая найденная» цепочка легко пропускает второй путь той же длины.

FAQ

С чего начать расчёт, если топология графика уже дана? С прямого прохода: начальному событию Tран=0T_{\text{ран}}=0, дальше по возрастанию номеров - максимум по входящим работам. Только когда посчитаны все ранние времена, включая конечное событие, переходят к обратному проходу.

Как проверить расчёт критического пути на ошибку? Пересчитать длину каждого пути от начала до конца вручную и сравнить с TранT_{\text{ран}} последнего события - они обязаны совпасть. Отрицательный резерв события означает, что в проходах перепутаны максимум и минимум.

Может ли резерв события быть отрицательным? При обычном расчёте - нет: TпозT_{\text{поз}} последнего события всегда равен его же TранT_{\text{ран}}. Отрицательные резервы появляются, только если директивный срок проекта меньше длины критического пути - сигнал, что план не укладывается в срок ни при каком порядке работ.

Коротко

Расчёт критического пути сетевого графика - это два последовательных прохода: прямой находит ранние времена событий через максимум по входящим работам, обратный - поздние времена через минимум по исходящим. Резерв события R[i]=Tпоз[i]Tран[i]R[i]=T_{\text{поз}}[i]-T_{\text{ран}}[i] определяет, критическое ли оно, но для самой работы этого недостаточно - нужно ещё и равенство Tран[i]+tij=Tран[j]T_{\text{ран}}[i]+t_{ij}=T_{\text{ран}}[j]. Критических путей в графике может быть несколько одновременно, а полный резерв работы всегда не меньше свободного - это и есть три места, где чаще всего ошибаются при расчёте вручную.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также

Полный резерв времени работы сетевого графика: формула

Полный резерв времени работы сетевого графика: формула

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

11 июня 20269 минут
Сетевое планирование: построение сетевого графика

Сетевое планирование: построение сетевого графика

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

11 июня 20268 минут
Атрибуты сущности в ER-модели: пять типов и примеры

Атрибуты сущности в ER-модели: пять типов и примеры

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

7 июля 20269 минут
Циркуляция векторного поля по контуру: формула и смысл

Циркуляция векторного поля по контуру: формула и смысл

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

7 июля 20267 минут
Динамическое программирование: основы и идея мемоизации

Динамическое программирование: основы и идея мемоизации

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

7 июля 20267 минут
Кодировка Unicode и UTF-8: как кодируются символы

Кодировка Unicode и UTF-8: как кодируются символы

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

7 июля 20269 минут