区间调度算法几乎都是基于结束时间排序作业,但如果调度作业A意味着您必须安排作业C,那该怎么办。
例如,假设您正在尝试安排广播节目,节目A在周一上午10点到11点和下午2点到3点运行,但节目B在周一1:30-2:30运行?你不能只运行程序A的10-11部分。它全有或全无。或者,假设程序在周一,周三,周五运行,但每天都在不同的时间运行。
我曾经玩过的想法:
最短路径算法,您可以同时遍历一周中每一天的7个图表,每个图表都排序为仅连接之后的程序。如果你在星期一选择节目A,你可以在所有日子里选择它,如此。如果程序需要在一天内运行两次,此解决方案无法解决问题。
为n个程序生成n×n矩阵,并检查每个程序与其他程序的兼容性。遍历图表,其中每个程序仅与非冲突程序连接。有点坚持这个想法,完全寻找下一步或新想法。
答案 0 :(得分:1)
我对调度的经验法则是,除了一些特殊情况外,几乎所有东西都是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),以及从多个随机开始的普通爬山。我建议,无论你做什么,你最后都会进行一次爬坡,旨在发现人们可以发现的小改进,以确保你的计算机没有制定人们可以明显改进的时间表。
答案 1 :(得分:0)
我刚刚在CS Stack Exchange上提出了这个问题,因为这个问题很久了,而且所接受的答案中的等价词有些微。在此处重新发布我的答案以提高知名度:
这等效于最大加权独立集问题-给定一个具有加权顶点的图,找到一个顶点的子集,以使子集中的两个顶点在图中不相邻并且其权重之和最大化。 / p>
要解决的图形是一种区间图,其中每个顶点代表一组相关区间,其权重是区间权重的总和。如果两个顶点的一个或多个间隔重叠,则会在两个顶点之间绘制一条边。
我还不确定这种说法是否容易处理。虽然问题是NP难题,但我们知道可以有效地解决某些类型的图,包括区间图,其中每个顶点代表一个区间。有关已知算法,请参见Independent Set Wikipedia page。