!******************************************************** !* TIME PERT MODEL * !* * !* LIST OF MAIN VARIABLES; * !* * !* N ; NUMBER OF ACTIVITIES * !* NA : NUMBER OF PRECEDING ACTIVITIES * !* D(N) ; PROBABLE DURATION FOR EACH ACTIVITY * !* PRED(N) ; INDEX OF PRECEDING ACTIVITIES * !* ANTE(NA) ; PRECEDING ACTIVITIES OF EACH ACTIVITY * !* MARQ(2,N); ACTIVITY LEVEL * !* TOT(N) ; SOONEST DATE FOR EACH ACTIVITY * !* TARD(N) ; LATEST DATE FOR EACH ACTIVITY * !* DE ; ESTIMATED DURATION * !* DOP ; OPTIMISTIC DURATION (DO IS NOT VALID) * !* DP ; PESSIMISTIC DURATION * !* ANTE ; NUMBER OF PREVIOUS ACTIVITIES * !* K ; NUMBER OF ACTIVITY LEVEL * !* R ; USED TO SEEK A LEVEL * !* TOT ; USED TO SEEK SOONEST DATE * !* TARD ; USED TO SEEK LATEST DATE * !* FTA ; LATEST ENDING DATE * !* FOT ; SOONEST ENDING DATE * !* XLO ; MAXIMUM WIDTH OG GANT'S DIAGRAM * !* XMAXT ; PROBABLE MAXIMUM TIME * !* X ; NORMALIZATION COEFFICIENT FOR GANT'S * !* DIAGRAM * !* Y ; NUMBER OF UNITS FOR A SIGN * OR + IN * !* GANT'S DIAGRAM * !* ---------------------------------------------------- * !* PROBLEM DESCRIPTION; * !* A Company, owning one mainframe computer, wants to * !* buy and install a second one. Before a false floor * !* must be laid to hide connection cables, and an air- * !* conditioning unit must be put in. The activities to * !* perform are given in the following table (durations * !* in hours); * !* ------------------------------------------------- * !* Number Task Description Preceding DE DO DP * !* Activities * !* ------------------------------------------------- * !* 1 Set the Dates of * !* All the Tasks - 3 2 4 * !* 2 Install Electric * !* Connections 1 7 4 10 * !* 3 Install Air Condit. 2 16 8 24 * !* 4 Disconnect Old * !* Computer 2 4 2 6 * !* 5 Start New Air Cond. 3 2 1 3 * !* 6 Lay False Floor 3,4 24 16 32 * !* 7 Clean Up the Room 6 3 2 4 * !* 8 Install New Computer 5,7 16 8 24 * !* 9 --- 8 0 0 0 * !* ------------------------------------------------- * !* SAMPLE RUN; * !* TIME PERT MODEL * !* ACTIVITY DESCRIPTION * !* * !* NUMBER OF ACTIVITIES ? 9 * !* * !* ACTIVITY #1; * !* ESTIMATED DURATION ? 3 * !* OPTIMISTIC DURATION ? 2 * !* PESSIMISTIC DURATION ? 4 * !* NUMBER OF PRECEDING ACTIVITIES ? 0 * !* * !* ACTIVITY #2; * !* ESTIMATED DURATION ? 7 * !* OPTIMISTIC DURATION ? 4 * !* PESSIMISTIC DURATION ? 10 * !* NUMBER OF PRECEDING ACTIVITIES ? 1 * !* PREC. ACTIVITY #1 ? 1 * !* * !* ACTIVITY #3; * !* ESTIMATED DURATION ? 16 * !* OPTIMISTIC DURATION ? 8 * !* PESSIMISTIC DURATION ? 24 * !* NUMBER OF PRECEDING ACTIVITIES ? 1 * !* PREC. ACTIVITY #1 ? 2 * !* * !* ACTIVITY #4; * !* ESTIMATED DURATION ? 4 * !* OPTIMISTIC DURATION ? 2 * !* PESSIMISTIC DURATION ? 6 * !* NUMBER OF PRECEDING ACTIVITIES ? 1 * !* PREC. ACTIVITY #1 ? 2 * !* * !* ACTIVITY #5; * !* ESTIMATED DURATION ? 2 * !* OPTIMISTIC DURATION ? 1 * !* PESSIMISTIC DURATION ? 3 * !* NUMBER OF PRECEDING ACTIVITIES ? 1 * !* PREC. ACTIVITY #1 ? 3 * !* * !* ACTIVITY #6; * !* ESTIMATED DURATION ? 24 * !* OPTIMISTIC DURATION ? 16 * !* PESSIMISTIC DURATION ? 32 * !* NUMBER OF PRECEDING ACTIVITIES ? 2 * !* PREC. ACTIVITY #1 ? 3 * !* PREC. ACTIVITY #2 ? 4 * !* * !* ACTIVITY #7; * !* ESTIMATED DURATION ? 3 * !* OPTIMISTIC DURATION ? 2 * !* PESSIMISTIC DURATION ? 4 * !* NUMBER OF PRECEDING ACTIVITIES ? 1 * !* PREC. ACTIVITY #1 ? 6 * !* * !* ACTIVITY #8; * !* ESTIMATED DURATION ? 16 * !* OPTIMISTIC DURATION ? 8 * !* PESSIMISTIC DURATION ? 24 * !* NUMBER OF PRECEDING ACTIVITIES ? 2 * !* PREC. ACTIVITY #1 ? 5 * !* PREC. ACTIVITY #2 ? 7 * !* * !* ACTIVITY #9; * !* ESTIMATED DURATION ? 0 * !* OPTIMISTIC DURATION ? 0 * !* PESSIMISTIC DURATION ? 0 * !* NUMBER OF PRECEDING ACTIVITIES ? 1 * !* PREC. ACTIVITY #1 ? 8 * !* * !* TIME PERT MODEL * !* RESULTS * !* * !* CA = CRITICAL ACTIVITY * !* SBD = SOONEST BEGIN DATE * !* LBD = LATEST BEGIN DATE * !* SED = SOONEST END DATE * !* LED = LATEST END DATE * !* * !* ACTIVITY #1 PROBABLE DURATION; 3 * CA * * !* SBD = 0 LBD = 0 * !* SED = 3 LED = 3 * !* TOTAL MARGIN = 0 * !* * !* ACTIVITY #2 PROBABLE DURATION; 7 * CA * * !* SBD = 3 LBD = 3 * !* SED = 10 LED = 10 * !* TOTAL MARGIN = 0 * !* * !* ACTIVITY #3 PROBABLE DURATION; 16 * CA * * !* SBD = 10 LBD = 10 * !* SED = 26 LED = 26 * !* TOTAL MARGIN = 0 * !* * !* ANY KEY TO CONTINUE... ? * !* * !* ACTIVITY #4 PROBABLE DURATION; 4 * !* SBD = 10 LBD = 22 * !* SED = 14 LED = 26 * !* TOTAL MARGIN = 12 * !* * !* ACTIVITY #5 PROBABLE DURATION; 2 * !* SBD = 26 LBD = 51 * !* SED = 28 LED = 53 * !* TOTAL MARGIN = 25 * !* * !* ACTIVITY #6 PROBABLE DURATION; 24 * CA * * !* SBD = 26 LBD = 26 * !* SED = 50 LED = 50 * !* TOTAL MARGIN = 0 * !* * !* ANY KEY TO CONTINUE... ? * !* * !* ACTIVITY #7 PROBABLE DURATION; 3 * CA * * !* SBD = 50 LBD = 50 * !* SED = 53 LED = 53 * !* TOTAL MARGIN = 0 * !* * !* ACTIVITY #8 PROBABLE DURATION; 16 * CA * * !* SBD = 53 LBD = 53 * !* SED = 69 LED = 69 * !* TOTAL MARGIN = 0 * !* * !* ACTIVITY #9 PROBABLE DURATION; 0 * CA * * !* SBD = 69 LBD = 69 * !* SED = 69 LED = 69 * !* TOTAL MARGIN = 0 * !* * !* ANY KEY TO CONTINUE... ? * !* * !* GANT'S DIAGRAM * !* * !* THE SIGNS * OR + ARE WORTH 3 TIME UNITS * !* * !* ------------------------------------------- * !* * 3. * !* *** 10. * !* ******** 26. * !* **++++++ 26. * !* *++++++++++++ 53. * !* ************ 50. * !* * 53. * !* ******** 69. * !* ------------------------------------------- * !* * = PROBABLE DURATION + = TOTAL MARGIN * !* * !* ---------------------------------------------------- * !* REFERENCE; * !* Modèles pratiques de décision Tome 2, By Jean-Pierre * !* Blanger, PSI Editions, France, 1982. * !* * !* F90 Release 1.0 By J-P Moreau, Paris. * !* (www.jpmoreau.fr) * !******************************************************** !NOTE: PERT is an acronym for Program Evaluation & Review Technique. PROGRAM TPERT parameter(NMAX=12) REAL D(0:NMAX), TOT(0:NMAX), TARD(0:NMAX) INTEGER ANTE(0:NMAX), PRED(0:NMAX), MARQ(1:2,0:NMAX) Call Data(N,D,ANTE,PRED) !DESCRIBE ACTIVITIES Call Level(N,K,MARQ,ANTE,PRED) !DETERMINE LEVEL Call SDates(N,K,D,MARQ,ANTE,PRED,TOT) !SOONEST DATES Call LDates(N,K,D,MARQ,ANTE,PRED,TOT,TARD) !LATEST DATES Call EDates(N,D,TOT,TARD) !EDIT DATES Call Gant(N,D,TOT,TARD) !GANT'S DIAGRAM STOP END Subroutine Data(N,D,ANTE,PRED) !DESCRIBE ACTIVITIES parameter(NMAX=12) REAL D(0:NMAX) INTEGER ANTE(0:NMAX), PRED(0:NMAX) PRED(0)=0 ANTE(0)=0; ANTE(1)=0 PRINT *,' ' PRINT *,' TIME PERT MODEL' PRINT *,' ACTIVITY DESCRIPTION' PRINT *,' ' WRITE(*,10,advance='no'); READ *, N DO I=1, N PRINT *,' ' WRITE(*,20) I WRITE(*,30,advance='no'); READ *, DE WRITE(*,40,advance='no'); READ *, DOP WRITE(*,50,advance='no'); READ *, DP D(I) = INT(10 * (DOP + 4 * DE + DP) / 6) / 10. WRITE(*,60,advance='no'); READ *, IANTE IF (IANTE.EQ.0) THEN IANTE=1; GOTO 100 END IF DO J=1, IANTE WRITE(*,70,advance='no') J READ *, ANTE(PRED(I-1)+J) END DO 100 PRED(I)=PRED(I-1) + IANTE END DO PRINT *,' TIME PERT MODEL' PRINT *,' RESULTS' PRINT *,' ' RETURN 10 FORMAT(' NUMBER OF ACTIVITIES ? ') 20 FORMAT(' ACTIVITY #',I1,':') 30 FORMAT(' ESTIMATED DURATION ? ') 40 FORMAT(' OPTIMISTIC DURATION ? ') 50 FORMAT(' PESSIMISTIC DURATION ? ') 60 FORMAT(' NUMBER OF PRECEDING ACTIVITIES ? ') 70 FORMAT(' PREC. ACTIVITY #',I1,' ? ') END Subroutine Level(N,K,MARQ,ANTE,PRED) !Determine Level parameter(NMAX=12) INTEGER MARQ(1:2,0:NMAX), ANTE(0:NMAX), PRED(0:NMAX) INTEGER F,R MARQ(2, 0) = 1 DO I = 1, N K = K + 1 DO J = 1, N IF (MARQ(2, J).NE.0) GOTO 130 DO R = PRED(J - 1) + 1, PRED(J) IF (MARQ(2, ANTE(R)).EQ.0) F = 1 END DO IF (F.EQ.1) THEN F = 0; GOTO 130 END IF DO R = PRED(J - 1) + 1, PRED(I) MARQ(1, J) = K END DO 130 END DO DO J = 1, N IF (MARQ(1, J).EQ.K) MARQ(2, J) = K END DO END DO K = MARQ(2, 1) DO I = 1, N IF (MARQ(2, I) > K) K = MARQ(2, I) END DO RETURN END Subroutine SDates(N,K,D,MARQ,ANTE,PRED,TOT) !SOONEST DATES parameter(NMAX=12) INTEGER MARQ(1:2,0:NMAX), ANTE(0:NMAX), PRED(0:NMAX) REAL D(0:NMAX), TOT(0:NMAX) DO I = 1, K DO J = 1, N IF (MARQ(2, J).NE.I) GOTO 10 DO I1 = PRED(J - 1) + 1, PRED(J) XTOT = INT(10. * (TOT(ANTE(I1)) + D(ANTE(I1)))) / 10. IF (TOT(J).EQ.0.) TOT(J) = XTOT IF (XTOT > TOT(J)) TOT(J) = XTOT END DO 10 END DO END DO RETURN END Subroutine LDates(N,K,D,MARQ,ANTE,PRED,TOT,TARD) !LATEST DATES parameter(NMAX=12) INTEGER MARQ(1:2,0:NMAX), ANTE(0:NMAX), PRED(0:NMAX) REAL D(0:NMAX), TOT(0:NMAX), TARD(0:NMAX) DO I = 1, N IF (MARQ(2,I).EQ.K) THEN TARD(I) = TOT(I) GOTO 5 END IF END DO 5 DO I = K, 1, -1 DO J = 1, N IF (MARQ(2, J).NE.I) GOTO 20 DO I1 = PRED(J - 1) + 1, PRED(J) XTARD = INT(10. * (TARD(J) - D(ANTE(I1)))) / 10. IF (TARD(ANTE(I1)).EQ.0.) THEN TARD(ANTE(I1)) = XTARD; GOTO 10 END IF IF (TARD(ANTE(I1)) > XTARD) TARD(ANTE(I1)) = XTARD 10 END DO 20 END DO END DO RETURN END Subroutine EDates(N,D,TOT,TARD) !EDIT DATES parameter(NMAX=12) REAL D(0:NMAX), TOT(0:NMAX), TARD(0:NMAX) PRINT *,' CA = CRITICAL ACTIVITY' PRINT *,' SBD = SOONEST BEGIN DATE' PRINT *,' LBD = LATEST BEGIN DATE' PRINT *,' SED = SOONEST END DATE' PRINT *,' LED = LATEST END DATE' PRINT *,' ' DO I = 1, N FTA = TARD(I) + D(I); FOT = TOT(I) + D(I) XMT = TARD(I) - TOT(I) IF (XMT.EQ.0.) THEN WRITE(*,51) I, D(I) ELSE WRITE(*,50) I, D(I) END IF WRITE(*,60) TOT(I), TARD(I) WRITE(*,61) FOT, FTA WRITE(*,70) XMT PRINT *,' ' IF (MOD(I,3).NE.0.OR.I.EQ.N) GOTO 20 PAUSE ' ANY KEY TO CONTINUE... ' 20 END DO PAUSE ' ANY KEY TO CONTINUE... ' RETURN 50 FORMAT(' ACTIVITY #',I1,' PROBABLE DURATION: ',F5.2) 51 FORMAT(' ACTIVITY #',I1,' PROBABLE DURATION: ',F5.2,' * CA *') 60 FORMAT(' SBD = ',F5.2,' LBD = ',F5.2) 61 FORMAT(' SED = ',F5.2,' LED = ',F5.2) 70 FORMAT(' TOTAL MARGIN = ', F5.2) END Subroutine Gant(N,D,TOT,TARD) !GANT'S DIAGRAM parameter(NMAX=12) REAL D(0:NMAX), TARD(0:NMAX), TOT(0:NMAX) INTEGER Y LO = 35; MAXT = 0 PRINT *,' GANT''S DIAGRAM' PRINT *,' ' DO I = 1, N IF (TOT(I) + D(I) > MAXT) MAXT = TOT(I) + D(I) END DO IF (MAXT < LO) THEN X = 1.0; GOTO 100 END IF X = INT(10. * LO / MAXT) / 10.; Y = INT(1.0*MAXT/LO/X) 100 WRITE(*,300) Y PRINT *,'--------------------------------------------' DO I = 1, N - 1 L = INT(TOT(I) * X) DO J = 1, L+1 WRITE(*,310,advance='no') END DO L = INT(D(I) * X); IF (L.EQ.0) GOTO 170 DO J = 1, L WRITE(*,320,advance='no') END DO 170 L = INT((TARD(I) - TOT(I)) * X) IF (L.EQ.0) GOTO 200 DO J = 1, L WRITE(*,330,advance='no') END DO 200 WRITE(*,340) TARD(I) + D(I) END DO PRINT *,'--------------------------------------------' PRINT *,' * = PROBABLE DURATION + = TOTAL MARGIN' PRINT *,' ' RETURN 300 FORMAT(' THE SIGNS * OR + ARE WORTH', I2, ' TIME UNITS') 310 FORMAT(' ') 320 FORMAT('*') 330 FORMAT('+') 340 FORMAT(F4.0) END !end of file tpert.f90