9000  REM  ***  HP TIME-SHARED BASIC PROGRAM LIBRARY  ******************
9001  REM
9002  REM          CPATH:  CRITICAL PATH ANALYSIS
9003  REM
9004  REM        36171   REV B       4/72
9005  REM
9006  REM  ***  CONTRIBUTED PROGRAM  ***********************************
9007  REM
9008  REM  ***  CONVERSION BY JOHN H. BARLOW  (SEP.,1975)
9011  PRINT "*  CRITICAL PATH  *"'10'10
9012  DIM N[75],E[75],L[75],P[150],S[150],T[150],K[150],R[150]
9014  DIM I$[1]
9016  DIM J$[1]
9018  REM  N(I) IS THE NUMBER OF EVENT I
9020  REM  E(I) IS THE EARLIEST TIME FOR EVENT I
9022  REM L(I) IS THE LATEST TIME FOR EVENT I
9024  REM  N1 IS THE NUMBER OF EVENTS
9026  REM  P(I) IS THEEVENT PRECEEDING ACTIVITY I
9028  REM  S(I) IS THE NUMBER OF THE EVENT SUCEEDING ACTIVITY I
9030  REM  T(I) IS THE TIME TO COMPLETE ACTIVITY I
9032  REM  R(I) IS THE NUMBER OF THE ITH RANKED ACTIVITY
9034  REM  N2 IS THE NUMBER OF ACTIVITIES
9036  REM  C IS THE MINIMUM TIME TO COMPLETE THE PROJECT
9038  PRINT "DO YOU WISH TO ENTER DATA FROM THE TELETYPE AS IT BECOMES NECESSARY,"
9040  PRINT "OR TO ENTER IT INTERNALLY WITH 'DATA'-STATEMENTS?  (ENTER 'T' FOR"
9042  PRINT "TELETYPE, 'D' OTHERWISE)";
9044  INPUT I$
9046  IF I$="T" THEN 9110
9048  PRINT "HAS THE DATA ALREADY BEEN ENTERED? ('Y' FOR YES, 'N' FOR NO.)";
9050  INPUT J$
9052  IF J$="Y" THEN 9112
9054  PRINT "ENTER DATA STARTING IN LINE 9900.  FOR FORMAT SPECIFICATIONS "
9056  PRINT "TYPE 'LIST-9436'. PROGRAM WILL HAVE TO BE RE-STARTED."
9058  STOP 
9060  REM  READ ACTIVITIES
9062  GOSUB 9152
9064  REM  RANK ACTIVITIES ON ASCENDING PREDECESSOR NUMBER
9066  LET N5=0
9068  GOSUB 9194
9070  REM  FIND EARLY EVENT TIMES
9072  GOSUB 9236
9074  REM  FIND LATE EVENT TIMES
9076  GOSUB 9274
9078  REM  PRINT EVENT TIMES
9080  GOSUB 9316
9082  REM  PRINT ACTIVITY TIMES
9084  GOSUB 9348
9086  REM  RETURN TO READ A NEW PROBLEM
9088  PRINT 
9090  PRINT 
9092  PRINT "*****************************************************************"
9094  PRINT 
9096  PRINT 
9098  PRINT "DO YOU HAVE ANOTHER PROBLEM? ('Y' FOR YES, 'N' FOR NO)";
9100  INPUT I$
9102  IF I$="N" THEN 9999
9104  PRINT 
9106  GOTO 9038
9108  MAT N=ZER
9110  REM  SUBROUTINE TO READ EVENT NUMBERS
9111  LET A=0
9112  PRINT 
9114  IF I$="D" THEN 9122
9116  PRINT "HOW MANY EVENTS DO YOU HAVE";
9118  INPUT N1
9120  GOTO 9124
9122  READ N1
9124  IF N1 <= 75 THEN 9132
9126  PRINT "SORRY, I CAN ONLY HANDLE 75 EVENTS.  TRY A VALUE < 75."
9128  IF I$="D" THEN 9058
9130  GOTO 9118
9132  FOR I=1 TO N1
9134  LET E[I]=0
9136  LET L[I]=0
9138  IF I$="T" THEN 9144
9140  READ N[I]
9142  GOTO 9148
9144  GOTO 9394
9146  INPUT N[I]
9148  NEXT I
9150  GOTO 9060
9152  LET A=0
9154  PRINT 
9156  REM  SUBROUTINE TO READ ACTIVITIES
9158  IF I$="D" THEN 9166
9160  PRINT "HOW MANY ACTIVITIES DO YOU HAVE";
9162  INPUT N2
9164  GOTO 9168
9166  READ N2
9168  IF N2 <= 150 THEN 9176
9170  PRINT "SORRY, I CAN ONLY HANDLE 150 ACTIVITIES.  TRY A VALUE < 150."
9172  IF I$="D" THEN 9058
9174  GOTO 9162
9176  FOR I=1 TO N2
9178  IF I$="D" THEN 9186
9180  GOTO 9414
9182  INPUT P[I],S[I],T[I]
9183  IF P[I]>S[I] THEN 9454
9184  GOTO 9188
9186  READ P[I],S[I],T[I]
9187  IF P[I]>S[I] THEN 9454
9188  NEXT I
9190  LET A=0
9192  RETURN 
9194  REM  SUBROUTINE TO ASSIGN RANKS TO ACTIVITIES
9196  REM IF N5 = 0, RANK ON ASCENDING ORDER OF PREDECESSOR
9198  REM IF N5 = 1, RANK ON DESCENDING ORDER OF SUCCESSOR
9200  FOR I=1 TO N2
9202  LET R[I]=I
9204  NEXT I
9206  LET N9=N2
9208  LET N9=N9-1
9210  LET N8=0
9212  FOR I=1 TO N9
9214  IF N5=1 THEN 9220
9216  IF P[R[I]] <= P[R[1+I]] THEN 9230
9218  GOTO 9222
9220  IF S[R[I]] >= S[R[I+1]] THEN 9230
9222  LET R1=R[I]
9224  LET R[I]=R[I+1]
9226  LET R[I+1]=R1
9228  LET N8=1
9230  NEXT I
9232  IF N8=1 THEN 9208
9234  RETURN 
9236  REM SUBROUTINE TO FIND EARLY EVENT TIMES
9238  FOR I=1 TO N2
9240  LET N3=P[R[I]]
9242  GOSUB 9260
9244  LET I1=K
9246  LET N3=S[R[I]]
9248  GOSUB 9260
9250  LET I2=K
9252  IF E[I2] >= E[I1]+T[R[I]] THEN 9256
9254  LET E[I2]=E[I1]+T[R[I]]
9256  NEXT I
9258  RETURN 
9260  REM SUBROUTINE TO FIND INTERNAL NUMBER (I) OF EVENT N3
9262  FOR K=1 TO N1
9264  IF N[K]=N3 THEN 9272
9266  NEXT K
9268  PRINT "SORRY, YOU DIDNT TELL ME ABOUT EVENT",N3
9270  STOP 
9272  RETURN 
9274  REM SUBROUTINE TO FIND LATE EVENT TIMES
9276  REM RANK ACTIVITIES IN DESCENDING ORDER OF SUCCESSORS
9278  LET N5=1
9280  GOSUB 9194
9282  FOR I=1 TO N2
9284  LET N3=S[R[I]]
9286  GOSUB 9260
9288  LET I1=K
9290  LET N3=P[R[I]]
9292  GOSUB 9260
9294  LET I2=K
9296  IF L[I2] >= L[I1]+T[R[I]] THEN 9300
9298  LET L[I2]=L[I1]+T[R[I]]
9300  NEXT I
9302  LET N3=S[R[1]]
9304  GOSUB 9260
9306  LET C=E[K]
9308  FOR I=1 TO N1
9310  LET L[I]=C-L[I]
9312  NEXT I
9314  RETURN 
9316  PRINT 
9318  PRINT 
9320  PRINT "****************************************************************"
9322  REM SUBROUTINE TO PRINT EVENT TIMES
9324  PRINT 
9326  PRINT " ","***  EVENT TIMES  ***"
9328  PRINT 
9330  PRINT "   EVENT ","EARLIEST TIME","LATEST TIME"
9332  PRINT 
9334  FOR I=1 TO N1
9336  IF E[I]=L[I] THEN 9342
9338  PRINT N[I],E[I],L[I]
9340  GOTO 9344
9342  PRINT N[I],E[I],L[I],"CRITICAL PATH"
9344  NEXT I
9346  RETURN 
9348  PRINT 
9350  PRINT "----------"
9352  PRINT 
9354  PRINT " ","*** ACTIVITY TIMES ***"
9356  PRINT 
9358  PRINT "PREDECESSOR","SUCCESSOR","ACTUAL TIME","MAXIMUM TIME"
9360  PRINT 
9362  FOR I=1 TO N2
9364  LET N3=P[I]
9366  GOSUB 9260
9368  LET I1=K
9370  LET N3=S[I]
9372  GOSUB 9260
9374  LET I2=K
9376  LET D=L[I2]-E[I1]
9378  IF T[I]=D THEN 9384
9380  PRINT P[I],S[I],T[I],D
9382  GOTO 9386
9384  PRINT P[I],S[I],T[I],D;TAB(59);"CRITICAL PATH"
9386  NEXT I
9388  RETURN 
9390  REM TEST DATA FOR BCP
9394  IF A=1 THEN 9404
9396  IF A=2 THEN 9410
9398  LET A=1
9400  PRINT "ENTER THE ID NUMBER OF THE FIRST EVENT";
9402  GOTO 9146
9404  LET A=2
9406  PRINT "THE ID NUMBER OF THE NEXT EVENT";
9408  GOTO 9146
9410  PRINT "NEXT";
9412  GOTO 9146
9414  IF A=1 THEN 9426
9416  IF A=2 THEN 9432
9418  LET A=1
9420  PRINT "FOR THE FIRST ACTIVITY, ENTER THE NUMBER OF THE EVENT PRECEEDING IT,"
9422  PRINT "THE NUMBER OF THE EVENT SUCCEEDING IT, AND THE TIME OF THE ACTIVITY."
9424  GOTO 9182
9426  LET A=2
9428  PRINT "FOR THE NEXT ACTIVITY";
9430  GOTO 9182
9432  PRINT "NEXT";
9434  GOTO 9182
9436  REM   DATA NO. OF EVENTS, LIST OF ID NOS. OF EVENTS (FOR CLARITY
9438  REM        LIST EVENTS IN NUMERICAL ORDER, SMALLEST FIRST.)
9440  REM   DATA NO. OF ACTIVITIES, LIST OF (FOR EACH ACTIVITY) THE ID
9442  REM        NUMBER OF THE EVENT PRECEEDING IT, THE ID OF THE EVENT
9444  REM        SUCCEEDING IT, AND THE TIME NECESSARY TO COMPLETE IT.
9446  REM
9448  REM EXAMPLE:
9450  REM     9900 DATA 5,1,2,3,4,5
9452  REM     9901 DATA 3,1,3,2,2,4,3,3,5,4
9454  PRINT "SORRY, RUN ABORTED. YOU INDICATED EVENT ";P[I];"PRECEEDS ";S[I]
9456  PRINT 
9457  PRINT "THESE ARE NOT IN ASCENDING ORDER. "
9460  GOTO 9098
9999  END 
