2

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

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

A:4 B:5 C:0 D:7 E:9

我想按照 CABDE 的顺序对用户进行下一个任务的优先级,其中 C 最有可能获得任务,而 E 最不可能。这里有两件重要的事情需要注意:

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

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

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

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

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

4

1 回答 1

7

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

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

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

编辑:示例负载平衡功能

根据您的评论,这里有一些简单的功能示例,可以为您提供不同的平衡行为。一个基本问题是您是否想要确定性或概率性行为。我将分别举几个例子。

使用问题中的示例 - 当前分配了 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 < 0.25,A 得到工作,0.25< r < 0.45,B 得到工作,等等。

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

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

于 2009-09-11T09:53:16.393 回答