model.addLinearSum(d_shifts, 0, 1);model.addLinearSum(n_shifts_worked, min_shifts_per_nurse, max_shifts_per_nurse); model.Add(min_shifts_per_nurse <= num_shifts_worked)
model.Add(num_shifts_worked <= max_shifts_per_nurse)int min_shifts_per_nurse = num_shifts * num_days; // num_nurses
int max_shifts_per_nurse = min_shifts_per_nurse + 1;IntVar[] n_shifts_worked = new IntVar[num_shifts * num_days];
for (int s : all_shifts) {
for (int d : all_days) {
int index = s * num_days + d;
n_shifts_worked[index] = shifts[n][d][s];
}
}
model.addLinearSum(n_shifts_worked, min_shifts_per_nurse, max_shifts_per_nurse);model.Maximize(
sum(shift_requests[n][d][s] * shifts[(n, d, s)] for n in all_nurses
for d in all_days for s in all_shifts))IntVar[] intVars = new IntVar[num_shifts * num_days * num_nurses];
int[] ints = new int[num_shifts * num_days * num_nurses];
for (int s : all_shifts) {
for (int d : all_days) {
for (int n : all_nurses) {
int index = (s * num_days + d) * num_nurses + n;
intVars[index] = shifts[n][d][s];
ints[index] = shift_requests[n][d][s];
}
}
}
model.maximizeScalProd(intVars, ints);