【问题标题】:Optimal job interval algorithm最佳作业间隔算法
【发布时间】:2019-02-28 03:19:45
【问题描述】:

假设您有不同的作业需要定期运行(例如,您想要对不同的端点进行 API 调用)。 假设您需要访问两个不同的端点,并且您希望您的呼叫在时间上尽可能远离对方。

示例:您有两个作业,一个每分钟运行一次,另一个每分钟运行两次。

解决方案:以 60 秒的间隔启动作业 A,等待 15 秒,以 30 秒的间隔启动作业 B。 这样,作业将在几秒钟内运行:0(作业 A)、15(作业 B)、45(作业 B)、60(作业 A)、75(作业 B)、105(作业 B)、120(作业 A) , ... 将 API 调用之间的最大间隔设为 15 秒,同时保持我们需要的调用频率。

对于这些情况,您能否想出一种算法来为每个作业提供最佳开始时间,从而最大化调用之间的最小时间差?理想情况下,该算法可以处理两个以上的工作。

假设我们不需要等待作业完成再次运行它。

谢谢

【问题讨论】:

  • 互素数区间(例如 5 和 7)怎么办?
  • 是否也有可能无法安排? - 听起来与重新排列单词中的字母类似,因此它们相距 k 距离。是否给出了需要安排作业的时间间隔?像一个小时2小时左右?
  • @MBo 每个作业的开始时间可以是浮点数(例如,以毫秒为单位)。每种情况可能都没有完美的解决方案。如果作业将在某个解决方案中同时运行,并且该解决方案是我们能做的最好的解决方案,则应使用该解决方案。
  • @SamerTufail - 作业需要无限期地运行
  • 规律性有多重要?例如,如果 A 在时间 0 运行而 B 在时间 20 和 40 秒运行,那么在你的情况下会有多糟糕。 平均 A 每分钟运行一次,B 每 30 秒运行一次。但实际上 B 以 20 秒和 40 秒的间隔运行。

标签: algorithm intervals jobs job-scheduling


【解决方案1】:

如果我们允许间隔稍微不等,这是我的解决方案。

假设我们的调用是A[0]A[1]、...、A[n],频率为f[0]f[1]、...、f[n],其中频率都在同一个单元中.例如60/小时、120/小时等。

事件发生的总频率将为f = f[0] + f[1] + ... + f[n],这意味着每隔hour/f 时间就会安排一些事件。问题是什么时候会发生。

想象这个的方法是想象我们有一排装满水的桶。每次我们都会从我们面前最满的桶中倒出一个单位的水。

因为一开始我们实际上并不关心我们从哪里开始,让我们通过分配随机数来初始化一个数字向量,full[0], full[1], ..., full[n]。现在我们的算法看起来像这样的伪代码:

Every hour/f time apart:
    for each i in 0..n:
        fill[i] += f[i]/f
    i_choice = (select i from 0..n with the largest f[i])
    fill[i_choice] -= 1
    Do event A[i_choice]

这会导致事件的间隔尽可能远,但重复的事件会以略微不均匀的节奏发生。在您的示例中,这将导致每 20 秒执行一次遵循模式 ...ABBABBABBABB... 的事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2013-02-05
    • 1970-01-01
    相关资源
    最近更新 更多