我们有一份工人清单和一份分配给这些工人的任务清单。每个任务都属于特定类别(大约10000个类别,大约10000个任务)。每个工作人员可以处理一组类别(每个工人大约5个类别)。此外,每个工人都有最多可分配给他的任务。
我们需要将任务分配给工人,以便
a)可分配的最大任务数量
b)没有工人被分配任务,这是在工人类别集之外的任务
c)如果可以分配给他的任务,则没有工人闲置
d)分配给任何工人的任务数量应小于其最大分配
示例数据:
a)任务类别关系
T1 - C1
T2 - C1
T3 - C1
T4 - C2
T5 - C1
T6 - C3
..... (around 10k tasks, 50 categories)
b)工人 - 类别 - 最大任务数
W1 (100) - C1
W1 (100) - C2
W2 (20) - C1
W2 (20) - C3
..... (around 50 workers, each can work on around 5 categories).
Where 100 for W1 means W1 can be assigned maximum 100 tasks
(across all categories, it is mapped with).
我试过循环工人并完成他们相关的任务并逐一完成他们的任务,但它有一个漏洞,对于一些工人很少的类别,任务不公平,一些工人闲置有些类别还有剩下的任务,可以通过将任务改组给其他工作人员来更有效地分配任务。
例如,如果C1有2000个任务,三个工人W1,W2,W3各有1000个最大任务。和C2有1000个任务,仅与W1相关联。 如果我们将C1任务分配给W1和W2到它们的全部容量(每个1000个任务),我们就不能分配C2的任务,因为相关的工作人员W1已经完全被C1占用。如果我们将C1任务分配给W2和W3,我们可以分配所有任务。
我需要一些能够有效而公平地完成任务的算法。如果有人已经解决或知道我可以使用/探索的可能的解决方案/资源,请建议。
答案 0 :(得分:2)
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlow2
“最大二分匹配”的示例是经典的“为工作者分配工作”任务。您只需要将每个工作者仅链接到其类别中的任务。图论是你的朋友。