Model 如何使用MS求解器建立简单的调度问题?

Model 如何使用MS求解器建立简单的调度问题?,model,constraints,scheduling,ms-solver-foundation,Model,Constraints,Scheduling,Ms Solver Foundation,我有一个简单的问题,我想用它来做实验: 我有一个时间表,我需要在30天内每天有2名工人。我需要遵守以下约束条件: 任何人都不应该连续工作两天 除非有特殊例外,否则人们每周只能工作一次 有些人只能在周末工作 有些人只能在工作日工作 我计划使用C#来填充模型,但我需要帮助开始建模。我不知道如何设置决策、参数和约束来解决这类问题 更新:虽然《愤怒与诅咒》有一个良好的开端,但我不得不想象,有一种更具声明性的方式来使用框架表达这些约束,而不是为每个人单独编写它们。是否有更熟悉MSF的人可以帮助进行此构

我有一个简单的问题,我想用它来做实验:

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

  • 任何人都不应该连续工作两天
  • 除非有特殊例外,否则人们每周只能工作一次
  • 有些人只能在周末工作
  • 有些人只能在工作日工作
我计划使用C#来填充模型,但我需要帮助开始建模。我不知道如何设置决策、参数和约束来解决这类问题


更新:虽然《愤怒与诅咒》有一个良好的开端,但我不得不想象,有一种更具声明性的方式来使用框架表达这些约束,而不是为每个人单独编写它们。是否有更熟悉MSF的人可以帮助进行此构造?

如果您有
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>
然后,您只需要每周工作一次。第一周的情况如下,接下来的三周情况类似

P<xx>D00 + P<xx>D01 + P<xx>D02 + P<xx>D03 + P<xx>D04 + P<xx>D05 + P<xx>D06 <= 1
只有周末

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
PD00+PD01+PD02+PD03+PD04==0
PD07+PD08+PD09+PD10+PD11==0
PD14+PD15+PD16+PD17+PD18==0
PD21+PD22+PD23+PD24+PD25==0
PD28+PD29==0

最后添加一个目标函数。

您希望优化什么?需要多少人?最终,是的。最初,我只想生成一个可行的解决方案。希望一旦我得到了这些简单的约束,我可以扩展它来尊重个人更具体的偏好。我意识到你正试图用一种基于约束的方法来实现这一点,所以我不提供这一点作为答案,但仅供参考,你也可能会发现二分匹配是一种有趣的替代方法。请参见示例:请原谅我对术语不熟悉,但目标函数的示例是什么?traget函数代表您要优化的目标。我本想举个例子,但我想不出一个有意义的例子。也许可以最大限度地增加零天工作的人数,从而最大限度地减少完成工作所需的人数。但我不确定这是如何在SolverFoundation中表达的,因为我一小时前才听说。谢谢你的见解。一旦我有机会尝试一下,我会回到这个问题来奖励答案。
P<xx>D28 + P<xx>D29 <= 1
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