有效地减少时间约束任务之间的等待时间
Efficiently minimize wait time between time-constrained tasks
我有一个任务数组,其中每个任务是一个具有以下属性的对象:
-
startTime
:任务启动时间(previous finishTime + travelTime
) -
serviceTime
:任务完成所需的时间 -
waitTime
:空闲时间(目标) -
travelTime
: time to get to next task -
earlyStart
:任务可能不会在此时间之前启动 -
lateStart
:任务可能不迟于此时间
finishTime
: sum(starTime, serviceTime, waitTime)
在LP术语中(忽略无聊的东西):
- 目标:最小化
waitTime
- 主题:
-
earlyStart <= startTime
-
startTime <= lateStart
-
顺序固定&所有作业必须按顺序一次执行一个。如果没有找到可行的解决方案,我就不返回任何东西,尽管在大多数情况下,我从一个可行的解决方案开始,但它不一定是最优的。我的尝试花了O(n!)时间,所以我很确定有更好的方法,只是我没有考虑。这似乎是一个相当普遍的问题& &;我很确定它甚至不是np完备的,但我找不到它的名字来进一步研究。我是用JavaScript写的,但是任何想法、链接、伪代码或高性能的c++实现都是欢迎的!
这个问题相当于最小化最后一个任务的开始时间与第一个任务的开始时间之差。等效性源于这样一个事实,即如果您将任何任务的开始时间推到中间,则总体等待时间不会改变(任务扩展后的等待时间减少的量与任务扩展前的等待时间相同)。
一个简单的O(n^2)算法如下:- 让第一个任务越晚越好。
- 迭代剩余的任务
- 根据前面的任务查找尽可能早的开始时间
- 如果不可能(因为此时间晚于
lateStart
),则尽可能少地将前一个任务推到开始位置。如果它与前一个任务发生冲突,则在那里执行相同的操作,依此类推。 - 如果您需要在
earlyStart
之前推送第一个任务,则没有解决方案。
如果可能将所有任务(或同时包含第一个和最后一个任务的子集或两者都不包含的子集)按恒定的时间推入,则可能没有唯一的解决方案。
相关文章:
- 在Chrome开发工具中测量步骤之间的时间
- 如何在数组中循环,等待每个项目之间的时间
- 如何调试$ionicView.beforeEnter和$ionicView.enter之间的时间
- 日期和unix时间之间的时间,以及计时器倒计时
- 在 PhantomJS 中在页面上下文中的控制台日志之间等待一段时间
- AJAX 发送和接收之间的时间返回负值
- Date 对象在尝试计算 IE8 中两个日期之间的时间时返回 NaN
- 在本地存储中设置的两个值之间减去时间
- 有没有办法仅使用 JavaScript 来操纵控制台.log输出和下一个用户输入提示之间的时间
- jQuery 设置函数执行前的等待时间
- 在 UTC 和特定时区之间转换时间 - 新的国际化 API
- 1 个同时下载 + 强制等待时间 + 亚马逊 S3
- 避免两个视频之间的时间间隔
- 使用带有等待时间的requestAnimationFrame
- 检查两次之间的时间间隔
- 我们在firefox开发工具中所说的等待时间是什么意思
- 按下键和向上键之间的时间
- 在方法执行之间等待一段时间
- Javascript + Imacro步骤和循环段之间的随机等待时间代码Bug
- 有效地减少时间约束任务之间的等待时间