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

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

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

Полный резерв времени работы - это запас, на который можно сдвинуть начало или растянуть длительность конкретной работы сетевого графика, не отодвигая при этом срок завершения всего проекта. Понятие возникает в сетевом планировании и управлении (СПУ), когда график уже построен и посчитаны ранние и поздние времена событий: остаётся спросить не «когда наступит событие», а «сколько свободы есть у конкретной работы». Ниже разберём точную формулу полного резерва, отличие от свободного резерва той же работы и разберём числовой пример на сети из шести работ, где у одной из них резерв оказывается неожиданно большим. Чтобы сразу увидеть, как резерв меняется при других длительностях, покрутите калькулятор ниже - он выполняет прямой и обратный проход мгновенно и подставляет числа в формулу для выбранной работы.

Что такое полный резерв времени работы

Каждая работа (i,j)(i,j) сетевого графика соединяет начальное событие ii и конечное событие jj и занимает время t(i,j)t(i,j). Раннее время события ii - это tр(i)t_р(i), самый ранний момент, когда все предшествующие работы уже завершены и работа (i,j)(i,j) может начаться. Позднее время события jj - это tп(j)t_п(j), самый поздний момент, к которому событие jj обязано наступить, чтобы не сорвать срок всего проекта.

Полный резерв работы (i,j)(i,j) отвечает на вопрос: сколько времени есть у этой работы между самым ранним возможным стартом и самым поздним допустимым финишем сверх её собственной длительности. Если этот запас больше нуля, работу можно начать позже расчётного срока, растянуть, или разбить паузой - и на общий срок проекта это не повлияет. Если запас равен нулю, у работы нет свободы вообще: любая задержка немедленно сдвигает финиш проекта. Такие работы образуют критический путь - самую длинную по времени цепочку от старта к финишу.

Формула полного резерва

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

Rп(i,j)=tп(j)tр(i)t(i,j),R_п(i,j) = t_п(j) - t_р(i) - t(i,j),

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

Отрезок работы (закрашенный) сдвигается внутри своего допустимого окна между ранним началом и поздним финишем конечного события; хвост окна - это и есть полный резерв. У критической работы окно совпадает с длительностью, сдвигать некуда

Прямой проход считает tр(i)t_р(i) для каждого события от старта к финишу: tр(i)=maxt_р(i) = \max по всем входящим работам от суммы раннего времени предшественника и длительности этой работы. Обратный проход считает tп(j)t_п(j) от финиша к старту: tп(i)=mint_п(i) = \min по всем исходящим работам от разности позднего времени преемника и длительности работы, ведущей к нему. Оба прохода нужно выполнить один раз для всей сети, а дальше формула резерва подставляет уже готовые числа tрt_р и tпt_п для конкретной пары событий.

⚠️ Важное отличие полного резерва работы от резерва события: событие ii имеет собственный резерв R(i)=tп(i)tр(i)R(i) = t_п(i) - t_р(i), но обнуление резервов ОБОИХ событий работы не гарантирует, что резерв самой работы тоже нулевой - подробный разбор этого нюанса и полный расчёт критического пути на графике из восьми работ есть в статье про расчёт критического пути сетевого графика. Здесь же формула Rп(i,j)=0R_п(i,j) = 0, применённая прямо к работе, - точный и достаточный критерий критичности без всяких оговорок.

Числовой пример на сети из шести работ

Возьмём сеть с пятью событиями (0 - старт, 4 - финиш) и шестью работами:

РаботаДугаДлительность, дни
A0→15
B0→23
C1→34
D2→38
E1→46
F3→45

Работа E нарочно проведена «в обход»: она ведёт из события 1 сразу в финишное событие 4, минуя событие 3. Такая диагональ - типичный источник большого резерва: у неё нет обязанности укладываться в цепочку через D и F.

