#single-item multi module capacitated lot-sizing param T:=25; # number of periods to calculate param T2:=40; # number of periods of data param prod_setup_cost1 {1..T2} >= 0; # fix production costs (setup costs) module 1 param prod_setup_cost2 {1..T2} >= 0; # fix production costs (setup costs) module 2 param prod_setup_cost3 {1..T2} >= 0; # fix production costs (setup costs) module 3 param prod_unit_cost {1..T2} >= 0; # variable production cost (unit costs) modules 1 & 2 & 3 param prod_capacity1 {1..T}:=670; # production capacity module 1 param prod_capacity2 {1..T}:=1280; # production capacity module 2 param prod_capacity3 {1..T}:=1970; # production capacity module 3 param demand{1..T2} >= 0; # demand per period param storage_unit_cost {1..T}:=0.05; # variable holding costs (unit costs) param storage_capacity {1..T}:=9999; # storage capacity var u1 {t in 1..T} binary; # production on/off module 1 var x1 {t in 1..T} >=0; # qantity to produce module 1 var u2 {t in 1..T} binary; # production on/off module 2 var x2 {t in 1..T} >=0; # qantity to produce module 2 var u3 {t in 1..T} binary; # production on/off module 3 var x3 {t in 1..T} >=0; # qantity to produce module 3 var y {t in 0..T} >=0; # inventory level minimize totalcost: sum {t in 1..T} (u1[t]*prod_setup_cost1[t] + x1[t]*prod_unit_cost[t] + u2[t]*prod_setup_cost2[t] + x2[t]*prod_unit_cost[t] + u3[t]*prod_setup_cost3[t] + x3[t]*prod_unit_cost[t] + y[t]*storage_unit_cost[t]); subject to y_0: y[0]=0; subject to balance {t in 1..T}: y[t]=y[t-1]+x1[t]+x2[t]+x3[t]-demand[t]; subject to u_cap1{t in 1..T}: x1[t]<=u1[t]*prod_capacity1[t]; subject to u_cap2{t in 1..T}: x2[t]<=u2[t]*prod_capacity2[t]; subject to u_cap3{t in 1..T}: x3[t]<=u3[t]*prod_capacity3[t]; #subject to v_on{t in 1..T}: y[t]<=storage_capacity[t]; #faster without subject to y_T: y[T]=0; solve; printf "\n"; printf "\n//Input data for Online Solver at https://www.lutanho.net/plt/lotsize_mcm.html"; printf "\n//I u_0 y_0 y_I\n"; printf "%5d; 0; 0; 0;",T; printf "\nstartup x_min fix var x_max fix var x_max fix var x_max demand y_min fix var y_max\n"; printf{t in 1..T} " 0; %3d, %3d,%2d,%3d,%3d,%2d,%3d,%3d,%2d,%3d; %3d; 0,%3d,%3d, %3d;\n", (0),(prod_setup_cost1[t]*100), (prod_unit_cost[t]*100), prod_capacity1[t], (prod_setup_cost2[t]*100), (prod_unit_cost[t]*100), prod_capacity2[t], (prod_setup_cost3[t]*100), (prod_unit_cost[t]*100), prod_capacity3[t], demand[t], (0), (storage_unit_cost[t]*100), storage_capacity[t]; printf "\n---------------------------------------------------------"; printf "\nTotal Cost: %10g\n", totalcost; printf "\n"; data; param demand := 1 599, 2 413, 3 404, 4 569, 5 437, 6 409, 7 432, 8 567, 9 585, 10 575, 11 495, 12 459, 13 536, 14 442, 15 405, 16 417, 17 592, 18 553, 19 401, 20 503, 21 498, 22 528, 23 570, 24 413, 25 513, 26 514, 27 499, 28 491, 29 567, 30 506, 31 486, 32 543, 33 417, 34 420, 35 424, 36 450, 37 599, 38 429, 39 434, 40 463; param prod_unit_cost := 1 0.66, 2 0.51, 3 0.82, 4 0.92, 5 0.72, 6 0.94, 7 0.61, 8 0.82, 9 0.55, 10 0.96, 11 0.72, 12 0.74, 13 0.96, 14 0.7, 15 0.54, 16 0.64, 17 0.86, 18 0.97, 19 0.84, 20 0.89, 21 0.62, 22 0.94, 23 0.69, 24 0.81, 25 0.83, 26 0.65, 27 0.62, 28 0.77, 29 0.99, 30 0.74, 31 0.72, 32 0.55, 33 0.74, 34 0.84, 35 0.97, 36 0.61, 37 0.66, 38 0.52, 39 0.61, 40 0.91; param prod_setup_cost1 := 1 3023, 2 2953, 3 2894, 4 3132, 5 3092, 6 3058, 7 2859, 8 3082, 9 3038, 10 3048, 11 3053, 12 3016, 13 2921, 14 2964, 15 3024, 16 3130, 17 2876, 18 2887, 19 3129, 20 3150, 21 2916, 22 3086, 23 3124, 24 2942, 25 3147, 26 2936, 27 2900, 28 3126, 29 3069, 30 3040, 31 2906, 32 2855, 33 3129, 34 3072, 35 3137, 36 2919, 37 3046, 38 2868, 39 2873, 40 2979; param prod_setup_cost2 := 1 5871, 2 5970, 3 5872, 4 5871, 5 6079, 6 5991, 7 6117, 8 5914, 9 5885, 10 6088, 11 6005, 12 6196, 13 6074, 14 5900, 15 5948, 16 5853, 17 6013, 18 6047, 19 5969, 20 5867, 21 5973, 22 6027, 23 6031, 24 6159, 25 5855, 26 5859, 27 6002, 28 6007, 29 5962, 30 5888, 31 5903, 32 5858, 33 6148, 34 6198, 35 6183, 36 5952, 37 5896, 38 5877, 39 6016, 40 5877; param prod_setup_cost3 := 1 9062, 2 9165, 3 8879, 4 9088, 5 8932, 6 9062, 7 9106, 8 8919, 9 9193, 10 9071, 11 9087, 12 8850, 13 9111, 14 8915, 15 9093, 16 9065, 17 9140, 18 9003, 19 9055, 20 9162, 21 8876, 22 9145, 23 8818, 24 9114, 25 8827, 26 9076, 27 8977, 28 8956, 29 9185, 30 9090, 31 8955, 32 8947, 33 8945, 34 9118, 35 9163, 36 9045, 37 9065, 38 8888, 39 9184, 40 8909; end;