我们有一个任务的逻辑队列,其中每个任务都必须分配给多个工作者。要分配的工作人员数量基于"最少工作人员"one_answers"最多工作人员"的配置。工人不应该看到他们已经完成的相同任务。没有必要让所有的工人都能看到所有的任务。
工作人员总数可以动态更改。每个员工都可以随时在线或离线。
每个工作人员都可以选择完成任务或让任务过期。任务到期后,应将任务分配给任何尚未完成任务的员工。
有没有一个好的算法来解决这种情况?
简单的解决方案:
贪婪地分配任务:
- 对于准备好的每一项任务
- 查找最小值<=N<=最大工人还没有看到任务并分配给他们
- 重复此步骤,直到您任一次跑步或完成所有任务
- 如果工作人员联机或完成任务,请重新检查所有任务
- 如果出现新任务,请重新检查可用的工作人员
如果没有那么多任务,这个解决方案可能就足够了,因为它计算量很大,并且会重新计算所有内容。
可能的优化:
如果贪婪的解决方案失败了(而且很可能会失败(,有一些方法可以改进。我会尝试列出我脑海中的那些,但它不会是一个详尽的列表。
首先,我个人最喜欢的是:网络流量。不幸的是,我看不到一种简单的方法来解决最低数量的工人要求,但这会很快,而且会导致在任何特定时刻都有尽可能多的工人被分配。
- 创建网络源-工作者-任务-接收器。边缘工作者到任务将根据需要进行链接和取消链接:
- 当工作人员可以执行任务时,创建权重为1的边,否则不要创建边
- 从源链接一个边缘,权重为每个在线工作者一个
- 从每个任务链接到一个边缘,其权重等于其最大工作能力
你甚至可以区分不同类型的工作者,网络流非常棒。这些算法速度快,甚至适用于大型图。此外,它们在许多库中都可用,因此您不必自己实现它们。不幸的是,没有简单的方法来执行最低限度的工人规则。至少我现在没有看到,也许有办法。或者至少是一个启发式
第二,既聪明又贪婪:
- 为每个任务创建一个队列
- 当工作人员可用时,将他可以执行的每一项任务都注册到其队列中
- 当工作人员不可用时,将其从队列中删除
- 当任务有足够的工作人员时,启动进度并禁用这些工作人员
这仍然是蛮力方法,但由于保留了队列,因此将必要的计算量限制在合理的水平。潜在的不利因素是,大型任务(工人人数很少(可能会被更容易开始的小型任务所阻碍,并会吃掉工人。因此,可能需要进一步的检查/平衡和优先级排序。
肯定还有更多的尝试&完成手头的任务,但是你提供的信息相当有限,所以这个建议没有那么具体。