调度工作使用整数编程转移---如何制定可行的约束?

时间:2018-01-13 21:58:17

标签: scheduling mathematical-optimization integer-programming operations-research

我正计划安排30名助教,以支付约118小时的办公时间。一天中不同时间的办公时间需要不同的覆盖范围(0,1,2或3个助手)。人们安排在半小时。

我做了一个整数线性程序,这样我有一个由工人索引的0/1变量,如果不工作则移位:0,如果工作那么就是1。覆盖范围很简单,但它导致一些工人只安排了半小时的班次,这对他们来说是不公平的。

我的第二次尝试是通过(工人,开始时间,班次长度)获得更丰富的索引变量集。这就是障碍开始的地方:

  • 如果我将每个工人的轮班数量限制在每天一班,那么IP解决方案会在没有解决方案的情况下磨掉几个小时。

  • 如果每个工人每天允许两班倒,那么事情就会很好,除非有时解算器会安排一个工人进行两次重叠的班次。这意味着解算者认为我有3个值班人员,但我真的只有2人。

  • 我最后的尝试是引入约束条件,以便不会安排任何工人重叠两个班次。此时,我的工具会磨损一段时间,然后出现内存错误。

我正在使用RIMA优化包和COIN CPB解算器。 (也尝试了lpsolve。)

我觉得大约150个插槽的30名工人不应该那么难!所以我认为我必须以愚蠢的方式制定问题。因此,我的问题是:如何以解算器能够很好地解决问题的方式来学习如何制定我的日程安排问题?

(如果重要的话,我试图最大化的目标函数是他们被分配的所有班次的所有工人的总效用。它只是一个由工人和班次编制索引的数字。)

1 个答案:

答案 0 :(得分:1)

这个问题几乎就是设置覆盖问题,虽然增加了约束。使用整数编程对此进行建模的正确方法是使用列生成方法。来自IBM的CPLEX的example切割库存问题应该足够明确,以便您最有可能使其适应您的问题。