# 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;