我有一份任务清单。他们每个人都有一个名字和完成所需的时间。
示例:
[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,但我能用任何语言编写算法都可以。
答案 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 会从小时变为半小时数。