均匀调度多个经常性作业的算法

时间:2014-07-07 04:01:40

标签: python algorithm

问题:

考虑到一系列重复性任务,并了解每次采取需要多长时间以及必须重复的次数,请创建一个能够最均匀地分配执行任务的时间表。

例如,我必须每2天“运行防病毒软件”,“碎片整理硬盘”和“更新计算机”,我必须每3天“更新一次硬件”,“清理内部”,我必须“更换硬盘“,”替换显卡“,”每隔5天更换一次CPU“。每个家务活需要一定的时间,只需几分钟。

根据这些信息,我应该在每个月的哪几天做家务?

尝试:

我已经“解决”了这个问题两次,但每个解决方案都需要100多万年的时间来计算。

我使用的第一个算法生成了所有可能的“天”,即可以运行的每个任务组合。然后,对于一个月内每个可能的天数组合,我检查了月份以查看它是否符合约束条件(任务每x天运行一次,日均匀分布)。这是最天真的方法,并且需要比宇宙时代更长的python来检查。

我正在运行的算法也可以运行。它为每个任务生成了每月可能的“日计划”,即,我可以在第1天,第2天,第3天,第4天或第5天开始执行每5天一次的任务。然后,对于每天计划的每个组合,我将日计划加起来形成一个月计划。然后,我总结了那个月每天的每项任务的时间,看看它的票价。这个算法必须通过1e14组合运行,如果用编译语言编写并在一个巨大的集群中并行执行几天,这可能是可能的......

摘要

我想知道是否有更好的方法来做到这一点。总而言之,我有一些任务,必须每隔x天重复一次,并希望在给定的月份内分散它们,以便每天在这些任务中充满相同的时间。

谢谢。

2 个答案:

答案 0 :(得分:0)

我对此的第一次尝试是认识到这个时间表是定期的,因此确定时间表周期是什么(所有时期的LCM)。从那里,你可以想到像甘特图一样的一切。对于每个任务,您需要选择一个相位偏移,以最大化跨任务的开始时间之间的距离。我不确定你能用它代数计算它,但你可以在它上面运行梯度下降。

答案 1 :(得分:0)

您可以尝试一些本地搜索算法(例如爬山,模拟退火)。

基本上你开始使用候选解决方案(任务的随机分配),评估它(你需要提出一个评估函数),然后检查每个邻居状态的值并转移到一个最高价值。邻居状态可以是所有状态,其中一个任务被移动一天到未来或过去。你重复这个,直到状态值没有进一步改善。

现在你应该找到评估函数的局部最大值,这可能不是最佳解决方案。然而,由于算法速度非常快,您可以通过不同的起始分配重复使用它,并找到一个好的解决方案。您也可以通过包含随机步骤来“软化”算法的贪婪。