2014-11-26

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;

Show more