【问题标题】:Weighted, load-balancing resource scheduling algorithm加权、负载均衡的资源调度算法
【发布时间】:2010-11-27 10:53:14
【问题描述】:

我正在开发的软件应用程序需要能够根据一组用户目前拥有的任务数量为他们分配任务,其中任务最少的用户最有可能获得下一个任务。但是,当前的任务负载应该被视为一个权重,而不是一个绝对的顺序定义。 IOW,我需要实现一个加权的负载平衡算法。

假设有五个用户,任务数如下:

答:4 乙:5 C: 0 D: 7 E: 9

我想按照 CABDE 的顺序为下一个任务确定用户的优先级,其中 C 最有可能获得任务,而 E 最不可能。这里有两点需要注意:

  • 用户数量可以从 2 个到几十个不等。
  • 分配给每个用户的任务数量可以从 1 到数百不等。

目前,我们可以平等对待所有任务,尽管我不介意将任务难度作为我将来可以使用的变量 - 但这纯粹是锦上添花。

到目前为止,我提出的想法在某些情况下并不是很好。如果有大量用户,它们可能会将用户的权重过于紧密地放在一起,或者如果用户没有当前任务,它们可能会变得平淡,或者......

我试过在网上四处寻找,但运气不佳。谁能给我一个可以很好地工作的算法的快速总结?我不需要实际的实现——我会做那部分——只是一个很好的描述。或者,是否有一个可以免费访问的好网站?

此外,虽然我当然很欣赏质量,但这并不需要在统计上是完美的。所以如果你能想到一个好的但不是很好的技术,我很感兴趣!

【问题讨论】:

    标签: algorithm language-agnostic scheduling load-balancing resource-scheduling


    【解决方案1】:

    正如您所指出的,这是一个负载平衡问题。这并不是一个真正的调度问题,因为您并没有试图最小化任何事情(总时间、并发工作人员的数量等)。没有特殊限制(工作持续时间、时间冲突、要匹配的技能集等)所以你的问题归结为选择合适的权重函数。

    您说有些情况要避免,例如用户权重过于接近。你能提供更多细节吗?例如,让分配的机会与当前工作量成正比,由其他工人的工作量标准化有什么问题?您可以将其可视化为一系列不同长度的块(任务),被打包到一组箱(工人)中,您试图在其中尽可能保持箱的总高度。

    有了更多信息,我们可以就可能适合您的功能提出具体建议。

    编辑:负载平衡函数示例

    根据您的 cmets,以下是一些简单函数的示例,它们可以为您提供不同的平衡行为。一个基本问题是您是否想要确定性或概率性行为。我将分别举几个例子。

    使用问题中的示例 - 当前分配了 4 + 5 + 0 + 7 + 9 = 25 个工作。你想选择谁得到工作 26。

    1) 简单任务场。 对于每项工作,始终选择当前待处理工作最少的工人。快速的工人有更多的事情要做,但每个人几乎都在同一时间完成。

    2) 保证公平的工作量。如果工人以不同的速度工作,并且您不希望某些人比其他人做得更多,那么跟踪每个工人的已完成 + 待处理工作的数量。分配下一个工作以保持这个数字均匀分布(快速工人获得免费休息)。

    3) 基本线性归一化。 选择每个工人可以拥有的最大工作数量。每个工人的工作量都标准化为该数字。例如,如果作业/工人的最大数量为 15,则可以在达到容量之前再添加 50 个作业。所以对于每个工人来说,被分配下一份工作的概率是

    P(A) = (15 - 4)/50 = 0.22  
    P(B) = (15 - 5)/50 = 0.2  
    P(C) = (15 - 0)/50 = 0.3  
    P(D) = (15 - 7)/50 = 0.16  
    P(E) = (15 - 9)/50 = 0.12
    

    如果您不想使用特定的最大阈值,您可以使用当前待处理作业数量最多的工作人员作为限制。在这种情况下,那是工人 E,所以概率是

    P(A) = (9 - 4)/20 = 0.25  
    P(B) = (9 - 5)/20 = 0.2  
    P(C) = (9 - 0)/20 = 0.45 
    P(D) = (9 - 7)/20 = 0.1  
    P(E) = (9 - 9)/20 = 0
    

    请注意,在这种情况下,标准化可确保无法为工人 E 分配任何工作 - 他已经处于极限状态。此外,仅仅因为 C 无事可做并不意味着他一定会得到一份新工作(只是更有可能)。

    您可以通过生成一个介于 0 和 1 之间的随机数 r 并将其与这些边界进行比较来轻松实现选择功能。因此,如果 r r

    4) 非线性归一化。 使用对数函数(而不是线性减法)来加权您的数字是获得非线性归一化的简单方法。您可以使用它来扭曲概率,例如使没有很多工作的工人更有可能获得更多。

    关键是,这样做的方法的数量实际上是无限的。您使用的加权函数取决于您尝试启用的特定行为。希望这为您提供了一些可以用作起点的想法。

    【讨论】:

    • 我对这种方法很好;我只是不确定要使用一种好的标准化技术。我尝试了一些方法(不记得确切,抱歉 - 但是使用所有工人的平均工作量,工人与最高工作量之间的工作量差异等),但我不喜欢这些数字跨越不同的数据集。例如,如果我有 50 名工作人员的负载最多为 15,那么负载为 1 的负载和负载为 15 的负载之间的差异可能很小。我确信这很简单,我只是没有看到解决方案。我的统计数据和 OR 课程是很久以前的事了! :-)
    • @unknown(谷歌):好的。我在回答中添加了一些具体示例。希望这有帮助!
    • 非常有帮助,谢谢。不过,快速提问:在这个例子中,你是如何得出值 20 的:P(A) = (9 - 4)/20 = 0.25 P(B) = (9 - 5)/20 = 0.2 [... ]
    • 这是可用的空闲作业槽数(该示例中最大为 9):(9-4) + (9-5) + (9-0) + (9-7) + (9-9) = 20
    • 这个答案对我有很大帮助——希望我能再点击几次。
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多