【问题标题】:Efficiently minimize wait time between time-constrained tasks有效减少时间受限任务之间的等待时间
【发布时间】:2015-10-19 23:13:28
【问题描述】:

我有一个任务数组,其中每个任务都是具有以下属性的对象:

  • startTime:任务开始时间(previous finishTime + travelTime
  • serviceTime:完成任务所需的时间
  • waitTime:空闲时间(客观)
  • finishTime: sum(starTime, serviceTime, waitTime)
  • travelTime: 是时候做下一个任务了
  • earlyStart: 在这个时间之前任务可能不会开始
  • lateStart: 任务可能不迟于这个时间开始

用 LP 术语(忽略无聊的东西):

  • 目标:最小化waitTime
  • 受制于:
    • earlyStart <= startTime
    • startTime <= lateStart

顺序是固定的,所有作业必须按顺序一次执行一项。如果没有找到可行的解决方案,我将不返回任何内容,尽管在大多数情况下,我从一个可行的解决方案开始,但它不一定是最佳的。我在这方面的尝试花费了 O(n!) 时间,所以我很确定有一个更好的方法我没有考虑。这似乎是一个很常见的问题,我很确定它甚至不是 NP 完全的,但我找不到它的名称来进一步研究。我正在用 JavaScript 编写它,但欢迎任何想法、链接、伪代码或超高性能 C++ 实现!

【问题讨论】:

  • 你说“订单是固定的”。优化器会做出哪些选择?优化器能否决定跳过某个作业,即使它在其窗口内?一次可以运行多少个作业?
  • 好点,我更新了上面的最后一段。一次只能运行 1 个作业,并且不能跳过任何作业。优化器只能调整waitTime变量,这反过来会影响任务的完成时间,从而导致后续任务的开始时间发生变化。

标签: javascript algorithm math optimization


【解决方案1】:

这个问题相当于最小化最后一个任务的开始时间和第一个任务的开始时间的差值。等价的原因是,如果你将任何任务的开始时间推到中间,整体等待时间不会改变(任务后的等待时间减少了与任务扩展前的等待时间相同的量) .

一个简单的 O(n^2) 算法如下:

  • 让第一个任务尽可能晚开始。
  • 迭代剩余任务
    • 根据上一个任务找出最早可能的开始时间
    • 如果这是不可能的(因为这个时间晚于lateStart,将前一个任务尽可能少地推向开始。如果它与前一个任务发生冲突,则在此处执行相同的操作,依此类推。
    • 如果需要在earlyStart之前推送第一个任务,没有办法。

如果将所有任务(或同时包含第一个和最后一个任务或都不包含它们的子集)推送固定的时间量是可能的,则可能没有唯一的解决方案。

【讨论】:

  • 啊,这是我在第 2 步中遇到的反向循环。无需担心独特的解决方案,因为 waitTime 发生的位置无关紧要。这看起来很棒,干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多