# demand is stochastic in this model
param start; # first year of demand
param end; # last year of demand
param maxdem;
param demProb {n in start..end, d in 0..maxdem} >=0;
check{n in start..end}: sum{d in 0..maxdem} demProb[n,d] = 1;
param prodLimit;
param invLimit;
param unitCost {n in start..end};
param setupCost;
param penalty;
param cost{n in start..end, i in 0..prodLimit}:=
if i=0 then 0 else (setupCost + i * unitCost[n]);
# cost of producing i units in period n
set options{n in start..end, s in 0..invLimit}:=
{i in 0..prodLimit};
# set of allowed production levels
param leftover {s in 0..invLimit, i in 0..prodLimit, d in 0..maxdem}:=
if s+i < d then 0 else
if s+i-d > invLimit then invLimit else
s+i-d;
# the inventory level at the beginning of next period
param f{n in start..end+1, s in 0..invLimit}:=
if n = end + 1 then 0 else
min{i in options[n,s]}
(cost[n,i] +
sum{d in i+s+1..maxdem} demProb[n,d]*(d-i-s)*penalty +
sum{d in 0..maxdem} demProb[n,d]*f[n+1, leftover[s,i,d]]);
set opt{n in start..end, s in 0..invLimit}:=
{ i in options[n,s]:
f[n,s] = cost[n,i] +
sum{d in i+s+1..maxdem} demProb[n,d]*(d-i-s)*penalty +
sum{d in 0..maxdem} demProb[n,d]*f[n+1, leftover[s,i,d]] };
data;
param start:= 1;
param end:= 3;
param maxdem:= 2;
param demProb:
0 1 2 :=
1 .2 .5 .3
2 .1 .4 .5
3 .2 .4 .4;
param prodLimit:= 3;
param invLimit:= 2;
param unitCost:=
1 3
2 5
3 4;
param setupCost:= 5;
param penalty := 9;