【问题标题】:Distribute list of tasks evenly among list of employees在员工列表中平均分配任务列表
【发布时间】:2021-09-01 20:47:45
【问题描述】:

我想在活跃员工列表中平均分配警报/通知列表,以确保每个人都有相似的职责。我目前收到要分配的警报列表和活动用户以及每个人当前分配的活动数量。截至目前,我只设法以与 for 循环迭代相同的顺序实现分布,但我想不出一种方法来均匀地做到这一点。

例如:

  • e1 有 1 个警报
  • e2 有 1 个警报
  • e3 有 3 个警报

我想将任务分配给 e1 和 e2,直到它们达到 3,然后循环可以正常继续,直到它用完警报。

Employee 是一个包含 {"id": "oid", "alerts": int} 的字典 unassignedAlerts 只是 ObjectIds 的列表

代码:

for alert in unassignedAlerts:
                for employee in activeEmployees:
                    if employee ["alerts"] > maxAlerts:
                        maxAlerts = employee["alerts"]
                    elif employee ["_id"] in activeUsers:
                        operations.append(
                            UpdateOne({"_id": alert}, {"$set": {"employeeResponsible": employee["_id"], "status": "assigned"}})
                        )
                        employee["alerts"] += 1

感谢任何想法。

【问题讨论】:

    标签: python arrays mongodb loops load-balancing


    【解决方案1】:

    这是一个经典的负载平衡问题。蛮力法是反复寻找当前警报数量最少的员工:

    for alert in unassigned_alerts:
        assigned_employee = min(active_employees, key=lambda e: e["alerts"])
        assigned_employee["alerts"] += 1
        ...
    

    这在O(m*n) 时间运行,其中m 是未分配警报的数量,n 是活跃员工的数量。

    您可以使用最小堆数据结构将其改进为O(m*log(n)),以找到最佳员工。 Python 在heapq module 中提供了一个内置的最小堆实现。要使用它,您可以将员工存储为对列表(长度为 2 的元组),其中第一个元素是警报的数量,第二个元素是包含其他信息的字典:

    import heapq
    
    
    active_employees = [
        (3, {"name": "John", "id": 1}),
        (5, {"name": "Jane", "id": 2})
    ]
    heapq.heapify(active_employees)
    
    for alert in unassigned_alerts:
        num_alerts, assigned_employee = heapq.heappop(active_employees)
        heapq.heappush(active_employees, (num_alerts+1, assigned_employee))
        ...
    

    最后,我应该提一下,您不需要总是分配给具有最小负载的员工。您可以通过简单地随机挑选两名员工然后分配给工作较少的员工来实现非常好的平衡(很有可能)。有关详细信息,请参阅此出色的 blog post

    【讨论】:

    • 谢谢!我会研究这个,因为我真的很关心性能,因为它将在无服务器云功能上运行,所以时间就是金钱。
    • 最后,我只是像你在上一段中提到的那样完全随机分配作业,我发现它在不牺牲性能的情况下工作得很好。
    • @DiegoTrigueros 是的,两个随机选择的威力很大,因为它只需要固定时间来完成每个任务,而且预期效果很好。
    猜你喜欢
    • 2012-10-08
    • 2014-05-19
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多