我正在处理的软件应用程序需要能够根据他们目前拥有的任务数来为一组用户分配任务,其中具有最少任务的用户最有可能完成下一个任务。但是,当前任务负载应被视为加权,而不是绝对订单定义。 IOW,我需要实现加权的负载平衡算法。
假设有五个用户,其任务数如下:
答:4 B:5 C:0 D:7 E:9
我想为CABDE命令中的下一个任务确定用户的优先级,其中C最有可能获得分配,E最不可能。这里有两件重要的事情需要注意:
目前,我们可以将所有任务视为平等,但我不介意将任务作为我将来可以使用的变量包含在内 - 但这纯粹是锦上添花。
到目前为止我提出的想法在某些情况下并不是很好。如果用户数量很多,他们可能会过于密切地对用户进行加权,或者如果用户没有当前任务,他们可能会陷入困境,或者....
我试过在网上闲逛,但运气不好。任何人都可以给我一个运行良好的算法的快速摘要吗?我不需要实际的实现 - 我会做那部分 - 只是一个很好的描述。另外,有一个可以免费访问的好网站吗?
此外,虽然我当然欣赏质量,但这不一定在统计上是完美的。所以如果你能想到一个好的但不是很好的技术,我很感兴趣!
答案 0 :(得分: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)非线性归一化。使用对数函数(而不是线性减法)来加权数字是获得非线性归一化的简便方法。您可以使用它来扭曲概率,例如:使更多没有工作的工人更有可能得到更多。
关键是,这样做的方式实际上是无限的。您使用的加权函数取决于您尝试启用的特定行为。希望能给你一些你可以作为起点的想法。