跳到正文
格致开物MATHWIKI

计划评审技术

计划评审技术(program evaluation and review technique,PERT)用活动依赖网络分析工期不确定的项目。经典做法为每项活动提供乐观、最可能、悲观三个时间估计,再估计路径工期的均值与方差。它可以整理风险信息,但几个主观数值并不足以自动确定真实工期分布;项目完成概率也不能只凭一条平均最长路径就精确计算。[1]

设三项活动A、B、C必须依次完成,单位为天。三点估计分别为A (1,2,3)、B (2,3,8)、C (1,1,1),其中第二个数是最可能值,不是已经测得的均值。C视为固定一天,B则有明显较长的悲观尾部。

经典三点估计的含义

对 0≤a≤m≤b,传统PERT常使用 μ^=a+4m+b6,σ^2=(b−a6)2. 均值在此被最可能值加权拉近,标准差则取极差的六分之一。这是具体的估计约定,不是概率论对任意三点信息必然推出的恒等式。三点也没有一般地唯一确定Beta分布的全部形状参数;若用某种“Beta-PERT”参数化进行模拟,应明确具体参数和由该分布实际算出的方差,不能把不同约定混用。

当 a=m=b,可直接用该确定值、方差零;当乐观或悲观值实际只是分位数而非分布边界,也应说明含义。输入数字的精确小数位不代表估计本身准确。

一条顺序链的完整计算

按经典公式,A均值二、方差 1/9;B均值 11/3、方差一;C均值一、方差零。总工期 T=XA+XB+XC 满足期望可加: 𝔼T^=2+11/3+1=20/3. 若进一步假定活动工时相互独立,路径方差估计为 1/9+1=10/9。若不独立,则实际方差还含两两协方差项: Var⁡T=∑iVar⁡Xi+2∑i<jCov⁡(Xi,Xj). 共同的天气或供应短缺可能让这些协方差为正,忽略它们会低估风险;均值相加本身则不要求独立。

再作正态近似,八天内完成的估计概率是 z=8−20/310/9=410,Pr⁡(T≤8)≈Φ(z)≈0.8970. 这里仅有两项随机工期,不足以仅凭“相加”就保证中心极限定理的近似精度。这个数字是明确假设下的粗估,不是八十九点七个百分点的验收承诺。实际上本例工期总范围为四至十二天,而正态分布还会给范围外分配非零概率。

横轴总工期天数,正态近似均值20/3、标准差根号10/3,八天左侧阴影约0.897
这是经典矩估计后的正态示意,不是由三点信息确定的真实密度;虚线八天是所问截止时间。

路径切换带来的偏差

有并行分支时,项目完成时间是各路径随机总长的最大值。对每次实现都有 maxkTk≥Tj,所以取期望得到 𝔼maxkTk≥maxk𝔼Tk. 通常为严格不等号。取两条并行活动:一条恒为两天,另一条各以二分之一概率为零或四天。两条的平均都为二,但项目总工期为二或四,平均三。先求每条均值再取最大,只得二,已经漏掉一天。

两条并行分支A恒2,B随机0或4各一半;项目时长max为2或4,平均3大于路径均值最大值2
这个反例只使用两个离散结果,偏差可精确手算,无须以模拟代替证明。

有多条近关键路径、共享活动或相关工时时,应为整个网络逐次生成工时,再按关键路径法的最大前驱递推计算该次完工时间;充分的观测或模型验证仍不可省略。不能分别模拟每条路径而把共同活动当成相互独立的不同活动。

复算三点估计

下例只计算一条独立顺序链的传统矩估计及正态近似,不模拟真实分布,也不求一般网络的完成概率。

Python 3
import math

def pert_chain(three_point, deadline):
    if not math.isfinite(deadline):
        raise ValueError("finite deadline required")
    mean = variance = 0.0
    for row in three_point:
        if len(row) != 3 or any(not math.isfinite(x) for x in row):
            raise ValueError("three finite estimates required")
        a,m,b = row
        if not 0 <= a <= m <= b:
            raise ValueError("require 0 <= a <= mode <= b")
        mean += (a+4*m+b)/6
        variance += ((b-a)/6)**2
    if variance == 0:
        probability = float(deadline >= mean)
    else:
        z = (deadline-mean)/math.sqrt(variance)
        probability = 0.5*math.erfc(-z/math.sqrt(2))
    return mean,variance,probability

mean,var,probability = pert_chain([(1,2,3),(2,3,8),(1,1,1)],8)
print(round(mean,6),round(var,6),round(probability,6))
# 6.666667 1.111111 0.897048

对 n 项活动一次扫描,时间 O(n)、工作空间 O(1);其计算正确性只针对所写估计规则。变式。 若三项都固定为二、三、一,则总工期确定为六,六天内完成概率为一、五天内为零,应使用确定性判断,不把零方差代入标准化分母。

参考文献

  1. ↑ Fred E. Williams,PERT Completion Times Revisited (2005),§2—4,第21—27页,经典三点近似、近关键路径与Beta参数的区别;已通过出版社全文读取。
  • D. G. Malcolm、J. H. Roseboom、C. E. Clark、W. Fazar,Application of a Technique for Research and Development Program Evaluation,Operations Research 7(5),1959,646—669,DOI:10.1287/opre.7.5.646。历史原始文献;上文近似条件参照Williams的公开全文审查。