我们有N
名工作人员,他们应该被分配到M
个团队中的一个。每个团队最多可以有K
个工作人员。每个工作人员按照优先顺序对团队进行排名,从最优选团队的1
到最不受欢迎团队的M
。现在的问题是找到一个匹配,以便工人最终进入他们最喜欢的团队,因为每个团队最多可以有K
个工人。
首先我想,这是Assignment problem,可以使用Hungarian Algorithm来解决。但后来我意识到匈牙利算法只能在每个工作人员分配给一个项目时使用。但就我而言,可以将几名工人分配到同一个团队。
现在我不确定这是什么类型的问题。这是(多个)Knapsack problem还是Bin packing problem?我可以用什么样的算法来解决这个问题?
答案 0 :(得分:2)
有两种方法可以解决这个问题,哪种方法效率更高,取决于您拥有的人数和团队数量,以及K
的大小。
更简单的方法(在@Alex L。答案中已经提到过)是将每个团队分成K
个团队,并将问题转换为常规加权二分匹配,这可以解决用匈牙利算法。现在,匈牙利算法的复杂性为O(n^2 * m)
。在这里,我们选择n
为人数,m
为团队数量。在我们将每个小组分成k
后,最终的复杂性将为O(n^2 * m * k)
。
另一种方法是将此问题视为最小成本最大流问题。您构建了一个图表,其中源和汇是两个额外的节点,所有工作人员都直接连接到容量为1
且权重为0
的源,所有团队都连接到容器{{1} }和权重k
,以及与容量为0
并且费用取决于其偏好的团队相关联的工作人员。最低成本最大流量具有复杂度1
。现在,如果我们选择的工作人员数量为O(n^3 * m)
,团队数量为n
,我们会得到严重比匈牙利人更糟糕的事情(因为大概是m
)。但是,如果我们将k < n
作为团队数量,并且n
成为工人数量,那么如果工人数量很大,团队数量很少,我们可能会得到比匈牙利人更好的东西。 m
也很大。
所以这一切都取决于你的约束。如果k
明显小于m
和k
,则最好使用最低费用最大流量,否则只需将团队分成n
并使用vanilla匈牙利算法。< / p>
答案 1 :(得分:1)
通过小调整,它可以成为分配问题:
如果您将每个团队复制到容量为1的K
个团队中,那么您需要将每个工作人员分配给一个团队,并且每个团队只能分配给一个工作人员。
在分配问题中,代理和任务的数量不必相等。
答案 2 :(得分:0)
这是stable marriage problem。基本情况允许 1-1 匹配,但它可以很容易地推广到允许 1-K 匹配。在 1-K 匹配的情况下,团队不需要都具有相同的规模。团队也可能偏爱某些特定的工人,或者可能平等地偏爱所有工人。
如果团队没有偏好,这相当于首先将所有工作人员分配到他们最喜欢的团队。然后,如果任何团队被超额认购,则将额外的工人溢出到他们的第二个偏好中。重复直到分配所有工人。