Прямой проход: tр(0)=0t_р(0)=0, tр(1)=5t_р(1)=5 (через A), tр(2)=3t_р(2)=3 (через B), tр(3)=max(5+4,3+8)=max(9,11)=11t_р(3)=\max(5+4,\,3+8)=\max(9,11)=11 (через D), tр(4)=max(5+6,11+5)=max(11,16)=16t_р(4)=\max(5+6,\,11+5)=\max(11,16)=16 (через F). Значит, срок проекта Tкр=16T_{кр}=16 дней, и на финиш ведёт цепочка B-D-F.

Обратный проход от tп(4)=16t_п(4)=16: tп(3)=165=11t_п(3)=16-5=11, tп(1)=min(114,166)=min(7,10)=7t_п(1)=\min(11-4,\,16-6)=\min(7,10)=7, tп(2)=118=3t_п(2)=11-8=3, tп(0)=min(75,33)=0t_п(0)=\min(7-5,\,3-3)=0 - совпало с tр(0)t_р(0), значит расчёт согласован.

Сетевой график с шестью работами: критический путь B-D-F выделен, у диагональной работы E показано окно полного резерва между ранним стартом и поздним финишем
Сетевой график с шестью работами: критический путь B-D-F выделен, у диагональной работы E показано окно полного резерва между ранним стартом и поздним финишем

Теперь подставим числа в формулу резерва для работы E: Rп(E)=tп(4)tр(1)t(E)=1656=5R_п(E) = t_п(4) - t_р(1) - t(E) = 16 - 5 - 6 = 5 дней. Для сравнения, у работы A: Rп(A)=tп(1)tр(0)t(A)=705=2R_п(A) = t_п(1) - t_р(0) - t(A) = 7 - 0 - 5 = 2 дня, у работы C: Rп(C)=tп(3)tр(1)t(C)=1154=2R_п(C) = t_п(3) - t_р(1) - t(C) = 11 - 5 - 4 = 2 дня. А у работ B, D и F резерв равен нулю - это и есть критический путь длиной 16 дней.

Что означает резерв в 5 дней для работы E

Резерв Rп(E)=5R_п(E) = 5 дней не означает «работа E не важна» - он означает конкретную управленческую свободу: работу E можно начать на 5 дней позже расчётного раннего срока, или растянуть её длительность на те же 5 дней, или разбить паузой суммарно в 5 дней - и ни один из этих вариантов не сдвинет финиш проекта. Это ценный ресурс при нехватке людей или оборудования: если исполнитель работы E нужен ещё где-то, его можно временно перебросить на критическую работу, а к E вернуться позже, оставаясь в пределах резерва.

Гант-диаграмма работы E с измерением: скобка отмечает полный резерв 5 дней между ранним окончанием работы и поздним временем конечного события 4
Гант-диаграмма работы E с измерением: скобка отмечает полный резерв 5 дней между ранним окончанием работы и поздним временем конечного события 4

Здесь же скрыта ловушка: резерв в 5 дней принадлежит РАБОТЕ E целиком, а не событию 1, из которого она выходит. Из события 1 выходит ещё работа C со своим резервом (2 дня), рассчитанным по той же формуле, но с другим tпt_п конечного события. Если задержать само событие 1 (а не одну работу), это «съедает» резерв сразу обеих исходящих работ одновременно - за этим нужно следить отдельно.

Полный резерв vs свободный резерв

Полный резерв Rп(i,j)=tп(j)tр(i)t(i,j)R_п(i,j) = t_п(j) - t_р(i) - t(i,j) отвечает на вопрос «на сколько можно сдвинуть работу, не срывая срок всего проекта». Рядом с ним существует свободный резерв:

Rсв(i,j)=tр(j)tр(i)t(i,j),R_{св}(i,j) = t_р(j) - t_р(i) - t(i,j),

