param start; # first year of demand
param end; # last year of demand
param demand {n in start..end};
param invLimit;
param prodLimit;
param unitCost {n in start..end};
param setupCost;
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: i+s >= demand[n]
and i+s-demand[n] <= invLimit};
# set of allowed production levels
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] + f[n+1, s+i-demand[n]]);
set opt{n in start..end, s in 0..invLimit}:=
{ i in options[n,s]:
f[n,s] = cost[n,i] + f[n+1, s+i-demand[n]] };
data;
param start:= 1;
param end:= 3;
param demand:=
1 1
2 2
3 1;
param invLimit:= 2;
param prodLimit:= 3;
param unitCost:=
1 3
2 5
3 4;
param setupCost:= 10;