2

我正在尝试安排 30 名助教来完成大约 118 小时的办公时间。一天中不同时间的办公时间需要不同的覆盖范围(0、1、2 或 3 名助理)。人们被安排在半小时。

我已经制作了一个整数线性程序,这样我就有一个由 worker 和 shift 索引的 0/1 变量:如果不工作则为 0,如果工作则为 1。覆盖很容易,但它导致一些工人只安排半小时轮班,这对他们来说是不公平的。

我的第二次尝试是拥有一组更丰富的索引变量,按(工人、开始时间、轮班长度)。这是障碍开始的地方:

  • 如果我将每个工人的轮班次数限制为每天一班,那么 IP 求解器会持续数小时而没有解决方案。

  • 如果我允许每个工人每天两班倒,那么一切都会很好,除了有时求解器会安排一个工人轮班进行两个重叠的班次。这意味着求解器认为我有 3 个值班人员,但我实际上只有 2 个。

  • 我最后的尝试是引入约束,以使任何工人都不能安排重叠的两个班次。在这一点上,我的工具研磨了一段时间,然后因内存不足错误而崩溃。

我正在使用带有 COIN CPB 求解器的RIMA优化包。(也试过了lpsolve。)

我觉得 30 名工人进入大约 150 个插槽应该不难!所以我想我一定是在以一种愚蠢的方式提出问题。因此我的问题是:我如何学习如何以求解者能够很好地解决问题的方式来制定我的调度问题?

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

4

1 回答 1

1

这个问题几乎完全是集合覆盖问题,尽管增加了约束。使用整数编程对此进行建模的正确方法是使用列生成方法。这个来自 IBM CPLEX 的切割库存问题示例应该足够清楚,您很可能能够根据您的问题对其进行调整。

于 2018-01-21T18:59:08.023 回答