In a previous post I showed how to write and solve a unit loss function G(k). Here I show how to use it.
Here I solve some (s,Q) inventory models. These models have a variable Q: order quantity. It is sometimes argued to use the EOQ order quantity for this. EOQ stands for Economic Order Quantity. In the model I try to see how much difference it makes when we use this EOQ or just solve for Q in the (s,Q) models directly.
The results are:
---- 155 PARAMETER results
EOQ Qendog Qeoq
EOQ .Q 5200.000
CSEO.Q 5876.746 5200.000
CSEO.Total Cost 6337360.618 6337934.428
CSEO.Inv+Short Cost 137360.618 137934.428
CSEO.s 5658.711 5749.015
CSEO.k 2.094 2.152
CIS .Q 5846.467 5200.000
CIS .Total Cost 6331413.493 6331942.157
CIS .Inv+Short Cost 131413.493 131942.157
CIS .s 5292.515 5373.301
CIS .k 1.860 1.912
We can see for two inventory models (Cost per Stockout Event – CSOE and Cost per Item Short – CIS) the differences in Q and s are significant. However the effect on total cost and relevant cost is more limited: things are pretty flat out there.
In practice formulas based on the first order conditions are used to solve these inventory models. However I think there is a case to be made to look at the original cost functions and optimize these directly. This relates more to the original problem and also we may be a little bit more flexible if we want to add a few more wrinkles. In some cases there are closed solutions, e.g. the well known EOQ formula is:
In the model below again we use the original cost function and minimize that for Q. Note that for other cases it may not be that easy to find closed solutions.
$ontext
Some (s,Q) inventory models
We evaluate two inventory models:
(1) Cost per Stockout Event (CSOE) Model
(2) Cost per Item Short (CIS) Model
It is sometimes suggested to input Q*=EOQ into these models
opposed to optimizing directly for Q. Here we try to
see how much a difference this makes.
$offtext
scalars
D 'mean demand ($/year)' /62000/
sigma_D 'standard error of demand' /8000/
c 'cost per item ($/item)' /100/
cK 'order cost ($/order)' /3270.9678/
ci 'annual inventory cost'
h 'holding charge (% of unit cost)' /0.15/
mu_dl 'mean over lead time'
sigma_dl 'sigma over lead time'
L 'lead time (days)' /14/
B1 'CSOE penalty' /50000/
cs 'Item short cost' /45/
Qeoq 'EOQ'
;
ci = h*c;
mu_dl = D/(365/L);
sigma_dl = sigma_D/sqrt(365/L);
parameter results(*,*,*);
*------------------------------------------------------
* Deterministic EOQ model
*------------------------------------------------------
variables
tc 'total cost'
Q 'order quantity'
;
* prevent division by zero
Q.lo = 0.1;
equations
costdef1 'total cost calculation for simple deterministic case'
;
costdef1..
tc =e= c*D + cK*(D/Q) + ci*(Q/2);
model eoq /costdef1/;
solve eoq minimizing tc using nlp;
Qeoq = Q.l;
results('EOQ','Q','EOQ') = Qeoq;
*------------------------------------------------------
* Cost per Stockout Event Model
*------------------------------------------------------
positive variables
k
PStockout 'P[x>=k]'
s 'order point'
;
equations
costdef2 'CSOE total cost function'
cdf 'this implements P[x>=k]'
sdef 'calculation of order point s'
;
costdef2..
tc =e= c*D + cK*(D/Q) + ci*(Q/2+k*sigma_dl) + B1*(D/Q)*PStockOut;
cdf..
Pstockout =e= 1-errorf(k);
sdef..
s =e= mu_dl + k*sigma_dl;
model csoe /costdef2,cdf,sdef/;
*------------------------------------------------------
* Cost per Item Short (CIS) Model
*------------------------------------------------------
variables
G 'unit loss function'
;
equations
costdef3 'CIS total cost function'
Gdef 'this implements G(k)'
;
costdef3..
tc =e= c*D + cK*(D/Q) + ci*(Q/2+k*sigma_dl) + cs*sigma_dl*G*(D/Q);
Gdef..
G =e= 1/sqrt(2*pi)*exp(-0.5*sqr(k)) - k * (1-errorf(k));
model cis /costdef3,sdef,Gdef/;
*------------------------------------------------------
* Results with Q endogenous
*------------------------------------------------------
solve csoe minimizing tc using nlp;
results('CSEO','Total Cost','Qendog') = TC.L;
results('CSEO','Inv+Short Cost','Qendog') = TC.L-c*D;
results('CSEO','Q','Qendog') = Q.L;
results('CSEO','s','Qendog') = s.L;
results('CSEO','k','Qendog') = k.L;
solve cis minimizing tc using nlp;
results('CIS','Total Cost','Qendog') = TC.L;
results('CIS','Inv+Short Cost','Qendog') = TC.L-c*D;
results('CIS','Q','Qendog') = Q.L;
results('CIS','k','Qendog') = k.L;
results('CIS','s','Qendog') = s.L;
*------------------------------------------------------
* Results with Q fixed to EOQ
*------------------------------------------------------
Q.fx = Qeoq;
solve csoe minimizing tc using nlp;
results('CSEO','Total Cost','Qeoq') = TC.L;
results('CSEO','Inv+Short Cost','Qeoq') = TC.L-c*D;
results('CSEO','Q','Qeoq') = Q.L;
results('CSEO','k','Qeoq') = k.L;
results('CSEO','s','Qeoq') = s.L;
solve cis minimizing tc using nlp;
results('CIS','Total Cost','Qeoq') = TC.L;
results('CIS','Inv+Short Cost','Qeoq') = TC.L-c*D;
results('CIS','Q','Qeoq') = Q.L;
results('CIS','k','Qeoq') = k.L;
results('CIS','s','Qeoq') = s.L;
display results;