Ruby 中的最佳工作分配(最小二乘法)



我有一个任务列表。他们每个人都有一个名称和完成所需的时间。

例:

[TaskA, 4 hours], [TaskB, 8 hours], [TaskC, 10 hours]

我想将这些任务分配给特定日期。例如,要在 2 天内分发它们,我可以将它们拆分为:

Day 1: TaskA, TaskB | Day 2: TaskC
Day 1: TaskA | Day 2: TaskB, TaskC

当然,随着要分配的任务/天数的增加,这变得更加复杂。我想过使用最小二乘方法来分配它们(我相信 TeX 使用类似的方法来在行上分配单词)。

我无法对任务重新排序。一天不可能没有任务(但最小二乘总是这种情况,不是吗?

我已经实现了一种算法来执行此计算,它似乎可以正常工作,但非常慢(10天内50个任务的14+分钟)。我浏览了一个任务列表,对于每个任务,我要么将其放入当前的"存储桶"中,要么移动到另一个"存储桶"(天)。然后我选择一个更好的解决方案。我还使用当前的最小值提前修剪递归树。这将时间从 30+ 分钟减少到 10+ 分钟,但仍然太慢了。

我使用 Ruby,但我可以移植的任何语言的算法都可以。

如果我

正确理解你的问题,你有一个线性规划整数规划问题。如果是这样,您可以使用 gem(如 opl)获得最佳解决方案

让:

HTt:完成任务 t 所需的小时数。

HD d:第d 天可用于工作的小时数。

然后,我们定义要确定其值的变量:

xtd:第 d 天在任务 t 上花费的小时数。

我们有三组约束

必须完成每个任务:

Σdxtd = HT t 对于每个任务t

每天可以分配不超过高清td的工作小时数d:

Σtxtd <= HD d每天 d

变量必须是非负数:

xtd>= 0 对于每个任务 t 和天 d

最后,我们定义了一个最大化或最小化的目标

z = Σ td a td xtd

其中,TD为每个t,d对提供系数(例如,单位利润或成本)。

编程问题是为变量选择值,以使目标 z 在给定约束下最大化。如果变量可以分配分数值(例如,在第 d 天的任务 t 上花费 1.27458 小时),则它是一个线性程序。如果变量只能赋值整数值,则为整数程序。如果某些变量可以是分形值,而其他变量必须是整数值,则它是一个混合整数程序。在这三者中,线性规划是迄今为止最容易解决的。

如果你只是想要一个可行的解决方案*——任何满足所有成本的解决方案——只需设置 z = 0 并求解(尽管如果它是一个线性程序,解决方案是微不足道的)。

假设您希望以半小时为单位分配任务,目标是最小化任何给定日期的最大工作小时数。这将是一个整数程序,变量是在第 d 天完成的任务 t 的半小时块的数量,目标是通过一组额外的约束来最小化 z:

z>= Σtxtd 每天 d

当然,HTt和HDd将从小时更改为半小时块的数量。

最新更新