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

时间:2015-01-31 14:49:50

标签: ruby algorithm optimization least-squares

我有一份任务清单。他们每个人都有一个名字和完成所需的时间。

示例:

[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使用类似的方法在线上分配单词)。

我无法重新排序任务。一天不能没有任务(但最小方格总是如此,不是吗?)。

我已经实施了一个算法来执行此计算,它似乎工作正常,但速度很慢(14天内50个任务超过10分钟)。我查看了一系列任务,每一个我都把它放在一个当前的#34桶中。或转移到另一个"桶" (天)。然后我选择了更好的解决方案。我还使用当前最小值来早期修剪递归树。这减少了30+到10+分钟的时间,但仍然太慢。

我使用Ruby,但我能用任何语言编写算法都可以。

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您就会遇到线性编程整数编程问题。如果是这样,您可以使用诸如opl之类的gem获得最佳解决方案

让:

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

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

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

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

我们有三组约束

每项任务都必须完成:

每个任务的

Σ d x td = HT t

每天工作时间不超过HD td d:

Σ t x td < = HD d 每天d

变量必须是非负数:

对于每个任务t和第d天,

x td > = 0

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

z =Σ td a td x td

其中 td 给出每个t,d对的系数(例如,单位利润或成本)。

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

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

假设您想以半小时的时间段分配任务,目标是最大限度地减少任何一天工作的最大小时数。这将是一个整数程序,变量是在第d天要完成的任务t的半小时块的数量,目标是通过一组额外的约束来最小化z:

z> =Σ t x td 每天d

当然,HT t 和HD d 会从小时变为半小时数。