如何使用MS Solver Foundation建模简单的调度问题?

时间:2009-09-08 16:16:06

标签: model constraints scheduling ms-solver-foundation

我有以下简单的问题,我想用它来试验MS Solver Foundation

我有一个时间表,我需要每天有2名工人,为期30天。我需要遵守以下限制:

  • 没有人应该连续工作两天。
  • 除非采用特殊例外,否则人们每周只能工作一次。
  • 有些人只能在周末工作。
  • 有些人只能在平日工作。

我计划使用C#填充模型,但我需要帮助开始建模。我不确定如何设置决策,参数和约束来解决这类问题。

更新:虽然ire-and-curses有一个良好的开端,但我必须想象使用框架表达这些约束的更具声明性的方式,而不是必须为每个人单独编码。谁更熟悉MSF,可以帮助这个建设?

1 个答案:

答案 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

最后添加一个目标函数。