c-sched1 minco Knitro AMPL short = 0; # process time of feed in furnace var n {feeds,furnaces} >= 0, <= K, := 1.0; # number of subcycles of feed in furnace var F {i in feeds} >= Flo[i], <= Fup[i];# rate of arrival of feed i var S {feeds} >= 0; # extra amount of feed processed above min var dt {feeds,furnaces} >= 0; # time devoted to feed in furnace var Tcycle >= 0; # common cycle time for all furnaces var y {feeds,furnaces,0..K} >= 0, <= 1, binary; # SOS to model n[i,l] # ... objective is to maximize profit/cycle-time maximize profit: sum{i in feeds, l in furnaces} ( Cc[i,l]*t[i,l] - Cs[i,l]*n[i,l] + Cp[i,l]*n[i,l]*(1 - exp(-b[i,l]*t[i,l]/n[i,l]) ) ) / Tcycle; subject to # ... mass balance equations (8) & (9) massbal_1{i in feeds}: Flo[i]*Tcycle + S[i] = sum{l in furnaces}( D[i,l]*t[i,l] ); massbal_2{i in feeds}: S[i] <= ( Fup[i] - Flo[i] )*Tcycle; # ... integrality constraints (10) & (11) integ_1{i in feeds, l in furnaces}: n[i,l] = sum{k in 0..K} yk[k] * y[i,l,k]; integ_2{i in feeds, l in furnaces}: 1 = sum{k in 0..K} y[i,l,k]; # ... timing constraint (13): relate total time of feed to processing & clean-up time_1{i in feeds, l in furnaces}: dt[i,l] = n[i,l]*tau[i,l] + t[i,l]; # ... timing constraint (14): total time less than cycle time time_2{l in furnaces}: sum{i in feeds} dt[i,l] <= Tcycle; # ... timing constraint (15): t[i,l] is zero if number of subcycles is zero time_3{i in feeds, l in furnaces}: t[i,l] <= U*(1 - y[i,l,0]); # .. extra constraints extra{i in feeds: Flo[i] > 0}: sum{l in furnaces} n[i,l] >= 1; ]]> solve; display _varname, _var; # c-sched.mod OLR2-AN-v-v # AMPL coding: S. Leyffer, University of Dundee, March 2000. # # Source: V. Jain, I.E. Grossmann, "Cyclic Scheduling of Continuous # Parallel Units with Decaying Performance", AIChE Journal, # 44, 1623-1636. # # Formulation with binary variables # # data files: c-sched1.dat = Example 1 (3 feeds, single furnace)