【问题标题】:Need pairing algorithm - based on Hungarian?需要配对算法 - 基于匈牙利语?
【发布时间】:2011-07-29 08:31:48
【问题描述】:

匈牙利或 Kuhn-Munkres 算法(很好的描述 here)将两组对象(分别由 nm 个对象组成,n>=m ) 以使配对对象之间的整体“差异”(或分配的“成本”)最小。然而,该算法的一个功能不适合我:它只进行详尽的配对,即它将 all m 个对象与 n 个对象中的一些对象配对。取而代之的是,我希望能够以最小的总成本创建 任意数 k 对 (k)。例如,有一个 50x30 的输入成本矩阵; Kuhn-Munkres 将优化创建所有 30 对。虽然我只需要 20 对就可以以最佳方式创建。

是否可以对匈牙利算法进行任何修改以允许这样做,或者可能完全是另一种算法来做到这一点?非常感谢您的回答。

【问题讨论】:

    标签: algorithm graph variable-assignment


    【解决方案1】:

    这里有一些想法可以考虑:

    1) 假设您写下包含 n 列和 m 行的成本矩阵。如果 n 大于 m,则添加具有恒定大成本的填充行以使其成为正方形。行和列的最小成本分配现在将通过将某些列与填充行匹配来丢弃它们。假设您现在添加一个填充列,其普通行的成本非常低,而填充列的成本恒定。该解决方案现在将适当的行之一与该列匹配,以利用非常低的成本。这减少了与合理的匹配的行数。我认为如果你添加 m-k 这样的列,你最终会得到一个真正只分配 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

    分配解决方案是否有可能选择了右下方 s x s 区域中的任何单元格?考虑任何这样的任务。为了证明必须选择左上区域中的至少一个单元,假设没有选择。然后我们必须以某种方式从前 n 行中的每一行中选择一个单元格,大概是通过从右上角区域选择单元格。每个这样的单元格必须在一个单独的列中,但右上方区域只有 s 列,这还不够,因为我们只需要一列来处理要跳过的每个匹配项,而我们在此中使用了一列区域已经填充了右下区域的一个单元格。所以假设解决方案在原始左上区域至少选择一个单元格,在右下区域至少选择一个单元格。选择其他两个单元格,使其成为正方形的四个角。无法选择这些单元格。如果我们选择那些单元格而不是当前选择的两个单元格,我们会得到不同的解决方案。两个新单元格是右上角的 0 单元格和左下角的 100 单元格。他们将替换右下角的 100 个单元格和主矩阵中值大于零的单元格。所以这会使我们假设的解决方案更好,所以任何包含右下区域的单元格的解决方案都不是最佳解决方案,分配算法不会将其返回给我们。

    因此,这种添加 0 列然后添加大值行的技巧将产生一个分配算法解决方案,该解决方案确实会为添加的每个(行、列)从原始解决方案中省略一个匹配项。

    2) 赋值问题是http://en.wikipedia.org/wiki/Minimum-cost_flow_problem 的一个特例。我认为您想要一个将 k 个单位从行传输到列的最小成本流,因此您可以尝试像这样解决它。

    3) 最小成本流问题是线性规划的一个特例。我认为您可以编写一个线性程序,将 [0,1] 范围内的数字分配给矩阵的单元格,使得每行和每列的总和不超过 1,并且所有单元格的总和为 k。目标函数就是每个单元格中的数字乘以它的成本。

    【讨论】:

    • 感谢您的快速回复。请关注第1段,您能否举例说明您的解决方案以供我理解?举一个简单的例子 - 一些 5X5 平方成本矩阵,请允许我要求您将 3 行与 3 列配对,以使 3 个成本值的总和全局最小。
    • 添加的示例 - 对我来说看起来很合理,但我不保证 - 看看在程序中运行它时会发生什么。如果这不起作用,请查看流量最大化。
    • 啊,谢谢。 “在程序中运行”是指匈牙利算法程序吗?
    • 是的,看看这个技巧在实践中是否有效(如果你有一个方便的话)的最简单方法是获取一些试验数据,看看会发生什么。
    • 最好有证据而不是试验数据,不是吗?好的 - 添加一个
    【解决方案2】:

    也许您的方法是错误的,但匈牙利算法仅适用于二分图。对于一般(非二分)图(即加权匹配),请查看http://en.wikipedia.org/wiki/Edmonds%27s_matching_algorithm。或者你想作弊,只给出最大成本对匹配的前十名?

    【讨论】:

    • 我的图是完全二分图:输入是一个 nxm 矩形距离矩阵。匈牙利语产生所有 n 或 m 对(以较小者为准),最小化对内距离的总和;虽然我需要相同的最小化,但我只想能够“提取”更少的对。
    • @ttnphns:但这是错误的算法。也许您想寻找 Floyd-Warshall 算法?它找到所有对匹配?或者你想做一个随机配对算法?
    • 我没有提出任何算法让你可以称它为错误。我明确表示我正在寻找以下属性的匹配(配对)算法:输入是 N 个实体和 M 个实体之间的 NxM 距离矩阵。在其中找到 K 个元素 - 一行和一列中不超过 1 个元素 - 并且 K 是 1 和 min(N,M) 之间的自定义数字,以便这些元素的总和最小化。你知道这样的算法吗?
    • 据我了解是匈牙利算法。
    • 是的,但是匈牙利算法只允许 K=min(N,M)。它不允许自定义 K。至少据我从各种来源了解。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2013-05-18
    • 2010-11-16
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多