home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / basic / cpm-pert.bas < prev    next >
BASIC Source File  |  1984-04-08  |  10KB  |  278 lines

  1. 10 REM CPM-PERT PROGRAM FROM INTERFACE AGE, FEB. 1981
  2. 12 REM WRITTEN BY RICHARD PARRY
  3. 14 REM ADAPTED TO MICROSOFT BASIC BY CHARLES H STROM
  4. 16 REM
  5. 17 REM NOTE: PRINTER OPERATION REQUIRES LOADING SETUP.ASM BEFORE MBASIC
  6. 18 REM *INITIALIZE NORMAL DISTRIBUTION CONSTANTS
  7. 20 RN=15: RS=SQR(3/RN)
  8. 25 CL$=CHR$(27)+CHR$(28): REM CHARACTER STRING TO HOME CURSOR & CLEAR SCREEN
  9. 30 REM **************
  10. 40 REM * INPUT DATA *
  11. 50 REM **************
  12. 55 PRINT CL$
  13. 60 INPUT "CPM or PERT Simulation (C/P) "; Q$
  14. 65 INPUT "Do you want a HARD-COPY record (Y/N)"; HC$: HC$=LEFT$(HC$,1)
  15. 66 IF HC$="Y"THEN PRINT "NOTE - SETUP.ASM MUST BE LOADED BEFORE MBASIC OR PRINTER WILL NOT FUNCTION!"
  16. 68 PRINT
  17. 70 INPUT "Number of Activities"; N
  18. 80 DIM ML(N), MO(N), MP(N), CP(N), ME(N), SD(N), IC(20)
  19. 90 DIM S(N), F(N), D(N), E(N), L(N), F1(N)
  20. 100 FOR I=1 TO N
  21. 110 PRINT CL$: PRINT "ACTIVITY"; I: PRINT
  22. 120  REM * GO TO INPUT DATA ROUTINE
  23. 130  GOSUB 1920
  24. 140 NEXT I
  25. 150 PRINT CL$: INPUT "Would you like to examine or edit the input data (Y/N)";Q1$
  26. 160 IF LEFT$(Q1$,1) = "N" THEN 430
  27. 170 REM *SORT INPUT DATA
  28. 180 GOSUB 2080
  29. 190 REM **********************
  30. 200 REM * DISPLAY INPUT DATA *
  31. 210 REM **********************
  32. 215 IF HC$="Y" THEN POKE 37,195
  33. 220 PRINT CL$: IF LEFT$(Q$,1)<>"C" THEN 280
  34. 230 PRINT "ACTIVITY #    FROM       TO     DURATION"
  35. 240 FOR I = 1 TO N
  36. 250  PRINT TAB(5); I; TAB(15); S(I); TAB(25); F(I); TAB(35); D(I)
  37. 260 NEXT I
  38. 270 GOTO 340
  39. 280 PRINT "ACTIVITY #    FROM       TO        ML       MO        MP"
  40. 290 FOR I = 1 TO N
  41. 300  PRINT TAB(5); I; TAB(15); S(I); TAB(25); F(I);
  42. 310  PRINT TAB(35); ML(I); TAB(45); MO(I); TAB(55); MP(I)
  43. 320 NEXT I
  44. 330 PRINT
  45. 340 POKE 37,201:PRINT: INPUT "Would you like to edit an activity (Y/N)"; Q1$
  46. 350 IF LEFT$(Q1$,1) = "N" THEN 430
  47. 360 REM * EDIT MODE
  48. 370 PRINT: INPUT "What activity needs alteration (0 to end)"; I
  49. 380 IF I=0 THEN 150
  50. 390 REM * GO TO INPUT DATA ROUTINE
  51. 400 GOSUB 1920
  52. 410 GOTO 370
  53. 420 REM * GO TO SORT ROUTINE
  54. 430 GOSUB 2080
  55. 440 IF LEFT$(Q$,1) <>"C" THEN 760
  56. 450 REM ***********************************************************
  57. 460 REM * CRITICAL PATH ANALYSIS REQUESTED. PERFORM CRITICAL PATH *
  58. 470 REM * ANALYSIS ONCE AND DISPLAY RESULTS.                      *
  59. 480 REM ***********************************************************
  60. 490 GOSUB 2340
  61. 500 C2=0
  62. 505 IF HC$="Y" THEN POKE 37,195
  63. 510 PRINT CL$: PRINT "CP ANALYSIS IS:"
  64. 520 PRINT: PRINT: PRINT "FROM","TO","EST","LFT","FLOAT": PRINT
  65. 530 FOR I = 1 TO N
  66. 540  PRINT S(I),F(I),E(S(I)),L(F(I)),F1(I)
  67. 550 NEXT I
  68. 560 PRINT "THE CRITICAL PATH LENGTH IS ";PL
  69. 570 PRINT: PRINT "THE CRITICAL PATH IS:": PRINT"FROM","TO": PRINT
  70. 580 FOR I = 1 TO N
  71. 590  IF F1(I) = 0 THEN 610
  72. 600 NEXT I
  73. 610 PRINT S(I),F(I): C2=C2+1: IF I>N THEN 650
  74. 620 FOR M= 1 TO N
  75. 630  IF S(M)=F(I) AND F1(M) = 0 THEN I=M: GOTO 610
  76. 640 NEXT M
  77. 650 IF C1<>C2 THEN PRINT: PRINT "THERE IS MORE THAN ONE CRITICAL PATH"
  78. 660 PRINT: POKE 37,201
  79. 670 INPUT "Would you like to edit an activity or stop program (E/S)"; Q1$
  80. 680 IF LEFT$(Q1$,1) = "E" THEN PRINT: GOTO 220:
  81. 690 END
  82. 700 REM *****************************************************************
  83. 710 REM * PERT SIMULATION REQUESTED. PERFORM CRITICAL PATH ANALYSIS THE *
  84. 720 REM * NUMBER OF TIMES SPECIFIED. STORE PATH LENGTHS AND INCREMENT   *
  85. 730 REM * ACTIVITIES WHICH APPEAR ON CRITICAL PATH. CONSTRUCT HISTOGRAM *
  86. 740 REM * AND DISPLAY RESULTS.                                          *
  87. 750 REM *****************************************************************
  88. 760 FOR I = 1 TO N
  89. 770  REM * COMPUTE MEAN OF EACH ACTIVITY
  90. 780  ME(I) = (MO(I)+4*ML(I)+MP(I))/6
  91. 790  REM * COMPUTE STANDARD DEVIATION OF EACH ACTIVITY
  92. 800  SD(I) = (MP(I)-MO(I))/6
  93. 810 NEXT I
  94. 820 REM * COMPUTE MOST OPTIMISTIC PATH LENGTH
  95. 830 DU=0: FOR I=1 TO N: CP(I)=0: E(I)=0: L(I)=0: NEXT I
  96. 840 FOR I = 1 TO N
  97. 850  D(I)=MO(I)
  98. 860 NEXT I
  99. 870 GOSUB 2340
  100. 880 BC=PL
  101. 890 REM * COMPUTE MOST PESSIMISTIC PATH LENGTH
  102. 900 DU=0: FOR I=1 TO N: CP(I)=0: E(I)=0: L(I)=0: NEXT I
  103. 910 FOR I = 1 TO N
  104. 920  D(I)=MP(I)
  105. 930 NEXT I
  106. 940 GOSUB 2340
  107. 950 WC=PL
  108. 960 REM * INITIALIZ KEY VARIABLES
  109. 970 DU=0: FOR I = 1 TO N: CP(I)=0: E(I)=0: L(I)=0: NEXT I
  110. 980 LS=0: HS=0: FOR I=1 TO 20: IC(I)=0: NEXT I
  111. 990 REM * INITIALIZE RANDOM NUMBER GENERATOR
  112. 1000 RANDOMIZE
  113. 1010 REM * PROPOSE # OF TRANSACTIONS AS 20 TIMES # OF ACTIVITIES
  114. 1020 PRINT "Number of transactions should be >= "; 20*N
  115. 1030 INPUT "Number of transactions"; NS
  116. 1040 PRINT: PRINT "++SIMULATION IN PROGRESS++"
  117. 1050 REM ***********************
  118. 1060 REM * CONSTRUCT HISTOGRAM *
  119. 1070 REM ***********************
  120. 1080 REM * SET APPROPRIATE INTERVAL (I.E. INTEGER >=1)
  121. 1090 LL=INT(BC)
  122. 1100 IF WC-BC<=20 THEN IN=1
  123. 1110 IN=INT((WC-BC)/20)+1
  124. 1120 REM **********************
  125. 1130 REM * PERFORM SIMULATION *
  126. 1140 REM **********************
  127. 1150 TC=100
  128. 1160 FOR K=1 TO NS
  129. 1170  IF K=TC THEN PRINT "++SIMULATION IN PROGRESS++", TC: TC=TC+100
  130. 1180  FOR J=1 TO N
  131. 1190   S=0: E(J)=0: L(J)=0
  132. 1200   IF ML(J)=0 THEN D(J)=0: GOTO 1250
  133. 1210   FOR I=1 TO RN
  134. 1220    S=S+2*RND-1
  135. 1230   NEXT I
  136. 1240   D(J)=ME(J)+SD(J)*S*RS
  137. 1250  NEXT J
  138. 1260  GOSUB 2340
  139. 1270  REM * FIND INTERVAL FOR THIS PATH LENGTH
  140. 1280  I3=(PL-LL)/IN+2
  141. 1290  IF I3<1 THEN LS=LS+1: GOTO 1330
  142. 1300  IF I3>20 THEN HS=HS+1: GOTO 1330
  143. 1310  I3=INT(I3)
  144. 1320  IC(I3)=IC(I3)+1
  145. 1330 NEXT K
  146. 1340 REM **************************************
  147. 1350 REM * PRINT FREQUENCY DISTRIBUTION TABLE *
  148. 1360 REM **************************************
  149. 1365 IF HC$="Y" THEN POKE 37,195
  150. 1370 PRINT CL$: PRINT "++FREQUENCY DISTRIBUTION TABLE++": PRINT
  151. 1380 PRINT "Most OPTIMISTIC  path length"; BC
  152. 1390 PRINT "Most PESSIMISTIC path length"; WC
  153. 1400 PRINT "Number of transactions LOWER  than histogram range ";LS
  154. 1410 PRINT "Number of transactions HIGHER than histogram range ";HS: PRINT
  155. 1420 PRINT "     INTERVAL      FREQ.      PCT."
  156. 1430 I1=LL-IN: I2=LL
  157. 1440 FOR M=1 TO 20
  158. 1450  PRINT"=>";I1;"<";I2;TAB(20);IC(M);TAB(30);INT(.5+100*IC(M)/NS)
  159. 1460  I1=I1+IN: I2=I2+IN
  160. 1470 NEXT M
  161. 1480 REM *******************
  162. 1490 REM * PRINT HISTOGRAM *
  163. 1500 REM *******************
  164. 1510 REM * COMPUTE HISTOGRAM SCALE FACTOR
  165. 1520 SC=0: LO=18: J=0: LL=INT(BC)
  166. 1530 FOR M=1 TO 20
  167. 1540  IF IC(M)>SC THEN SC=IC(M)
  168. 1550 NEXT M
  169. 1560 SC=50/SC
  170. 1570 X$="PATH LENGTH"
  171. 1580 PRINT: PRINT: PRINT TAB(24); "++ HISTOGRAM ++": PRINT
  172. 1590 PRINT TAB(18);"RELATIVE FREQUENCY OF PATH LENGTHS"
  173. 1600 PRINT TAB(LO); "+------------------------------------------------+"
  174. 1610 FOR M=1 TO 20
  175. 1620  HM=IC(M)*SC
  176. 1630  FOR K=1 TO 3
  177. 1640   J=J+1: PRINT MID$(X$,J,1);TAB(2);
  178. 1650   IF K=2 THEN PRINT ">=";LL-IN;"<";LL;: LL=LL+IN
  179. 1660   PRINT TAB(LO);
  180. 1670   IF IC(M)=0 THEN PRINT: GOTO 1720
  181. 1680   FOR I=1 TO HM
  182. 1690    PRINT "*";
  183. 1700   NEXT I
  184. 1710   PRINT
  185. 1720  NEXT K
  186. 1730 NEXT M
  187. 1740 REM ***************************
  188. 1750 REM * PRINT ACTIVITY ANALYSIS *
  189. 1760 REM ***************************
  190. 1770 PRINT: PRINT
  191. 1780 PRINT TAB(10); "+++ CP ACTIVITY ANALYSIS TABLE +++": PRINT
  192. 1790 PRINT "ACTIVITY #    FROM      TO     CP FREQ.    PCT."
  193. 1800 FOR I=1 TO N
  194. 1810  PRINT TAB(5);I;TAB(15);S(I);TAB(25);F(I);
  195. 1820  PRINT TAB(35);CP(I);TAB(45);INT(.5+100*CP(I)/NS)
  196. 1830 NEXT I
  197. 1840 PRINT: PRINT "DUPLICATE critical paths occurred";DU;"times."
  198. 1850 PRINT: POKE 37,201
  199. 1860 INPUT "Would you like to edit an activity or stop program (E/S)"; Q1$
  200. 1870 IF LEFT$(Q1$,1)="E" THEN PRINT: GOTO 220
  201. 1880 END
  202. 1890 REM **********************
  203. 1900 REM * INPUT DATA ROUTINE *
  204. 1910 REM **********************
  205. 1920 INPUT "FROM";S(I)
  206. 1930 INPUT "TO";F(I)
  207. 1940 IF F(I)>N THEN PRINT "++END NODE # NOT <= # OF ACTIVITIES++":GOTO 1930
  208. 1950 IF S(I)>F(I) THEN PRINT "++START NODE MUST BE < END NODE++":GOTO 1920
  209. 1960 IF LEFT$(Q$,1)="C" THEN INPUT "DURATION";D(I): GOTO 2040
  210. 1970 INPUT "MOST LIKELY";ML(I)
  211. 1980 REM * CHECK FOR DUMMY ACTIVITY
  212. 1990 IF ML(I)=0 THEN MO(I)=0: MP(I)=0: GOTO 2040
  213. 2000 INPUT "MOST OPTIMISTIC"; MO(I)
  214. 2010 IF MO(I)>ML(I) THEN PRINT "++MO MUST BE <= ML++": GOTO 2000
  215. 2020 INPUT "MOST PESSIMISTIC"; MP(I)
  216. 2030 IF MP(I)<ML(I) THEN PRINT "++MP MUST BE >= ML++": GOTO 2020
  217. 2040 RETURN
  218. 2050 REM *************************************
  219. 2060 REM * SORT DATA USING START NODE AS KEY *
  220. 2070 REM *************************************
  221. 2080 PRINT: PRINT "SORTING IN PROGRESS": PRINT
  222. 2090 SW=0
  223. 2100 FOR I=1 TO N-1
  224. 2110  J=I+1
  225. 2120 IF S(I)<=S(J) THEN 2200
  226. 2130  EX=S(I): S(I)=S(J): S(J)=EX
  227. 2140  EX=F(I): F(I)=F(J): F(J)=EX
  228. 2150  EX=D(I): D(I)=D(J): D(J)=EX
  229. 2160  EX=ML(I): ML(I)=ML(J): ML(J)=EX
  230. 2170  EX=MO(I): MO(I)=MO(J): MO(J)=EX
  231. 2180  EX=MP(I): MP(I)=MP(J): MP(J)=EX
  232. 2190  SW=1
  233. 2200 NEXT I
  234. 2210 IF SW=1 THEN 2090
  235. 2220 RETURN
  236. 2230 REM *************************************************************
  237. 2240 REM * THE FOLLOWING SUBROUTINE IS USED BY BOTH THE CPM ANALYSIS *
  238. 2250 REM * AS WELL AS THE PERT SIMULATION ANALYSIS.  WHILE THE CPM   *
  239. 2260 REM * ANALYSIS CALLS THE ROUTINE ONLY ONCE,  THE SIMULATION     *
  240. 2270 REM * CALLS THE ROUTINE THE NUMBER OF TIMES REQUESTED BY THE    *
  241. 2280 REM * USER.  THE EARLIEST, LATEST, AND FLOAT TIMES ARE COMPUTED *
  242. 2290 REM * AND FROM THIS DATA THE CRITICAL PATH LENGTH AND CRITICAL  *
  243. 2300 REM * PATH ARE CALCULATED.  DUPLICATE CRITICAL PATHS ARE ONLY   *
  244. 2310 REM * COUNTED ONCE.                                             *
  245. 2320 REM *************************************************************
  246. 2330 REM * COMPUTE EARLIEST STARTING TIME
  247. 2340 C1=0: C2=0: PL=0
  248. 2350 FOR I=1 TO N
  249. 2360  M1=E(S(I))+D(I)
  250. 2370  IF E(F(I))<=M1 THEN E(F(I))=M1
  251. 2380 NEXT I
  252. 2390 REM * COMPUTE LATEST FINISHING TIME
  253. 2400 L(F(N))=E(F(N))
  254. 2410 FOR I=N TO 1 STEP -1
  255. 2420  L1=S(I): M2=L(F(I))-D(I)
  256. 2430  IF L(L1)>=M2 OR L(L1)=0 THEN L(L1)=M2
  257. 2440 NEXT I
  258. 2450 REM * COMPUTE FLOAT TIME
  259. 2460 FOR I=1 TO N
  260. 2470  F1(I)=L(F(I))-E(S(I))-D(I)
  261. 2480  IF F1(I)<.0001 THEN F1(I)=0: C1=C1+1
  262. 2490 NEXT I
  263. 2500 REM * COMPUTE CRITICAL PATH LENGTH
  264. 2510 FOR I=1 TO N
  265. 2520  IF L(F(I))>PL THEN PL=L(F(I))
  266. 2530 NEXT I
  267. 2540 REM * COMPUTE CRITICAL PATH
  268. 2550 FOR I=1 TO N
  269. 2560  IF F1(I)=0 THEN 2580
  270. 2570 NEXT I
  271. 2580 C2=C2+1: CP(I)=CP(I)+1
  272. 2590 IF I>N THEN 2630
  273. 2600 FOR M=1 TO N
  274. 2610  IF S(M)=F(I) AND F1(M)=0 THEN I=M: GOTO 2580
  275. 2620 NEXT M
  276. 2630 IF C1<>C2 THEN DU=DU+1
  277. 2640 RETURN
  278.