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)<Z(1) THEN 400
410 X1=Z(1)
415 X9=Z(2):IF X1=X9 THEN U=X1:GOTO 430
420 IF Z(3)<=0 THEN 400 ELSE U=Z(3)
425 IF X1<>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 
