10 REM INVSIM NADDOR JULY 74 15 DIM P(10),Q(10),R(12),X(200),Z(5) 20 DIM H$(4),I$(4),P$(2) 25 DEF FNU(Q)=U*INT(Q/U+.5) 30 D$="STOPARCOSDEMDETHEURAN---HELSIM" 32 P$="TZSQSZ" 34 P$(1)=" T S Z Q TOTAL/C" 36 P$(2)="### ### ### ### ####.##" 38 H$(1)="PER BEG DEM END OAO ORD REC " 40 I$(1)="### ### ### ### ### ### ### " 42 H$(2)="CARRY SHORT REPL " 44 I$(2)="###.# ###.# #.## " 46 H$(3)="C/C S/C R/C " 48 I$(3)="### ### ### " 50 H$(4)="TOTAL/C AVA/%" 52 I$(4)="####.## ###.#" 85 &:GOTO 300 90 IF ERR=28 THEN RESUME 100 92 & "ERL=";ERL;"ERR=";ERR;:RESUME 95 95 & "BAD DIRECTIVE" 100 &:& DATE$(0);" ";TIME$(0) 105 &"DIR,PO,T-S,Z-Q,HOR,DET,PRI"; 110 INPUT LINE Z$ 115 Z$=LEFT(Z$,LEN(Z$)-2) 120 IF Z$="" THEN 140 125 D=INSTR(1,D$,LEFT(Z$,3)) 130 IF D=0 THEN 95 135 D=1+(D-1)/3 140 V$=SYS(CHR$(6)+CHR$(-7)):ON ERROR GOTO 90 145 &:ON D GOTO 9999,200,300,400,500,500,700,800,900,1000 200 & "CARRY/C SHORT/C REPLE/C LEADTIME AVAIL/%" 205 & USING " ###.## ###.## ###.## ## ###.##",C1,C2,C3,L,A2 210 &:& "DEMAND"; 215 & USING " ### ",X; FOR X=X1 TO X9 STEP U 220 &:& "PROBAB"; 225 &USING " #.###",P(K); FOR K=1 TO K9 230 &:&:& USING "MEAN = ###.## S.D. = ###.##",X5,S5:GOTO 100 300 &"CAR,SHO,REP,LEA,AV%"; 305 INPUT LINE Z$ 310 Y9=5 315 GOSUB 9200 320 IF Z(1)>=0 THEN C1=Z(1) 325 IF Z(2)>=0 THEN C2=Z(2):A2=100*C2/(C1+C2) 330 IF Z(3)>=0 THEN C3=Z(3) 335 IF Z(4)>=0 THEN L=Z(4) 340 IF Z(5)>=0 THEN A2=Z(5):IF A2=100 THEN C2=999.99 ELSE C2=C1*A2/(100-A2) 345 IF D>0 THEN 100 400 &:&"MIN,MAX,STE";:INPUT LINE Z$ 405 Y9=3:GOSUB 9200:IF Z(2)FNU(X1) OR X9<>FNU(X9) THEN 400 430 K9=1+(X9-X1)/U 435 MAT Q=ZER(K9) 440 IF K9=1 THEN P(1)=1:X5=X1:S5=0:GOTO 495 445 &:& K9;"PROBS";:MAT INPUT P(K9) 450 X5,S5,F=0 455 FOR K=1 TO K9 460 F=F+P(K) 465 X5=X5+(K-1)*P(K) 470 S5=S5+(K-1)^2*P(K) 475 NEXT K 480 IF ABS(F-1)>.0001 THEN 445 485 S5=U*SQR(S5-X5^2) 490 X5=X1+X5*U 495 Z9=100:GOSUB 700:GOTO100 500 C5=C1*C2/(C1+C2) 505 T=SQR(2*C3/(X5*C5)):T=INT(T+.5):IF T=0 THEN T=1 510 Q=T*X5:Q=FNU(Q):IF Q=0 THEN Q=U 515 IF D=6 AND S5>0 THEN 600 520 Z=Q*C2/(C1+C2)+L*X5:IF Z<=FNU(Z) THEN Z=FNU(Z) ELSE Z=FNU(Z)+U 525 S=Z-Q 530 K0=C1*(Z-L*X5)^2/(2*Q)+C2*(S-L*X5)^2/(2*Q)+C3/T 535 & P$(1):& USING P$(2),T,S,Z,Q,K0 540 GOTO 100 600 V0=S5^2:IF X1=0 THEN P0=P(1) ELSE P0=0 605 IF A2<.1 OR A2>99.9 THEN N=3:GOTO 625 610 IF A2>50 THEN A6=1-A2/100 ELSE A6=A2/100 615 N6=SQR(-2*LOG(A6)) 620 N=N6-(2.308+.271*N6)/(1+.992*N6+.045*N6^2) 625 N=N*SGN(A2-50) 630 S1=SQR((L+T/3)*V0+(T*X5)^2/12+U^2*(1-P0^T)/6) 635 Z=(L+T/2)*X5+N*S1:Z=FNU(Z) 640 S2=SQR((L+1/3)*V0+(X5^2+Q^2+U^2)/12-U^2*P0/6) 645 S=(L+1/2)*X5+N*S2-(Q+U)/2:S=FNU(S) 650 M=EXP(-N^2/2)/SQR(2*PI) 655 I3=(1-P0^T)/T 660 K0=(C1+C2)*M*S1+C3*I3 665 & P$(1):& USING P$(2),T,S,Z,Q,K0 670 GOTO 100 700 MAT Q=P 705 F9=1 710 Z7=1/Z9 715 FOR J=1 TO Z9 720 R=F9*RND 725 F=Q(1) 730 FOR K=1 TO K9 735 IF F>R THEN 750 740 F=F+Q(K+1) 745 NEXT K 750 X(J)=X1+(K-1)*U 755 Q(K)=Q(K)-Z7 760 F9=F9-Z7 765 NEXT J 770 IF D=7 THEN 100 775 RETURN 900 &"DIRECTIVES:" 905 &"COSTS,DEMANDS,DETERMINISTIC,HELP" 910 &"HEURISTIC,PARAMETERS,RANDOM,SIMULATE,STOP" 915 GOTO 100 1000 Z$=Z$+",":GOSUB 9100:IF Z$="" THEN 1100 1005 GOSUB 9100:P=INSTR(1,P$,LEFT(T$,2)) 1010 IF P=0 OR Z$="" THEN 95 1015 P=1+(P-1)/2 1020 G0=0:GOSUB 9100 1025 GOSUB 9300:W1=Z(1):W2=Z(2) 1030 IF Z$="" THEN 1100 ELSE GOSUB 9100 1035 GOSUB 9300:H1=Z(1):H2=Z(2) 1040 IF Z$="" THEN 1100 ELSE GOSUB 9100 1045 Z8=VAL(T$):IF Z8<>Z9 THEN Z9=Z8:GOSUB 700 1050 IF Z$="" THEN 1100 ELSE GOSUB 9100 1055 D8=VAL(T$):IF Z$="" THEN 1100 ELSE GOSUB 9100 1060 P8=VAL(T$) 1100 IF D8<=0 THEN GOSUB 9500 1105 IF P=1 THEN W0=1:GOTO 1115 1110 W0=U:W1=FNU(W1):W2=FNU(W2) 1115 H1=FNU(H1):H2=FNU(H2) 1200 FOR W=W1 TO W2 STEP W0:T,S=W 1205 FOR H=H1 TO H2 STEP U:Z,Q=H 1210 J1,J2,J3,A4=0 1215 IF P=2 THEN E=S+Q ELSE E=Z 1220 MAT R=ZER(L+2) 1225 IF D8>0 THEN &:& H$(1);:GOSUB 9505 1300 FOR J=1 TO L+Z8 1305 B=E+R(1) 1310 X=X(J-Z9*INT((J-1)/Z9)) 1315 E=B-X 1320 IF E>=0 THEN I1=B-X/2:A=100 1325 IF B>0 AND E<0 THEN I1=B^2/2/X:A=100*B/X 1330 IF B<=0 THEN I1,A=0:IF B=0 AND E=0 THEN A=50 1335 I2=I1-B+X/2 1400 V=E:V=V+R(I) FOR I=2 TO L+1 1405 Y=0:ON P GOTO 1410,1415,1420 1410 IF J<>T*INT(J/T) THEN 1430 ELSE 1425 1415 IF V+Y>S THEN 1430 ELSE Y=Y+Q:GOTO 1415 1420 IF V>S THEN 1430 1425 Y=Z-V 1430 IF Y>0 THEN I3=1 ELSE I3=0 1435 R(L+2)=Y 1440 R(I)=R(I+1) FOR I=1 TO L+1 1500 IF J<=L THEN 1535 1505 J1=J1+I1 1510 J2=J2+I2 1515 J3=J3+I3 1520 A4=A4+A 1525 K1=C1*I1:K2=C2*I2:K3=C3*I3:K0=K1+K2+K3 1530 IF D8>0 AND J<=D8+L THEN GOSUB 9600 1535 NEXT J 1600 I1=J1/Z8:I2=J2/Z8:I3=J3/Z8:A=A4/Z8 1605 K1=C1*I1:K2=C2*I2:K3=C3*I3 1610 K0=K1+K2+K3 1615 IF D8>0 THEN GOSUB 9500 1620 GOSUB 9605 1700 NEXT H:NEXT W 1705 IF G0=1 THEN GOSUB 700:GOTO 1200 1710 GOTO 100 9100 G=INSTR(1,Z$,",") 9105 T$=LEFT(Z$,G-1) 9110 Z$=RIGHT(Z$,G+1):RETURN 9200 Z$=LEFT(Z$,LEN(Z$)-2):Z$=Z$+"," 9205 MAT Z=CON(Y9) 9210 MAT Z=(-1)*Z 9215 FOR Y=1 TO Y9 9220 IF Z$="" THEN 9245 9225 GOSUB 9100 9230 IF T$="" THEN 9240 9235 Z(Y)=VAL(T$) 9240 NEXT Y 9245 RETURN 9300 G=INSTR(2,T$,"-") 9305 IF G=0 THEN Z(1),Z(2)=VAL(T$):GOTO 9325 9310 Z(1)=VAL(LEFT(T$,G-1)) 9315 Z(2)=VAL(RIGHT(T$,G+1)) 9320 IF Z(1)=Z(2) THEN G0=1 9325 RETURN 9500 &:& USING " ! ! ",MID(P$,2*P-1,1),MID(P$,2*P,1); 9505 IF P8>0 THEN & H$(2); 9510 IF P8=2 THEN & H$(3); 9515 & H$(4) 9520 &:RETURN 9600 IF D8>0 THEN & USING I$(1),J-L,B,X,E,V,Y,R(1);:GOTO 9610 9605 & USING "### ### ",W,H; 9610 IF P8>0 THEN & USING I$(2),I1,I2,I3; 9615 IF P8=2 THEN & USING I$(3),K1,K2,K3; 9620 & USING I$(4),K0,A 9625 RETURN 9999 END