以下是一些需要考虑的想法:
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。其余单元格是在填有?的正方形内部进行3x3匹配。
好的 - 这里是添加列和行以产生所需匹配的证明:
假设您拿一个具有值为0 < x < 100的成本矩阵,并像上面那样添加s列和0和100的行边框,然后将其作为分配问题进行求解。在0和100的边界处绘制两条线,将它们延伸到将正方形划分为四个区域的位置,其中左上角的区域是原始矩阵。如果分配算法没有选择右下角区域中的任何单元格,则它选择了顶部右侧区域中的s个单元格(以选取最右侧的s列),因此原始成本矩阵中左上角区域中的s行与零列中的单元格配对。顶部区域中的其他行必须与非零列配对,因此在原始区域中留下s行(即与零单元格配对的行)和s列未配对。
分配解决方案是否可能选择了s x s右下角区域中的任何单元格?考虑任何这样的分配。为了证明必须选择至少一个上部左侧区域中的单元格,请假设没有选择。那么我们必须以某种方式选择来自顶部右侧区域的每个顶部n行中的一个单元格,可能是通过从该区域中选择单元格。每个这样的单元格必须在单独的列中,但是在顶部右侧区域中只有s列,这将不足够,因为我们仅需要跳过每个匹配所需的一列,并且我们已经在此区域中使用了一列来填写下方区域中的单元格。因此,假设解决方案至少选择了原始左上区域和右下区域中的一个单元格。选择另外两个单元格,使其成为四个角的四个角。这些单元格不能被选择。如果我们选择这些单元格而不是当前选择的两个单元格,则会得到不同的解决方案。新单元格是来自右上方的0单元格和来自左下方的100单元格。它们将替换来自底部右侧的100单元格和主矩阵中值大于零的单元格。因此,这将使我们假设的解决方案更好,因此任何包含底部右侧区域中单元格的解决方案都不是最佳解决方案,分配算法将不会将其返回给我们。
因此,添加0和大值的行以产生一种分配算法解决方案,该解决方案省略了每个添加的(行,列)对原始解决方案的一个匹配。
2)分配问题是
最小费用流问题的一种特殊情况。我认为您需要从行到列传输k单位的最小成本流,因此可以尝试像这样解决它。
3) 最小费用流问题是线性规划的特殊情况。我认为您可以编写一个线性规划,将数字分配到矩阵单元格中,范围在[0,1]之间,使得每行和每列的总和不超过1,并且所有单元格的总和为k。然后,目标函数就是每个单元格中的数字乘以其成本。