有一名工人,一次只能执行一项任务(但可以立即在任务之间切换)
给出一系列任务,
- 定义为“n秒,每m秒”(例如,每36秒5秒)
我怎样才能找到最佳的起始时间并计算每项任务?
如果每个任务都是“1秒,每60秒”,则每个任务都有一个唯一的起始秒,计数将是无限的(稳定状态)。
如果是“每4秒1秒”和“每3秒1秒”,结果将是:“0,无限和3次,3次”
- 希望最简单的形式
如果我已经有了一个任务列表,详细说明了“开始第二次和多次”,那么返回的函数是什么:{start,count}另外{m seconds每m秒}任务看起来像什么? / p>
-
(稍微复杂的形式 -
如果不是“每秒m秒”,
任务被定义为“每秒l..o秒n秒”,
在哪里我可以在l - o范围内选择一个数字m(但是在完成任务之前必须承诺那个m),
这会让更好的工人利用吗?
我如何选择最好的'm'?
答案 0 :(得分:1)
我认为这取决于你如何定义'最佳'。例如,如果您希望任务平均每隔m秒运行一次,那么可以使用与Bresenham方法相同的算法来绘制线条(一个每秒m秒的任务)比如在画线时在m个水平步骤中散布n个垂直步长。为每个任务分配一个计数器和一个步长值(“每3秒1秒”,步长为1/3)。然后在每个'周期'中将步骤添加到计数器。当计数器超过零时,该任务应该运行(并从计数器中减去1)。如果您有多个计数器高于零,请选择最大的计数器。对于稍微复杂的形式,这可能会给你一个“足够好”的解决方案。
“1/4”和“1/3”示例虽然听起来像是要求“完全”分开运行任务。从列表开始并添加新任务以最大化计数并不是一个困难的搜索问题 - 但我不认为这是您需要的。在添加A然后B之后,A(1/4)B(1/4)C(1/2)示例将给出A B x x A B x x。然后C无法添加,
我认为健身功能有明显的候选者 - 一个n,m,start表可以有一个适应度函数,它是调度不超过一个任务的时间的一部分。如果存在GA /退火,则很有可能找到稳态解。但是在像(1/4),(1/3)这样的情况下似乎没有稳态解,定义'最佳'也应该定义你的适应度函数。
答案 1 :(得分:0)
这类问题难以解决,但相对容易优化。看一下Simulated Annealing,Great Deluge或Genetic Algorithms。
答案 2 :(得分:0)
嗯,这里有一点建议:如果m的最大公约数大于或等于n的总和,则解是稳态。
我会选择具有n的最大总和的任务集,这样m的gcd大于或等于该总和。
答案 3 :(得分:0)
见w:Scheduling (computing)。该链接包括一个很好的调度策略列表:
[Scheduling]指的是方式 流程在a中分配优先级 优先队列。这个任务是 由称为a的软件进行 调度。调度程序是关注的 主要有:
- CPU利用率 - 保持CPU为 尽可能忙。
- 吞吐量 - 完成的进程数 他们按时间单位执行。
- 周转时间 - 到达的时间 执行一个特定的过程。
- 等待时间 - 时间量a 过程一直在等待 准备好队列。
- 响应时间 - 金额 从请求开始所需的时间 直到第一次提交 反应就产生了。