I currently run a model with the objective function of maximize the overall of preference
of employees towards work shifts and days off.
#--------SETS
set index; #Index for staff
set shift; #Types of shift
set wdays; #Weekday
param order {index, shift} >=0;
#--------PARAMETERS
param f_min{i in index}; #no of offday per week
param f_max{i in index}; #no of offday per week
param w{i in index, j in shift, wdays}; #preference weight of staff
param d{j in shift, k in wdays}; #no of staff required
param s{i in index, k in wdays}; #no of shift on a day
param r_min{i in index}; #no of working day per week
param r_max{i in index}; #no of working day per week
#---------- VARIABLES
var x{i in index, j in shift, k in wdays}>=0, integer;
#---------- OBJECTIVE AND CONSTRAINTS
maximize z: sum{i in index, j in shift, k in wdays} (w[i,j,k]*x[i,j,k]);
subject to c1{j in shift, k in wdays}: sum{i in index} (w[i,j,k]*x[i,j,k]) = d[j,k];
c2{i in index, k in wdays}: sum{j in shift} (x[i,j,k]) <= s[i,k];
c3{i in index}: sum{j in shift, k in wdays} (x[i,j,k]) >= f_min[i];
c4{i in index}: sum{j in shift, k in wdays} (x[i,j,k]) <= f_max[i];
c5{i in index}: sum{j in shift, k in wdays} (x[i,j,k]) >= r_min[i];
c6{i in index}: sum{j in shift, k in wdays} (x[i,j,k]) <= r_max[i];
#---------- DATA
data;
set index:= S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, S16, S17, S18, S19, S20, S21, S22, S23, S24, S25, S26, S27, S28, S29;
set shift:= Morn, Eve, Night;
set wdays:= Mon, Tue, Wed, Thu, Fri, Sat, Sun;
#preference weight
param w:=
[*,*,Mon]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
[*,*,Tue]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
[*,*,Wed]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
[*,*,Thu]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
[*,*,Fri]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
[*,*,Sat]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
[*,*,Sun]:Morn Eve Night:=
S1 1.67 0.67 0.67
S2 0.67 1.67 0.67
S3 0.67 1.67 0.67
S4 1.67 0.67 0.67
S5 1.67 0.67 0.67
S6 0.67 0.67 1.67
S7 1.67 0.67 0.67
S8 0.67 1.67 0.67
S9 1.67 0.67 0.67
S10 1.67 0.67 0.67
S11 0.67 1.67 0.67
S12 0.67 1.67 0.67
S13 1.67 0.67 0.67
S14 0.67 1.67 0.67
S15 0.67 1.67 0.67
S16 0.67 1.67 0.67
S17 0.67 0.67 1.67
S18 0.67 0.67 1.67
S19 1.67 0.67 0.67
S20 0.67 0.67 1.67
S21 0.67 1.67 0.67
S22 1.67 0.67 0.67
S23 0.67 1.67 0.67
S24 0.67 1.67 0.67
S25 1.67 0.67 0.67
S26 0.67 0.67 1.67
S27 1.67 0.67 0.67
S28 0.67 0.67 1.67
S29 0.67 0.67 1.67
#no of staff required, d[j,k]
param d: Mon Tue Wed Thu Fri Sat Sun:=
Morn 9 9 9 9 9 9 9
Eve 8 8 8 8 8 8 8
Night 6 6 6 6 6 6 6;
#no of shift, s[j]
param s: P1 P2 P3:=
S1 1 1 1
S2 1 1 1
S3 1 1 1
S4 1 1 1
S5 1 1 1
S6 1 1 1
S7 1 1 1
S8 1 1 1
S9 1 1 1
S10 1 1 1
S11 1 1 1
S12 1 1 1
S13 1 1 1
S14 1 1 1
S15 1 1 1
S16 1 1 1
S17 1 1 1
S18 1 1 1
S19 1 1 1
S20 1 1 1
S21 1 1 1
S22 1 1 1
S23 1 1 1
S24 1 1 1
S25 1 1 1
S26 1 1 1
S27 1 1 1
S28 1 1 1
S29 1 1 1;
#no of shift, f_min[i]
param f_min:= S1 1
S2 1
S3 1
S4 1
S5 1
S6 1
S7 1
S8 1
S9 1
S10 1
S11 1
S12 1
S13 1
S14 1
S15 1
S16 1
S17 1
S18 1
S19 1
S20 1
S21 1
S22 1
S23 1
S24 1
S25 1
S26 1
S27 1
S28 1
S29 1;
#no of shift, f_max[i]
param f_max:= S1 2
S2 2
S3 2
S4 2
S5 2
S6 2
S7 2
S8 2
S9 2
S10 2
S11 2
S12 2
S13 2
S14 2
S15 2
S16 2
S17 2
S18 2
S19 2
S20 2
S21 2
S22 2
S23 2
S24 2
S25 2
S26 2
S27 2
S28 2
S29 2;
#no of working days, r_min[i]
param r_min:= S1 5
S2 5
S3 5
S4 5
S5 5
S6 5
S7 5
S8 5
S9 5
S10 5
S11 5
S12 5
S13 5
S14 5
S15 5
S16 5
S17 5
S18 5
S19 5
S20 5
S21 5
S22 5
S23 5
S24 5
S25 5
S26 5
S27 5
S28 5
S29 5;
#no of working days, r_max[i]
param r_max:= S1 6
S2 6
S3 6
S4 6
S5 6
S6 6
S7 6
S8 6
S9 6
S10 6
S11 6
S12 6
S13 6
S14 6
S15 6
S16 6
S17 6
S18 6
S19 6
S20 6
S21 6
S22 6
S23 6
S24 6
S25 6
S26 6
S27 6
S28 6
S29 6;
#Part 4 Solver
option solver cplex;
solve;
#Part 5 Output
display z;
display {i in index, j in shift, k in wdays} x[i,j,k];
end;
This is the coding that I used to program in AMPL
software. Can anyone help me? Thanks you so much.