procedure CRITICALPATH (n, I, J, DIJ, ES, LS, EF, LF, TF, FF);
integer n;
integer array I, J, DIJ, ES, LS, EF, LF, TF, FF;
comment
ALGORITHM 40 CRITICAL PATH SCHEDULING
B. LEAVENWORTH
American Machine & Foundry Co., Greenwich, Conn.
Given the total number of jobs n of a project, the vector pair I[k],
J[k] representing the kth job, which is thought of as an arrow
connecting event I[k] to event Jk[Ik < Jk, k = 1 --", n], and a
duration vector DIJ[k], CRITICALPATH determines:
The earliest starting time ES[k], latest starting time LS[k],
earliest completion time EF[k], latest completion time LF[k],
the total float TF[k], and the free float FF[k].
I1 must be 1 and the Ik, Jk must be in ascending order.
For example, if the first three jobs are labeled (1, 2), (1, 3), (3, 4),
then the I, J vectors are (1, 1, 3) and (2, 3, 4) respectively.
The critical path is given by each arrow whose total float is zero.
The following non-local labels are used for exits:
purl-I[k] not less than Jk, out2-I[k] out of sequence, out3-Ik missing.
REFERENCES:
(1) JAMES E. KELLEY, JR. and MORGAN R. WALKER, "Critical-Path Planning and Scheduling,"
1959 Proceedings of the Eastern Joint Computer Conference.
(2) M. C. FRISHBERG, "Least Cost Estimating and Scheduling -- Scheduling Phase Only,"
IBM 650 Program Library File No. 10.3.005. ;
begin
integer k, index, max, min;
integer array ti, te [1:11] ;
index ≔ 1;
for k ≔ 1 step 1 until n do
begin
if I[k] ⩾ J[k] then go to purl ;
if I[k] < index then go to out2 ;
if I[k] > index ∧ I[k] ≠ index + 1 then go to out3 ;
if I[k] = index + 1 then index ≔ I[k];
C: end;
for k ≔ 1 step 1 until n do
ti[k] ≔ te[k] ≔ 0;
for k ≔ 1 step 1 until n do
begin
max ≔ ti[I[k]] + DIJ[k];
if ti[J[k]] = 0 ∨ ti[J[k]] < max then ti[J[k]] ≔ max;
A: end ti;
te[J[n]] ≔ ti[J[n]];
for k ≔ n step -1 until 1 do
begin
min ≔ te[J[k]] - DIJ[k];
if te[I[k]] = 0 ∧ te[I[k]] > rain then te[I[k]] ≔ rain;
B: end te;
for k ≔ 1 step 1 until n do
begin
ES[k] ≔ ti[I[k]];
LS[k] ≔ te[J[k]] - DIJ[k];
EF[k] ≔ ti[I[k]] + DIJ[k];
LF[k] ≔ te[J[k]];
TF[k] ≔ te[J[k]] - ti[I[k]] - DIJ[k];
FF[k] ≔ ti[J[k]] - ti[I[k]] - DIJ[k]
end
end CRITICALPATH;