2

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

我有一个时间表,我需要每天有 2 名工人,持续 30 天。我需要遵守以下约束:

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

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

更新:虽然 ire-and-curses 有一个良好的开端,但我不得不想象有一种更具声明性的方式来使用框架来表达这些约束,而不是必须为每个人单独编码它们。任何更熟悉无国界医生的人可以帮助这个建筑吗?

4

1 回答 1

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

最后添加一个目标函数。

于 2009-09-08T17:16:16.357 回答