作业调度以尽量减少损失

时间:2015-10-17 07:31:16

标签: c++ job-scheduling

我有一份工作安排问题。我们给出了开始时间和时间 完成订单,截止日期。

给出start time + time complete <= deadline

如果我不能,我也会得到失败 在截止日期前完成工作。我必须设计一种算法来减少损失。

我尝试更改动态编程的标准算法,以最大限度地提高作业调度的利润,但没有成功。

我可以使用什么算法来解决问题?

3 个答案:

答案 0 :(得分:0)

动态编程不是基于您的目标优化的正确方法。您可以使用贪婪的方法找到优化的计划。

这是一个完整的guide,其中包含您所需语言(C ++)的示例代码,在本指南中假设每个作业只需要1个单位时间,您可以使用time_to_complete轻松修改。

答案 1 :(得分:0)

你的问题与背包类似。如果你实际上并没有寻找最好的解决方案,那么使用贪婪的方法很方便,但只需要足够好&#34;一。

贪婪方法的最大优点是成本相当低于其他更彻底的&#34;但是,如果您需要 最佳解决方案,我会说回溯是可行的方法。

答案 2 :(得分:0)

由于可以违反期限,因此问题看起来像是 Total Weighted Tardiness 调度问题。它有很多风格,但是在这个伞下的大多数问题在计算上都很困难,因此动态编程(DP)并不是我的首选。以我的经验,DP在建模和实现过程中也会遇到困难。对数学编程“按原样”的相同注释。可以更快实施的一些方法是:

  1. constraint programming:学习曲线很小,并且那里有很多库,其中包括非常好的开源库(大多数都有C ++ API)。奖励:约束编程可以证明最优性。
  2. 临时heuristics:(1)从constructive algorithm开始(例如greedyLing Zhong建议的Flavio Giobergia方法),然后(2)如果最终(3)将方法嵌入local search方案中,则使用某种metaheuristic方法进行改进。这样,您可以在上一步的基础上进行构建,并从中学到很多有关该问题的知识。注意:一般来说,启发式方法无法证明最优性
  3. 特别提及 local solver ,是上述两者之间的一种混合方法:它允许您使用类似于约束编程的形式主义对问题进行建模,然后使用启发法解决它。它非常容易学习,通常可以让您快速入门,并且在我的测试中,它可以提供非常好的结果。