set SHIFTS; # shifts param Nsched; # number of schedules; set SCHEDS = 1..Nsched; # set of schedules set SHIFT_LIST {SCHEDS} within SHIFTS; param rate {SCHEDS} >= 0; param required {SHIFTS} >= 0; param least_assign >= 0; var Work {j in SCHEDS} >= 0 integer; var Use {j in SCHEDS} >= 0 binary; minimize Total_Cost: sum {j in SCHEDS} rate[j] * Work[j]; subject to Shift_Needs {i in SHIFTS}: sum {j in SCHEDS: i in SHIFT_LIST[j]} Work[j] >= required[i]; subject to Least_Use1 {j in SCHEDS}: least_assign * Use[j] <= Work[j]; subject to Least_Use2 {j in SCHEDS}: Work[j] <= (max {i in SHIFT_LIST[j]} required[i]) * Use[j]; # Work[j] <= 0.40 * (max {i in SHIFT_LIST[j]} required[i]) * Use[j];