如果您有n
人员,则必须定义30n
二进制整数参数,每个参数指示一个人是否在特定日期工作。
P<xx>D<yy> == 1 => Person <xx> works on day <yy>
P<xx>D<yy> == 0 => Person <xx> does not work on day <yy>
然后,您需要限制以防止连续两天工作。这将是29n
约束。
P<xx>D<yy> + P<xx>D<yy+1> <= 1
然后你需要每周只工作一次的约束。这将是第一周的以下内容,接下来的三周类似。
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 + P<xx>D05 + P<xx>D06 <= 1
最后一周将是以下。
P<xx>D28 + P<xx>D29 <= 1
这将产生另一个5n
约束。然后只为工作日添加约束
P<xx>D05 + P<xx>D06 == 0
P<xx>D12 + P<xx>D13 == 0
P<xx>D19 + P<xx>D20 == 0
P<xx>D26 + P<xx>D27 == 0
仅限周末
P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 == 0
P<xx>D07 + P<xx>D08 + P<xx>D09 + P<xx>D10 + P<xx>D11 == 0
P<xx>D14 + P<xx>D15 + P<xx>D16 + P<xx>D17 + P<xx>D18 == 0
P<xx>D21 + P<xx>D22 + P<xx>D23 + P<xx>D24 + P<xx>D25 == 0
P<xx>D28 + P<xx>D29 == 0
最后添加一个目标函数。