我有一个分配问题的变体,通常的Munkres /匈牙利算法似乎没有能力解决。
在传统的分配问题中,有n名工人需要分配到n个工作,而矩阵包含为每个工作分配每个工人的成本。
在这种变化中,我们只有m(m 我们希望施加约束,即每个类别中至少有一个作业被分配给真实(非虚拟)工作者。这很难做得很优雅:例如,您可以从每个类别中挑选一个随机工作,并人为地缩小每个实际工作人员的相关成本,但这是一个非常粗略的解决方案,会严重损害最终任务的完整性。 我们目前所做的是多次运行算法,每次评估输出分配,然后修改成本矩阵,使得仅分配给虚拟工作者的任何类别中的所有作业的成本略有降低。这种方法很有效,但是对于中等大小的数据集(n~ = 500),这个过程可能需要一段时间(每个Munkres任务可能花费10秒钟来计算,并且如果有足够的类别,则可能会有非平凡的迭代次数。) / p>
是否有修改后的Munkres算法或完全不同的算法可以更有效地解决这个问题?
答案 0 :(得分:1)
类别是否脱节?每个工作只有一个类别?那么,最低成本流量如何?
节点类型:
SRC - source
SNK - sink
C - a node or each category
J - a node for each job
W - a node for each worker
连接:
1) from SRC to C, capacity 1, cost 0
2) from SRC to C, capacity infinite, cost a high number
3) from C to J, capacity 1, cost 0
4) from J to W, capcity 1, the cost of job J done by worker W
5) from W to SNK, cost 0, capacity 1
然后算法将首先填充类型1的链接,这意味着每个类别将至少获得一个工作者(如果可能)。