作业队列优化算法

时间:2009-06-23 14:57:53

标签: algorithm scheduling

我们有一个应用程序需要将作业分配给资源。资源具有许多属性,这些属性定义了它们对特定作业的适用性 - 一些是偏好,一些是硬约束(所有成员类型,例如“资源A适合具有颜色X,Y或Z的作业”)。

资源有与之相关的成本(他们在线上花费的时间)。我们有能力招募资源 - 这需要不同的时间。我们可以在固定的时间间隔内招募。

了解规模:在任何给定时间将有大约20个资源,100个未完成的工作。完成工作需要5-15秒。招募资源大约需要1-2分钟,我们可以在1-30分钟内招募(允许重新招募)。我们对提交的工作没有太多的提醒,可能只有几秒钟。

目标是在给定的平均延迟(作业完成时间)内完成成本最低(资源使用)的作业。

我非常感谢指向算法,软件库或解决此问题的方法。

9 个答案:

答案 0 :(得分:2)

可能希望查看knapsack problembin packing问题,因为这些问题原则上与您在此处尝试的内容相似。

在您的问题描述中,您提到目标是完成具有最低延迟的作业。如果这实际上是您唯一的目标,那么解决方案很简单 - 聘请所有可用资源。他们中的许多人很多时候都会闲着,但它几乎可以保证最低的延迟。

我怀疑你的真正目标是尽可能地减少延迟和空闲资源,所以在这里总是会有延迟和浪费资源之间的权衡。

答案 1 :(得分:1)

这感觉就像一些事情:经济订单数量,平衡前期招聘成本和运营成本; LP或IP,根据各种约束最小化总体成本的公式;然后是概率分布(招募时间;所需的工作资源?),使整个事物随机化。

这听起来足够复杂,如果我这样做,我可能会设置一个模拟。系统看起来并不太复杂,或者在数学上太繁重而无法运行大量迭代或长时间运行,因此您可以获得一些相当稳定和有用的结果。

答案 2 :(得分:0)

我会这样看......不确定它是否涵盖了所有内容。

1)“资源”实际上可以被视为“工作中心”。您打开工作“工作”的工作中心数量与登录系统的人员相关。

2)通过等待时间分配资源 - 他们等待工作的时间越长,他们在下一个请求的列表中应该越高。这样,没有人感冒或减速。您必须找到并设置一个阈值(相对于资源和作业)。您可以决定是否希望他们单击​​以获取下一个作业,或者让系统自动在作业之间获取作业

3)设置作业计划队列我不知道它是否相关,但可能有高优先级/低优先级作业等。您需要一个工作池,列出“按攻击订购。”工作计划中的每个工作都可以经历不同的阶段,因此您可以知道所有工作的位置,并知道何时完成下一个工作。作业计划程序将查找可用资源并将其分配给计划中的作业。这可能是您的调度系统的大部分大脑。

我希望你没有建立一个呼出呼叫中心:P

答案 3 :(得分:0)

我不知道有关这类问题的文献。我认为有一些,因为排队理论是一个很大的学术领域,这听起来像一个荒谬的人为的情况。请注意,您关心平均延迟而非最坏情况延迟或第N百分位延迟的事实可能会让您处于少数。

我的第一直觉是,由于周围似乎有大量工作,一个好的解决方案会让几个“灵活”的工人不断就业。这是一组工作人员,他们之间可以完成大多数类型的具有可接受延迟的常见工作。您希望延迟越低,此集合中的资源越多,它们花费的空闲时间就越多。此外,您输入的“突发”越多(假设突发是不可预测的),您需要的空闲时间越多,以防止在突发期间出现高延迟。

然后有两次你雇用了额外的“专业”工人:

1)一种罕见的工作类型,您当前的招聘人员只能在高成本时处理或根本不处理。所以你雇用(粗略地说)任何可以转移它的人,然后尽可能地完成其余的队列。

2)没有这样的工作,但是你发现有机会雇用一个恰好能够从当前队列中取出一些工作组合的人,并且比你现在的雇员更便宜地完成这些工作但是没有离开你目前招聘闲置。所以你雇用了这个资源。

至于实际的算法:找到最佳解决方案几乎肯定不是计算上可行的,所以正确的答案取决于处理资源,你正在寻找启发式和解决部分问题。只要你雇佣的每个人都很忙,而且你不能在未来的某个时候雇用其他人而不会造成大量闲置时间,你可能会在一个很好的解决方案附近,并且接近“每个降压最大的地方” “延迟/成本权衡点。之后雇用更多资源会带来收益递减,但这并不意味着您不愿意在指定的延迟和/或指定预算下执行此操作。

但这取决于传入的工作是什么样的:如果你的资源只能做一种类型的工作,而这项工作每天只能进行一次/周/年,那么一旦雇用它们可能会更好。这一天要等到你有足够的工作来填补他们的最小可能时间片(这就是为什么消防队员花大部分时间玩纸牌游戏,而打字员大部分时间都在打字。有足够的打字来保持至少一个打字员很忙,但是火灾是罕见的。此外,我们不希望火灾的“最大爆炸”解决方案,我们希望降低潜伏期。因此,如果您正在解决问题的一个特定实例而不是编写通用调度软件,那么可能有机会针对您的特定资源集和传入作业模式调整算法。

另外,如果资源是人类,你实际上并不能保证招聘成功。他们不会整天坐着,只有在每分钟都有工作的时候才能获得报酬,是吗?

答案 4 :(得分:0)

此问题可视为线性优化问题,因此this应该是一个开始。我已经使用了这个library但是它有很多其他的东西,所以它可能有点过分。相反,开发自己的库并不困难,this book有一个关于LP的好章节。

答案 5 :(得分:0)

我担心我没有一个简单的答案,但这里有一些更相关的资源来梳理思想。

On Multi-dimensional Packing Problems

A Vector-based Strategy for Dynamic Resource Allocation

答案 6 :(得分:0)

很棒的问题!!

我会研究动态编程,线性优化和排队理论。不幸的是,我没有真正简单的方法来回答这些问题。我没有必要的数学专业知识来为这些事情提供可靠的最佳答案。

然而,如果你热衷于这些事情,这听起来像是一个使用人工智能算法获得一个好的,虽然可能不是最佳的解决方案的机会。我会建议遗传算法或模拟退火炉。这些中的任何一个都不会花很长时间来编码。我们的想法是你选择随机有效的输入,你可以调整这些潜在的解决方案,随着时间的推移将它们演变成更好的解决方案(或自动选择新的解决方案)。这些是获得最佳答案和永远花费在编码和证明正确性之间的良好折衷。

答案 7 :(得分:0)

这听起来非常像Real-Time Operating System调度。维基百科详细介绍了一些使用的算法:

  
      
  • 合作调度      
        
    • 循环赛程安排
    •   
  •   
  • 抢先式调度      
        
    • 固定优先级预先调度,一个实现   抢先时间切片
    •   
    • 关键部分抢占式调度
    •   
    • 静态时间安排
    •   
  •   
  • 最早的截止日期第一种方法
  •   
  • 使用随机和MTG进行高级调度
  •   

答案 8 :(得分:0)

一些想法:

  • 是否有可以组合在一起的作业组 - 所有作业都具有相同的基本要求?
  • 是否有人也可以成为团体 - 所有人都具备基本技能

如果是这样,你可以从一开始就减少一些复杂性,然后对偏好使用某种形式的加权平均值。此外,当你招募,从最小。您可以招募30分钟,并假设它们的成本较高,您可能希望确保它们具有最高的利用率。

以下是一些可能有用的文章: