我有以下简单的问题,我想用它来试验MS Solver Foundation:
我有一个时间表,我需要每天有2名工人,为期30天。我需要遵守以下限制:
我计划使用C#填充模型,但我需要帮助开始建模。我不确定如何设置决策,参数和约束来解决这类问题。
更新:虽然ire-and-curses有一个良好的开端,但我必须想象使用框架表达这些约束的更具声明性的方式,而不是必须为每个人单独编码。谁更熟悉MSF,可以帮助这个建设?
答案 0 :(得分:1)
如果您有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
最后添加一个目标函数。