所以这是C#中一个有趣的问题。我正在寻找一种更好的解决方法:
给定匹配的矩阵M(不一定是平方),找到最佳匹配元素。元素i将elem j与值M(i,j)匹配。 M(i,j)!= M(j,i)。
由于#rows!= #columns,找到匹配对(i,j)的最佳min(#rows,#columns)。
基本上问题是从每行/每列中选择最大值,这样就不会选择两行/列。
示例:
1 2 3
+---------
a | 10 3 1
b | 12 99 2
c | 20 5 3
d | 5 7 4
此矩阵中的最大值为99,因此最佳匹配为(b,2)。对于下一个选择,我们不能再使用第b行和第2列了。就像切割它们一样
1 2 3 or, if you prefer, 1 3
+--------- a smaller matrix: +------
a | 10 || 1 a | 10 1
b | ===++=== c | 20 3
c | 20 || 3 d | 5 4
d | 5 || 4
最大值现在为20,匹配为(c,1)。剩下的矩阵只有一列。 在另一个选秀之后我们将得到匹配(d,3)匹配= 4
最后“a”没有匹配。
我当前的实现使用2个数组来存储已经匹配的行/列,并且每个匹配遍历整个矩阵,选择属于row / col的第一个最大值不匹配。
PS:如果值具有相同值的多个匹配,则只选择其中一个
PS2:数组存储为int [,]
你会如何以更优/更美的方式解决这个问题?
答案 0 :(得分:3)
如果您尝试最大化所选单元格的总和,以便从每一行和每列中选择一个单元格,那么这是http://en.wikipedia.org/wiki/Assignment_problem。如果您的矩阵不是正方形,您可以通过向它们添加行或列来使其成为正方形,新单元格中的值表示除非没有其他方法可以填充解决方案,否则不会选择它们。
(如果你没有最大化总和,你需要说明你所选择的值的最大值是什么 - 是(1,3)比(2,2)更好?。否则你进入http://en.wikipedia.org/wiki/Multi-objective_optimization ,这是可能的,但更复杂)。
答案 1 :(得分:1)
您可以先按降序排序矩阵的所有条目,然后处理排序列表。每当您在已经选择的行/列中看到一个条目时,就意味着应该选择条目,因此您标记相应的行/列并继续向下列表,直到所有行或所有列都有被选中了。