匈牙利语或Kuhn-Munkres算法(良好描述here)将来自两组( n 和 m 对象)的对象分别配对, n&gt; = m )使得配对对象之间的总体“差异”(或分配的“成本”)最小。算法的一个特征并不适合我:它只进行详尽的配对,因为它会将所有 m 对象与n个对象中的一些对象配对。取而代之的是,我希望能够创建任意数量 k对( k <= m ),总体成本最低。例如,有一个50x30的输入成本矩阵; Kuhn-Munkres将最佳地创造30对。虽然我只需要20对就能创造出最佳效果。
可以对匈牙利算法进行任何修改,或者可能是另一个算法吗?我非常感谢你的回答。
答案 0 :(得分:2)
以下是一些需要考虑的想法:
1)假设您用n列和m行记下成本矩阵。如果n大于m,则添加具有恒定大成本的填充行以使其成为正方形。行和列的最小成本分配现在将通过将它们与填充行匹配来丢弃某些列。假设您现在为普通行添加填充列的成本非常低,并且填充列的成本不变。现在,该解决方案将匹配此列中的一个正确行,以利用极低的成本。这减少了与合理的东西匹配的行数。我想如果你添加m-k这样的列,你最终会得到一个最小的成本匹配,它实际上只分配了几行。
Here is an example of pairing 3 with 3 in 5x5, assuming ?
marks problem-specific values > 0 but < 100 (you may
need more extreme values than 0 and 100 to force the sort of
solution you want depending on what your data values are).
? ? ? ? ? 0 0
? ? ? ? ? 0 0
? ? ? ? ? 0 0
? ? ? ? ? 0 0
? ? ? ? ? 0 0
100 100 100 100 100 100 100
100 100 100 100 100 100 100
我希望最佳解决方案能够使用 来自远方的两个0 右边和底部两行100。剩下的细胞 在?s的平方内是3 x 3匹配
好的 - 这是一个证明,如上所述添加列然后行会产生您想要的匹配类型:
假设您采用值为0&lt; 0的成本矩阵。 x&lt; 100,并添加如上所述的s列和0s和100s行的边框,然后将其解决为分配问题。在0和100的边界处绘制两条线,将它们延伸以将正方形切割成四个区域,其中左上角的区域是原始矩阵。如果分配算法没有选择右下区域中的任何单元格,那么它在右上区域中选择s单元格(以选择最右边的列),因此左上区域中的原始成本矩阵中的s行是与零列中的单元格配对。顶部区域中的其他行必须与非零列配对,因此原始区域中的匹配将留下s行,因此s列未配对(即与零单元配对)。
分配溶液是否有可能选择s x右下区域的任何细胞?考虑任何这样的任务。为了证明必须选择左上区域中的至少一个单元,假设没有选择。然后我们必须以某种方式从前n行中的每一行中选择一个单元格,大概是从右上角区域中挑选单元格。每个这样的单元格必须在一个单独的列中,但右上角区域只有s列,这是不够的,因为我们只需要一个列用于我们想要跳过的每个匹配,并且我们在此使用了一列区域已经填充右下区域的单元格。因此,假设解决方案选择原始左上区域中的至少一个单元格和右下区域中的至少一个单元格。选择其他两个单元格,将其分成正方形的四个角。无法选择这些细胞。如果我们选择那些单元格而不是当前选择的单元格,我们会得到一个不同的解决方案。两个新细胞是右上角的0个细胞和左下角的100个细胞。它们将取代右下角的100个单元格和主矩阵中值大于零的单元格。因此,这将使我们假设的解决方案更好,因此任何包含右下区域中的单元格的解决方案都不是最佳解决方案,并且分配算法不会将其返回给我们。
因此,添加0列然后添加大值行的这一技巧将产生一个赋值算法解决方案,该解决方案会为添加的每个(行,列)省略原始解决方案中的一个匹配。
2)分配问题是http://en.wikipedia.org/wiki/Minimum-cost_flow_problem的一个特例。我想你想要一个最小的成本流量,将k个单位从行转移到列,所以你可以尝试像这样解决它。
3)最小成本流问题是线性规划的一个特例。我想你可以写下一个线性程序,将[0,1]范围内的数字分配给矩阵的单元格,使每行和每列总和不超过1,所有单元格的总和为k。然后,目标函数是每个单元格中的数字乘以其成本。
答案 1 :(得分:0)
也许你的方法是错误的,但匈牙利算法只适用于二分图。对于一般(非二分)图(即,称重匹配),请在此处查看http://en.wikipedia.org/wiki/Edmonds%27s_matching_algorithm。或者你想作弊,你只给出最高成本对匹配的前十名?