который использует РАННЕЕ время конечного события tр(j)t_р(j) вместо позднего tп(j)t_п(j). Свободный резерв отвечает на более осторожный вопрос: «на сколько можно сдвинуть работу, не сдвигая ранний срок ни одного последующего события». Поскольку tр(j)tп(j)t_р(j) \le t_п(j) всегда, свободный резерв никогда не превышает полный: Rсв(i,j)Rп(i,j)R_{св}(i,j) \le R_п(i,j). Для работы E в нашем примере событие 4 - финишное, поэтому tр(4)=tп(4)=16t_р(4) = t_п(4) = 16 и оба резерва совпадают: Rсв(E)=1656=5R_{св}(E) = 16 - 5 - 6 = 5. А вот для работы C, ведущей в промежуточное событие 3, Rсв(C)=tр(3)tр(1)t(C)=1154=2R_{св}(C) = t_р(3) - t_р(1) - t(C) = 11 - 5 - 4 = 2 - тоже совпадает с полным здесь, потому что в событие 3 сходятся C и D, и обе используют его целиком. Расхождение между резервами становится заметным на более разветвлённых сетях - иногда полный резерв большой, а свободный равен нулю, потому что растягивание работы, даже не срывая общий финиш, всё равно сдвигает ранний старт следующей.

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

  • Подстановка позднего времени начального события вместо раннего. В формуле Rп(i,j)=tп(j)tр(i)t(i,j)R_п(i,j) = t_п(j) - t_р(i) - t(i,j) для события ii берётся именно РАННЕЕ время tр(i)t_р(i), а не позднее tп(i)t_п(i) - перепутав их, получите заниженный или отрицательный резерв.
  • Путаница полного резерва со свободным. Полный резерв использует tп(j)t_п(j) конечного события, свободный - tр(j)t_р(j). Это разные числа и разный управленческий смысл, подменять одно другим нельзя.
  • Резерв работы через резервы обоих её событий. Обнуление резервов событий ii и jj - необходимое, но не всегда достаточное условие критичности самой работы; надёжнее считать Rп(i,j)R_п(i,j) напрямую по формуле, а не выводить его из резервов событий.
  • Забытый обратный проход. Без вычисленного tп(j)t_п(j) полный резерв найти невозможно - обратный проход от финишного события к стартовому обязателен, даже если интересует только одна работа в середине сети.
  • Отрицательный резерв как «нормальный» результат. Если расчёт даёт Rп(i,j)<0R_п(i,j) < 0, это признак ошибки в построении сети или в длительностях, а не законный случай - при корректных данных полный резерв не бывает отрицательным.

FAQ

Может ли полный резерв работы быть больше резерва события, из которого она выходит? Нет, для работы, выходящей из события ii, резерв работы ограничен резервом события: Rп(i,j)R(i)+(tп(j)tп(i))R_п(i,j) \le R(i) + (t_п(j) - t_п(i)) , а на практике полный резерв работы всегда согласован с резервами обоих её событий - он не может «превысить» свободу, доступную сети в целом.

Что происходит с полным резервом при увеличении длительности критической работы? Ничего не остаётся нулевым - весь проект удлиняется на ту же величину, потому что у критической работы Rп=0R_п = 0 и расти ей некуда: любое увеличение t(i,j)t(i,j) немедленно сдвигает tрt_р следующих событий и финишный срок.

Зачем вообще считать полный резерв, если известен критический путь? Критический путь показывает, ГДЕ нет свободы, а полный резерв - ЧТО делать с оставшимся временем: перераспределять ресурсы между некритическими работами, сдвигать их без риска для срока и находить дополнительный запас на случай накладок.

Коротко

Полный резерв времени работы сетевого графика вычисляется по формуле Rп(i,j)=tп(j)tр(i)t(i,j)R_п(i,j) = t_п(j) - t_р(i) - t(i,j): из окна между ранним стартом и поздним финишем работы вычитается её собственная длительность. Резерв, равный нулю, означает критическую работу без права на задержку; резерв больше нуля - управленческий запас, который можно расходовать на сдвиг сроков или перераспределение ресурсов. Полный резерв отличается от свободного тем, что использует позднее, а не раннее время конечного события, и потому никогда не меньше свободного резерва той же работы.

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

Открыть EssayAI

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

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

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

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

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

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 минут