将同一队列项目分配给多个工作者



我们有一个任务的逻辑队列,其中每个任务都必须分配给多个工作者。要分配的工作人员数量基于"最少工作人员"one_answers"最多工作人员"的配置。工人不应该看到他们已经完成的相同任务。没有必要让所有的工人都能看到所有的任务。

工作人员总数可以动态更改。每个员工都可以随时在线或离线。

每个工作人员都可以选择完成任务或让任务过期。任务到期后,应将任务分配给任何尚未完成任务的员工。

有没有一个好的算法来解决这种情况?

简单的解决方案:

贪婪地分配任务:

  • 对于准备好的每一项任务
  • 查找最小值<=N<=最大工人还没有看到任务并分配给他们
  • 重复此步骤,直到您任一次跑步或完成所有任务
  • 如果工作人员联机或完成任务,请重新检查所有任务
  • 如果出现新任务,请重新检查可用的工作人员

如果没有那么多任务,这个解决方案可能就足够了,因为它计算量很大,并且会重新计算所有内容。

可能的优化:

如果贪婪的解决方案失败了(而且很可能会失败(,有一些方法可以改进。我会尝试列出我脑海中的那些,但它不会是一个详尽的列表。

首先,我个人最喜欢的是:网络流量。不幸的是,我看不到一种简单的方法来解决最低数量的工人要求,但这会很快,而且会导致在任何特定时刻都有尽可能多的工人被分配。

  • 创建网络源-工作者-任务-接收器。边缘工作者到任务将根据需要进行链接和取消链接:
  • 当工作人员可以执行任务时,创建权重为1的边,否则不要创建边
  • 从源链接一个边缘,权重为每个在线工作者一个
  • 从每个任务链接到一个边缘,其权重等于其最大工作能力

你甚至可以区分不同类型的工作者,网络流非常棒。这些算法速度快,甚至适用于大型图。此外,它们在许多库中都可用,因此您不必自己实现它们。不幸的是,没有简单的方法来执行最低限度的工人规则。至少我现在没有看到,也许有办法。或者至少是一个启发式

第二,既聪明又贪婪

  • 为每个任务创建一个队列
  • 当工作人员可用时,将他可以执行的每一项任务都注册到其队列中
  • 当工作人员不可用时,将其从队列中删除
  • 当任务有足够的工作人员时,启动进度并禁用这些工作人员

这仍然是蛮力方法,但由于保留了队列,因此将必要的计算量限制在合理的水平。潜在的不利因素是,大型任务(工人人数很少(可能会被更容易开始的小型任务所阻碍,并会吃掉工人。因此,可能需要进一步的检查/平衡和优先级排序。

肯定还有更多的尝试&完成手头的任务,但是你提供的信息相当有限,所以这个建议没有那么具体。

相关内容

  • 没有找到相关文章

最新更新