简体   繁体   中英

How to model domain index with subset of set in minizinc

I am working on a nurse scheduling problem with the constraint stating that there should not be a day shift assigned to nurse after a night shift in previous day.

The constraint looks like this:

在此处输入图片说明

The shift set is "set of int: shift=1..7",

set of int: dayshift ={1,3,4}; set of int: dayshift={2,5,6,7};

How to model this constraint in minizinc?

I've tried:

 constraint
  forall(e in Employee, d in Day where d != Day[card(Day)])(
Assign[e, d, sh in NightShfit]   + Assign[e, d+1, sh in DayShift]  < 1
);

error: MiniZinc: type error: undefined identifier `sh'

The solution to your problem is to compute the sum of the "Assign" variables for both of the shift:

constraint forall(e in Employee, d in Day where d != Day[card(Day)])(
    sum(sh in NightShift)(Assign[e, d, sh]) + sum(sh in DayShift)(Assign[e, d+1, sh])  < 1
);

As a side note I would like to remark that using 0/1 variables for these kinds of problems is only a good way of modelling for mathematical optimisation solvers (MIP). Constraint Programming (CP) solvers and Lazy Clause Generation (LCG) solvers will not work efficiently even though they are great for these kinds of problems.

My recommendation would be to have the different kinds of shift (for every day) as an enum and then assign one version of it for every employee for every day. Constraints like the ones your expressing here then often fit well into a regular constraint which performs great of both MIP and CP/LCG solvers. (In case of MIP it gets automatically transformed into a flow model).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM