10 !ECONOMIC ORDER QUANTITY MODEL COPYRIGHT ROY D HARRIS OCTOBER 1970 THIS VERSION WRITTEN FOR RSTS-11 BY ROD MISHLER 10/10/72 20 !R- - - ANNUAL USAGE REQUIREMENT, LEVEL DEMAND C- - - COST OF ONE PURCHASE ORDER F- - - HOLDING COST AS A PERCENTAGE OF UNIT PRICE 30 !P(0%)- PRICE OF EACH UNIT BEFORE DISCOUNT P(0%)=P0 P(1%)- PRICE OF EACH UNIT AT FIRST DISCOUNT BREAK POINT P(2%)- PRICE OF EACH UNIT AFTER FIRST DISCOUNT P(2%)=P1 40 !P(3%)- PRICE OF EACUNIT AT SECOND DISCOUNT BREAK POINT P(4%)- PRICE OF EACH UNIT AFTER SECOUND DISCOUNT P(4%)=P2 P(5%)- PRICE OF EACH UNIT AT WAREHOUSE CAPACITY RESTRAINT 50 !Q- - - ECONOMIC ORDER QUANTITY B(0%)- FIRST DISCOUNT BREAK POINT B(0%)=B0 B(1%)- SECOND DISCOUNT BREAK POINT B(1%)=B1 60 !S- - - SHORTAGE COST W- - - MAXIMUM WAREHOUSE SPACE AVAILABLE T- - - TOTAL COST AT EOQ 70 !N- - - NUMBER OF ORDERS PER YEAR AT EOQ Q(0%)- EOQ AT P(0%) Q(2%)-OQ AT P(2%) 80 !Q(4%)- EOQ AT P(4%) Q(1%)- B(0%) Q(3%)- B(1%) 90 !Q(5%)- W FOR S=0 Q(5%)=OPTIMUM ORDER AT E(5%)=W FOR S NOT= 0 T(I%)- TOTAL COST AT Q(I%) AND S(I%) FOR I%=0%TO5% E(5%)- MOST EXONOMICAL INVENTORY LEVEL AT EOQ=Q(I%) I%=0%TO4% 100 !E(5%) W E - - OPTIMAL INVENTORY WHEN S<>0 110 DIM A$(0%),B$(0%),A(9%),B(2%),E(5%),P(5%),Q(5%),T(5%) :C$=" ###### ###.## .### ###.## ###.## ###### ###.## ###### ###.## ######" :D$="######.##" :E$$$####.##" 120 ON ERROR GOTO 1470 130 INPUT"YOUR NAME PLEASE";A$ 140 INPUT"DO YOU DESIRE INSTRUCTIONS";B$ :PRINT 150 IF LEFT(B$,2)="NO" THEN 240 ELSE IF LEFT(B$,3)="YES" THEN 170 160 PRINT"YES OR NO, PLEASE" :GOTO140 170 PRINT"THIS IS A MODEL FOR INVENTORY ORDERING POLICY WHICH COMPUTES THE" :PRINT"MOST ECONOMICAL INVENTORY ORDER QUANTITY UNDER A VARIETY OF" :PRINT"CONDITIONS. A BASIC ASSUMPTION OF THIS MODEL IS THAT CONSUMPTION" 180 PRINT"IS CONSTANT OVER TIME AND TH IT IS POSSIBLE TO REPLENISH" :PRINT"INVENTORY ON VERY SHORT NOTICE." :PRINT :PRINT"HOLDING COSTS MUST BE ENTERED AS A PERCENTAGE OF THE UNIT" 190 PRINT"VALUE OF INVENTORY. IE 10% ENTERED AS .1" :PRINT"OTHER COSTS MUST BE ENTERED AS A DOLLAR AMT. IE $1.47 AS 1.47" :PRINT"USAGE, QUANTITY AND WAREHOUSE SPACE MUST BE ENTERED AS UNITS." 200 PRINT"IF THERE IS NO LIMIT TO WAREHOUSE SPACE ENTER 0." :PRINT 210 INPUT"DO YOU DESIRE A SAMPLE RUN";B$ :PRINT 220 IF LEFT(B$,2)NO" THEN 240 ELSE IF LEFT(B$,3)="YES" THEN 230 ELSE PRINT"YES OR NO, PLEASE." :GOTO210 230 R=1600 :C=5 :F=.1 :P(0%)=1 :B(0%)=300 :P(2%)=.9 :B(1%)=2000 :P(4%)=.8 :GOTO 480 240 P(2%),B(1%),P(4%)=0 250 INPUT"ANNUAL USAGE REQUIREMENT OF ITEM";R 260 IF R>=0 THEN 270 ELSE PRINT"MUST BE GREATER THAN 0." :GOTO 240 270 INPUT"ORDERING COST";C 280 IF C>=0 THEN 290 ELSE PRINT"MUST BE GREATER THAN 0." :GOTO270 290 INPUT"HOLDING COST";F 300 IF F<1 AND F>=0 THEN 310 ELSE PRINT"MT BE A %, PLEASE." :GOTO290 310 INPUT"UNIT PRICE";P(0%) 320 IF P(0%)>0 THEN 330 ELSE PRINT"MUST BE GREATER THAN 0." :GOTO310 330 INPUT"SHORTAGE COST";S 340 IF S>=0 THEN 350 ELSE PRINT"MUST BE > OR = 0, PLEASE." :GOTO330 350 INPUT"MINIMUM ORDER QUANTITY - FIRST PRICE DISCOUNT";B(0%) 360 IF B(0%)=0 THEN 460 370 IF B(0%)>0 THEN 380 ELSE PRINT"MUST BE = OR <0, PLEASE." :GOTO350 380 INPUT"UNIT PRICE - FIRST PRICE DISCOUNT";P(2%) 390 IF P(2%)>0 THEN 400 ELSE PRINT"MUST BE GREATER TH 0." :GOTO380 400 INPUT"MINIMUM ORDER QUANTITY - SECOND PRICE DISCOUNT";B(1%) 410 IF B(1%)=0 THEN 460 420 IF B(1%)>0 THEN 430 ELSE PRINT"MUST BE = OR >0, PLEASE." :GOTO400 430 IF B(1%)>=B(0%) THEN 440 ELSE PRINT"MUST BE = OR >"; :PRINT"FIRST PRICE DISCOUNT ORDER QUANTITY." 440 INPUT"UNIT PRICE - SECOND PRICE DISCOUNT";P(4%) 450 IF P(4%)>0 THEN 460 ELSE PRINT"MUST BE GREATER THAN 0." :GOTO440 460 INPUT"MAXIMUM WAREHOUSE SPACE AVAILABLE";W 470 IF W>=0 THEN 480 ELSE PRINT"MUSBE > OR = 0, PLEASE." :GOTO460 480 OPEN "KB:" FOR OUTPUT AS FILE 1 :PRINT#1 FOR I=1%TO4% 490 PRINT#1,"PROGRAM EOQ FOR ";A$,DATE$(0) :PRINT#1 :PRINT#1,"INPUT DATA IS:" :PRINT#1," ANNUAL ORDER HOLD UNIT"; :PRINT#1," SHORT MIN PRICE MIN PRICE MAX" 500 PRINT#1," USAGE COST COST PRICE COST ORD-1 DIS-1 ORD-2 "; :PRINT#1"DIS-2 WAREH" :PRINT#1,USING C$,R,C,F,P(0%),S,B(0%),P(2%),B(1%),P(4%),W 510 IF B(1%)<>0 THEN 540 ELSE IF B(0%)<>0 THEN 530 520 B(0%)=1E25 :P(2%)=P(0%) 530 B(1%)=1E25 :P(4%)=P(2%) 540 IF W=0 THEN W=1E25 550 B(2%)=W 560 P(3%)=P(4%) :P(1%)=P(2%) 570 IF P(4%)-P(2%)<=0 THEN 590 580 P(3%)=P(2%) 590 IF P(2%)-P(0%)<=0 THEN 610 600 P(1%)=P(0%) 610 P(5%)=P(1%) 620 IF W0 THEN 1200 700 Q(I%)=SQR(2*C*R/(F*P(I%))) FOR I%=0%TO4% STEP2% 710 FOR I%=0%TO5% 720 IF Q(I%)=1E25 THEN 740 730 T(I%)=(C*R/Q(I%)+P(I%)*R+P(I%)*F*Q(I%)/2) :GOTO750 740 T(I%)=1E25 750 NEXT I% 760 E(I%)=Q(I%) FOR I%=0%TO5% 770 IF Q(0%)<=Q(1%) GOTO790 780 T(0%)=1E25 790 IF Q(1%)>Q(2%) THEN 810 800 IF Q(2%)<=Q(3%) GOTO820 810 T(2%)=1E25 820 IF Q(3%)<=Q(4%) GOTO840 830 T(4%)=1E25 840 K%=1% :T=T(0%) :Q=Q(0%) :E=E(0%) 850 FOR I%=0%TO4% 860 IF T-I%)<=0 THEN 880 870 T=T(I%) :K%=I% :Q=Q(I%) :E=E(I%) 880 NEXT I% 890 N=R/Q 900 GOSUB1390 910 IF W=1E25 THEN930 920 PRINT#1,"BEFORE WAREHOUSE STORAGE LIMITATION IS APPLIED" 930 GOSUB1400 940 IF S=0 THEN 960 950 GOSUB1430 960 GOSUB1410 970 IF W=1E25 THEN 1440 980 FOR I%=0%TO4% 990 IF E(I%)<=W THEN 1010 1000 T(I%)=1E25 1010 NEXT I% 1020 IF T(K%)-1E25=0 THEN 1040 1030 PRINT#1,"THE WAREHOUSE LIMITATION HAD NO EFFECT ON EOQ." :GOTO1440 1040 K%=1% :T=T(0%:Q=Q(0%) :E=E(0%) 1050 FOR I%=0%TO5% 1060 IF T-T(I%)<=0 THEN 1080 1070 T=T(I%) :Q=Q(I%) :K%=I% :E=E(I%) 1080 NEXT I% 1090 N=R/Q :PRINT#1 1100 PRINT#1,"THE ORDER QUANTITY IS LIMITED BY THE WAREHOUSE SPACE" :PRINT#1,"RESTRICTION AND IS NOT AT AN OPTIMUM. LOOSEN THE" :PRINT#1,"RESTRICTION AND RUN AGAIN, OBSERVING THE EFFECT." 1110 GOSUB1390 1120 PRINT#1,"AFTER THE WAREHOUSE STORAGE LIMITATION IS APPLIED" 1130 GOSUB1400 1140 IF S=0 THEN 1160 1150 GOSUB1430 1160 GOSUB1410 1170 IF K%<>5% THEN 1440 1180 PRINT#1,"THIS ORDER QUANTITY IS AT THE MAXIMUM WAREHOUSE CAPACITY." 1190 GOTO 1440 1200 E(5%)=Q(5%) 1210 FOR I%=0%TO4%STEP2% 1220 E(I%)=SQR(2%*C*R*S/(F*P(I%)*(F*P(I%)+S))) 1230 Q(I%)=SQR((2%*C*R*(F*P(I%)+S))/(F*P(I%)*S)) 1240 NEXT I% 1250 FOR I%=1%TO3% STEP 2% 1260 IF Q(I%)<>1E25 THEN 1280 1270 E(I%)=1E25 :GOTO1290 1280 E(I%)=(Q(I%)*S)/(P(I%)*F+S) 1290 NEXT I% 1300 IF E(5%)=1E25 THEN 1320 1310 Q(5%)=SQR((2*C*R+E(5%2*(S+P(5%)*F))/S) 1320 FOR I%=0%TO5% 1330 IF Q(I%)=1E25 THEN 1360 1340 T(I%)=(C*R/Q(I%)+F*P(I%)*E(I%)^2/(2*Q(I%))+R*P(I%)+(S*(Q(I%)-E(I%))^2)/(2*Q(I%))) 1350 GOTO1370 1360 T(I%)=1E25 1370 NEXT I% 1380 GOTO770 1390 PRINT#1 :PRINT#1,"ANALYSIS RESULTS ARE:" :RETURN 1400 PRINT#1,"OPTIMUM ORDER QUANTITY IS",, :PRINT#1,USING D$,Q :RETURN 1410 PRINT#1,"AT A PRICE PER ITEM OF",, :PRINT#1,USING E$,P(K%) :PRINT#1,"YIELDING A TOTAL INVENTORY COST OF", :PRINT#1,USING E$,T 14 PRINT#1,"WHERE NUMBER OF ORDER CYCLES PER YEAR IS", :PRINT#1,USING D$,N :RETURN 1430 PRINT#1,"WITH OPTIMUM INVENTORY OF",, :PRINT#1,USING D$,E :RETURN 1440 PRINT#1 FOR I=1%TO4% :CLOSE 1 1450 INPUT"DO YOU WISH TO RUN PROGRAM AGAIN";B$ 1460 IF LEFT(B$,3)="YES" THEN 240 ELSE IF LEFT(B$,2)="NO" THEN 1490 ELSE PRINT"YES OR NO, PLEASE." :GOTO1450 1470 IF ERR=8 THEN PRINT"WAITING FOR LINE PRINTER." ELSE ON ERROR GOTO0 1480 SLEEP(10) :RESUME 1490 END