所以我的工作分配问题没有匈牙利方法所需的传统成本。
例如:
I have 3 workers - A, B and C
I have 5 jobs - 1, 2, 3, 4 and 5
每个工人都有他可以执行的工作清单,如下所示:
worker A can work on job 1, 2, 5
worker B can work on job 1, 2
worker C can work on job 1
最终结果(因为没有成本)是我可以实现的最大分配数。在这个例子中,我最多可以完成3个任务:
worker A on job 5
worker B on job 2
worker C on job 1
匈牙利方法是解决这个问题的好方法吗?我应该只使用“虚拟”费用吗?我想也许可以使用工作偏好的指数作为成本;这是一个好主意吗?
答案 0 :(得分:6)
匈牙利算法可以在这里工作,但未加权最大二分匹配(如Hopcroft–Karp的算法会更快。
答案 1 :(得分:5)
将费用-1分配给他们可以的工作,其他工作为零。
然后运行匈牙利语算法,它会给你答案(事实上它将返回-answer)。
不要用一些大数字来做,这可能会导致溢出(除非你非常谨慎地实施匈牙利语。)
实际上,它是二分图中的最大匹配,并且有很多方法可以解决这个问题,请参阅维基页面:
http://en.wikipedia.org/wiki/Matching_(graph_theory)#Maximum_matchings_in_bipartite_graphs
PS:Hopcroft-Karp算法比匈牙利语更快,也更简单。值得一试。一些编译方法比这两种方法更快,但不建议首先学习这些算法。
PSS:您在stackoverflow中的ID是一种解决此问题的方法。这是一种网络流量方式。它被称为最短参数路径(sap)。见:http://coral.ie.lehigh.edu/~ted/files/ie411/lectures/Lecture11.pdf
答案 2 :(得分:2)
虚拟成本应该可以解决问题。为他们可以完成的任何工作分配成本1,并将无限成本(如果您的系统允许)分配给他们无法完成的工作。匈牙利算法旨在最大限度地降低所有任务的总成本,因此它可以自然地解决问题。不应该考虑你认为他们的工作偏好是什么;这是算法的工作。
答案 3 :(得分:1)
匈牙利语算法将为您提供答案,但不要使用无穷大费用,因为您无法比较(infinity + infinity)
和infinity
(除非您自己比较费用)。
A: 1, 2, 3
B: 1
C: 1
矩阵形式:
1 2 3
A 1 2 3
B 1 inf inf
C 1 inf inf
您的计算机如何比较1, inf, inf
和2, 1, inf
?
相反,使用一些如此大的成本以保证不会被分配(是的,小心溢出)。