/******************************************************** '* 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 * '* IANTE : 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 * '* LO : MAXIMUM WIDTH OG GANT'S DIAGRAM * '* MAXT : 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 * '* * '* NUMBER OF PRECEDING ACTIVITIES ? 11 * '* * '* 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. * '* * '* C++ Release 1.0 By J-P Moreau, Paris. * '* (www.jpmoreau.fr) * '******************************************************** NOTE: PERT is an acronym for Program Evaluation & Review Technique. PROGRAM TPERT */ #include #include #define NMAX 12 int K, N, NA; double D[NMAX], TOT[NMAX], TARD[NMAX]; int ANTE[NMAX], PRED[NMAX]; int MARQ[3][NMAX]; double XTOT,XTARD; void Data() { //DESCRIBE ACTIVITIES int I,IANTE,J; double DE,DOP,DP; printf("\n TIME PERT MODEL\n"); printf(" ACTIVITY DESCRIPTION\n\n"); printf(" NUMBER OF ACTIVITIES ? "); scanf("%d", &N); printf("\n NUMBER OF PRECEDING ACTIVITIES ? "); scanf("%d", &NA); printf("\n"); PRED[0]=0; ANTE[0]=0; ANTE[1]=0; for (I=1; I<=N; I++) { printf(" ACTIVITY #%d:\n", I); printf(" ESTIMATED DURATION ? "); scanf("%lf", &DE); printf(" OPTIMISTIC DURATION ? "); scanf("%lf", &DOP); printf(" PESSIMISTIC DURATION ? "); scanf("%lf", &DP); D[I] = ceil(10 * (DOP + 4 * DE + DP) / 6) / 10; printf(" NUMBER OF PRECEDING ACTIVITIES ? "); scanf("%d", &IANTE); if (IANTE == 0) { IANTE = 1; goto e20; } for (J=1; J<=IANTE; J++) { printf(" PREC. ACTIVITY #%d ? ", J); scanf("%d", &ANTE[PRED[I-1]+J]); } e20: printf("\n"); PRED[I] = PRED[I-1] + IANTE; } printf("\n TIME PERT MODEL\n"); printf(" RESULTS\n\n"); } void Level() { //Determine Level int F,I,J,R; MARQ[2][0] = 1; for (I=1; I<=N; I++) { K++; for (J=1; J<=N; J++) { if (MARQ[2][J] != 0) goto e30; for (R=PRED[J-1]+1; R<=PRED[J]; R++) if (MARQ[2][ANTE[R]] == 0) F = 1; if (F == 1) {F = 0; goto e30; } for (R=PRED[J-1]+1; R<=PRED[I]; R++) MARQ[1][J] = K; e30: ;} for (J=1; J<=N; J++) if (MARQ[1][J] == K) MARQ[2][J] = K; } K = MARQ[2][1]; for (I=1; I<=N; I++) if (MARQ[2][I] > K) K = MARQ[2][I]; } void SDates() { //SOONEST DATES int I,I1,J; for (I=1; I<=K; I++) for (J=1; J<=N; J++) { if (MARQ[2][J] != I) goto e10; for (I1=PRED[J-1]+1; I1<=PRED[J]; I1++) { XTOT = int(10 * (TOT[ANTE[I1]] + D[ANTE[I1]])) / 10; if (TOT[J] == 0) TOT[J] = XTOT; if (XTOT > TOT[J]) TOT[J] = XTOT; } e10: ;} } void LDates() { //LATEST DATES //Labels: e10, e20 int I,I1,J; for (I=1; I<=N; I++) if (MARQ[2][I] == K) { TARD[I] = TOT[I]; I = N; } for (I=K; I>0; I--) { for (J=1; J<=N; J++) { if (MARQ[2][J] != I) goto e20; for (I1=PRED[J-1]+1; I1<=PRED[J]; I1++) { XTARD = int(10 * (TARD[J] - D[ANTE[I1]])) / 10; if (TARD[ANTE[I1]] == 0) { TARD[ANTE[I1]] = XTARD; goto e10; } if (TARD[ANTE[I1]] > XTARD) TARD[ANTE[I1]] = XTARD; e10: ; } e20:; } } } void pause() { char s[2]; printf(" Any key + Enter to continue... "); scanf("%s", s); printf("\n"); } void EDates() { //EDIT DATES //Labels: e20, e30 int I; double FOT,FTA,XMT; printf(" CA = CRITICAL ACTIVITY\n"); printf(" SBD = SOONEST BEGIN DATE\n"); printf(" LBD = LATEST BEGIN DATE\n"); printf(" SED = SOONEST END DATE\n"); printf(" LED = LATEST END DATE\n\n"); for (I=1; I<=N; I++) { printf(" ACTIVITY #%d PROBABLE DURATION: %4.0f", I, D[I]); FTA = TARD[I] + D[I]; FOT = TOT[I] + D[I]; XMT = TARD[I] - TOT[I]; if (XMT == 0) {printf(" * CA *\n"); goto e20;} printf("\n"); e20: printf(" SBD = %4.0f LBD = %4.0f\n", TOT[I], TARD[I]); printf(" SED = %4.0f LED = %4.0f\n", FOT, FTA); printf(" TOTAL MARGIN = %4.0f\n\n", XMT); if ((I % 3) != 0 || I == N) goto e30; pause(); e30:;} pause(); } void Gant() { //GANT'S DIAGRAM //Labels: e100, e170, e200 int XLO, XMAXT, Y; int I, J, L; double X; XLO = 35; XMAXT = 0; printf(" GANT'S DIAGRAM\n\n"); for (I=1; I<=N; I++) if (TOT[I] + D[I] > XMAXT) XMAXT = (int) (floor(TOT[I] + D[I])); if (XMAXT < XLO) { X = 1; goto e100; } X = floor(10*XLO / XMAXT)/10; Y = (int) (floor((XMAXT / XLO) / X)); e100:printf(" THE SIGNS * OR + ARE WORTH %d TIME UNITS\n", Y); for (I=1; I<=floor(XLO + 8); I++) printf("-"); printf("\n");; for (I=1; I<=N-1; I++) { L = (int) (floor(TOT[I] * X)); for (J=1; J<=L; J++) printf(" "); L = (int) (floor(D[I] * X)); if (L == 0) goto e170; for (J=1; J<=L; J++) printf("*"); e170: L = (int) (floor((TARD[I] - TOT[I]) * X)); if (L == 0) goto e200; for (J=1; J<=L; J++) printf("+"); e200: printf("%4.0f\n", TARD[I]+D[I]); } for (I=1; I<=floor(XLO + 8); I++) printf("-"); printf("\n * = PROBABLE DURATION + = TOTAL MARGIN\n\n"); } void main() { Data(); //DESCRIBE ACTIVITIES Level(); //DETERMINE LEVEL SDates(); //SOONEST DATES LDates(); //LATEST DATES EDates(); //EDIT DATES Gant(); //GANT'S DIAGRAM } // end of file tpert.cpp