【问题标题】:Job scheduling to minimise loss作业调度以减少损失
【发布时间】:2019-01-31 01:01:52
【问题描述】:

我遇到了作业调度问题。我们有开始时间,时间 完成订单,截止日期。

给定start time + time complete <= deadline.

如果我无法做到,我也会遭受损失 在截止日期前完成工作。我必须设计一个算法来最小化损失。

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

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

【问题讨论】:

  • 离题你的意思是说?
  • 我的意思是说....“离题”。

标签: c++ job-scheduling


【解决方案1】:

根据您的优化目标,动态编程不是正确的方法。您可以使用贪心的方法找到优化的时间表。

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

【讨论】:

  • 我想如果我们有不同的时间来完成每项工作,这将是行不通的
  • 除了指南中的内容之外,您只需要进行一次额外的计算。您需要通过current_time < end_time - time_to_complete 检查可行性
  • 我猜很多,例如有两个工作,第一个工作的截止日期与第二个工作的开始时间重叠。在这种情况下,解决方案将只采用其中之一。但是如果(截止日期2 - 完成第二次的时间)> 截止日期1。我不认为它会在那里工作,如果我错了,请纠正。然后如果有三个工作,那么开始第三个工作可能会导致问题
【解决方案2】:

您的问题类似于背包问题。如果您实际上并不是在寻找可能的最佳解决方案,而只是在寻找“足够好”的解决方案,那么使用贪婪方法会很方便。

贪婪方法的最大优点是成本比其他“更彻底”的方法要低,但是,如果您需要解决问题的最佳方法,我会说回溯是要走的路。

【讨论】:

    【解决方案3】:

    由于可能会违反截止日期,因此问题看起来像 Total Weighted Tardiness 调度问题。它有很多种形式,但是这个范围内的大多数问题都是计算困难的,因此动态编程(DP)不是我的首选。以我的经验,DP 在建模和实现过程中也存在困难。对数学编程“原样”的相同评论。一些可以更快实施的方法是:

    1. constraint programming:学习曲线非常小,而且有很多库,包括非常好的开源库(大多数都有 C++ API)。奖励:约束规划可以证明最优性。
    2. ad hoc heuristics:(1) 从 constructive algorithm 开始(如 Ling ZhongFlavio Giobergia 建议的 greedy 方法),然后 (2) 使用一些 local search 方法来改进 if 和最后 (3) 将该方法嵌入到metaheuristic 方案中。通过这种方式,您可以在上一步的基础上进行构建,并了解很多有关该问题的信息。注意:一般来说,启发式不能证明最优性
    3. 特别提及local solver,是上述两者之间的混合方法:它允许您使用类似于约束规划的形式对问题进行建模,然后使用启发式方法解决问题。它非常容易学习,通常可以让您快速入门,并且在我的测试中,它提供了非常好的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2018-12-15
      • 2018-02-09
      • 2019-08-18
      • 2018-01-31
      相关资源
      最近更新 更多