#Single-Item Capacitated Economic Lot Sizing #with Start-up Costs, Piecewise Linear Production Costs and Piecewise Linear Holding Costs #This is an example with MOQ=57, max-capacity=80, and max-backlogging=10: param I > 0; # number of periods param J_max > 0; # max number of production intervals param K_max > 0; # max number of inventory intervals param J {1..I} > 0; # number of production intervals in period i param K {1..I} > 0; # number of inventory intervals in period i param a {1..I} >= 0; # startup costs in period i param x_fix {1..I, 1..J_max} integer; # fix production costs (setup costs) in period i interval j param x_var {1..I, 1..J_max} integer; # variable production costs (unit costs) in period i interval j param x_up {1..I, 0..J_max} integer; # upper border of production interval j in period i param demand {1..I} >= 0; # demand in period i param y_fix {1..I, 1..K_max} integer; # fix inventory costs (setup costs) in period i interval k param y_var {1..I, 1..K_max} integer; # variable inventory costs (unit costs) in period i interval k param y_up {1..I, 0..K_max} integer; # upper border of inventory interval j in period i param x_min {1..I} integer; # min. feassible production quantity in period i param x_max {1..I} integer; # max. feassible production quantity in period i param y_min {1..I} integer; # min. feassible inventory quantity in period i param y_max {1..I} integer; # max. feassible inventory quantity in period i var u {i in 0..I} binary; # production on/off var v {i in 1..I, j in 1..J[i] } binary; # active production interval var w {i in 1..I, k in 1..K[i] } binary; # active inventory interval var xj {i in 1..I, j in 1..J[i] } integer, >=0; # qantity to produce in interval j var x {i in 1..I} integer, >=0; # qantity to produce var y {i in 0..I} integer; # inventory level in interval k var yk {i in 0..I, k in 1..K[i] } integer; # inventory level var s {i in 0..I} binary; # startup on/off subject to sum_xj {i in 1..I}: sum {j in 1..J[i]} xj[i,j]=x[i]; subject to sum_yk {i in 1..I}: sum {k in 1..K[i]} yk[i,k]=y[i]; subject to x_min_x {i in 1..I}: x_min[i]<=x[i]; subject to x_x_max {i in 1..I}: x[i]<=x_max[i]; subject to y_min_y {i in 1..I}: y_min[i]<=y[i]; subject to y_y_max {i in 1..I}: y[i]<=y_max[i]; subject to x_on {i in 1..I}: x[i]<=u[i]*x_max[i]; subject to balance {i in 1..I}: y[i-1]+x[i]-demand[i]=y[i]; subject to x_up0 {i in 1..I, j in 1..J[i]}: v[i,j]*(x_up[i,j-1]+1)<=xj[i,j]; subject to x_up1 {i in 1..I, j in 1..J[i]}: xj[i,j]<=v[i,j]*x_up[i,j]; subject to y_up0 {i in 1..I, k in 1..K[i]}: w[i,k]*(y_up[i,k-1]+1)<=yk[i,k]; subject to y_up1 {i in 1..I, k in 1..K[i]}: yk[i,k]<=w[i,k]*y_up[i,k]; subject to s_u {i in 1..I}: u[i]-u[i-1]<=s[i]; subject to v_u {i in 1..I}: sum {j in 1..J[i]} v[i,j]=u[i]; subject to v_sum {i in 1..I}: sum {j in 1..J[i]} v[i,j]<=1; subject to w_sum {i in 1..I}: sum {k in 1..K[i]} w[i,k]<=1; subject to u_0: u[0]=0; subject to y_0: y[0]=0; subject to y_I: y[I]=0; minimize totalcost: sum {i in 1..I} (s[i]*a[i])+ # startup costs sum {i in 1..I, j in 1..J[i]} (v[i,j]*x_fix[i,j]+x_var[i,j]*xj[i,j])+ # production costs sum {i in 1..I, k in 1..K[i]} (w[i,k]*y_fix[i,k]+y_var[i,k]*yk[i,k]); # inventory costs solve; printf "\n u, x, y;\n"; printf{i in 1..I} "%3d, %3d, %3d;\n", u[i], x[i], y[i]; printf "\nTotal Cost: %10g\n", totalcost; printf "\n"; data; param I := 9; param J_max := 2; param K_max := 2; param J := 1 2, 2 2, 3 2, 4 2, 5 2, 6 2, 7 2, 8 2, 9 2; param K := 1 2, 2 2, 3 2, 4 2, 5 2, 6 2, 7 2, 8 2, 9 2; param a := 1 7, 2 6, 3 5, 4 7, 5 6, 6 5, 7 7, 8 6, 9 5; param x_fix : 1 2 := 1 9999 100 2 9999 100 3 9999 100 4 9999 100 5 9999 100 6 9999 100 7 9999 100 8 9999 100 9 9999 100 ; param x_var : 1 2 := 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 ; param x_min := 1 0, 2 0, 3 0, 4 0, 5 0, 6 0, 7 0, 8 0, 9 0; param x_up : 0 1 2 := 1 -1 56 80 2 -1 56 80 3 -1 56 80 4 -1 56 80 5 -1 56 80 6 -1 56 80 7 -1 56 80 8 -1 56 80 9 -1 56 80 ; param x_max := 1 80, 2 80, 3 80, 4 80, 5 80, 6 80, 7 80, 8 80, 9 80; param demand := 1 50, 2 30, 3 60, 4 50, 5 40, 6 50, 7 60, 8 50, 9 60; param y_fix : 1 2 := 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 ; param y_var : 1 2 := 1 -3 2 2 -3 2 3 -3 2 4 -3 2 5 -3 2 6 -3 2 7 -3 2 8 -3 2 9 -3 2 ; param y_min := 1 -10, 2 -10, 3 -10, 4 -10, 5 -10, 6 -10, 7 -10, 8 -10, 9 -10; param y_up : 0 1 2 := 1 -11 0 9999 2 -11 0 9999 3 -11 0 9999 4 -11 0 9999 5 -11 0 9999 6 -11 0 9999 7 -11 0 9999 8 -11 0 9999 9 -11 0 9999 ; param y_max := 1 9999, 2 9999, 3 9999, 4 9999, 5 9999, 6 9999, 7 9999, 8 9999, 9 9999; end;