具有依赖作业/具有多个所需运行时间的作业的加权间隔调度

Posted

技术标签:

【中文标题】具有依赖作业/具有多个所需运行时间的作业的加权间隔调度【英文标题】:Weighted Interval Scheduling with dependent jobs/job with multiple required running time 【发布时间】:2017-09-02 00:18:46 【问题描述】:

间隔调度算法基本上是基于按结束时间对作业进行排序,但是如果调度作业 A 意味着您必须安排作业 C。

例如,假设您要安排广播节目,而节目 A 在周一上午 10 点至上午 11 点和下午 2 点至下午 3 点运行,但节目 B 在周一 1:30-2:30 运行?您不能只运行程序 A 的 10-11 部分。要么全有,要么全无。或者,假设程序在周一、周三、周五运行,但每天的时间不同。

我玩过的想法:

最短路径算法,您可以在一周中的每一天同时遍历 7 个图表,每个图表都经过排序以仅连接后面的程序。如果您在星期一选择程序 A,则您在所有日子都选择它,依此类推。如果程序需要在一天内运行两次,此方案无法解决问题。

为 n 个程序生成一个 n×n 矩阵并检查每个程序与其他程序的兼容性。遍历每个程序仅与非冲突程序连接的图。有点坚持这个想法,并完全寻找下一步或新想法。

【问题讨论】:

【参考方案1】:

我刚刚在CS Stack Exchange 上重新提出了这个问题,因为这个问题已经过时了,并且接受的答案中的等效性有点脆弱。在这里重新发布我的答案以获得更高的知名度:

这相当于最大加权独立集问题 - 给定一个带有加权顶点的图,找到一个顶点子集,使得子集中没有两个顶点在图中相邻并且它们的权重之和最大化。

正在解决问题的图是一种区间图,其中每个顶点代表一组相关区间,其权重是区间权重的总和。如果两个顶点的一个或多个间隔重叠,则在两个顶点之间绘制一条边。

我还没有确定这个公式是否易于处理。虽然这个问题是 NP 难的,但我们知道它可以有效地解决某些类型的图,包括每个顶点代表单个区间的区间图。请参阅Independent Set Wikipedia page 了解已知算法。

【讨论】:

【参考方案2】:

我的调度经验法则是,除了少数特殊情况外,几乎所有事情都是 NP 完全的。假设您可以找到一天中每个小时都排满的时间表,假设可能的程序需要任意数量的断开连接的时隙。然后你可以解决https://en.wikipedia.org/wiki/Exact_cover - X 的元素是时隙,子集 S 是程序。精确覆盖对应于调度程序,这些程序填充每个时隙而不相互重叠。

我认为这意味着您正在寻找启发式方法,例如延迟接受爬山 (http://www.yuribykov.com/LAHC/)、有限差异搜索 (http://wiki.cs.pdx.edu/cs543-spring2010/important_algorithms.html) 以及从多个随机开始的普通爬山。我建议,无论您做什么,最后都以爬山式结束,旨在发现人们可以发现的小改进,以确保您的计算机不会生成人们可以做出明显改进的时间表。

【讨论】:

以上是关于具有依赖作业/具有多个所需运行时间的作业的加权间隔调度的主要内容,如果未能解决你的问题,请参考以下文章

该作业依赖于具有过期/已擦除工件的其他作业

无法为 Databricks 作业构建具有多个主类的 Spark 应用程序

Spark Sql 作业优化

GitLab,具有依赖性的手动作业

具有多个部署的单个 Jenkins 作业

具有多个频率的 Oracle 调度程序作业