【发布时间】:2009-11-19 01:57:18
【问题描述】:
我在这里寻找一些建议,因为我不太清楚从哪里开始研究这个。
我有一个二维矩阵,每个单元格为0或1,如:
1 2 3 4
A 0 1 1 0
B 1 1 1 0
C 0 1 0 0
D 1 1 0 0
我想对其进行排序,使其尽可能“上三角形”,如下所示:
4 3 1 2
B 0 1 1 1
A 0 1 0 1
D 0 0 1 1
C 0 0 0 1
行和列必须保持不变,即元素不能单独移动,只能“整体”交换。
我了解可能存在矩阵具有多个可能的排序结果(即形状相同,但“原始”行/列的标识不同)的病态情况。
那么,谁能建议我在哪里可以找到一些起点?现有的库/算法会很棒,但我会满足于知道我要解决的问题的名称!
我怀疑这是一个线性代数问题,也许有某种适用的图像处理技术。
除了任何其他想法,我最初的猜测只是在行上编写一个简单的插入排序,然后在列上进行迭代,直到它稳定(并希望检测病理情况不会太难。)
更多细节:关于我正在尝试做的一些更多信息可能有助于澄清。每一行代表一个竞争对手,每一列代表一个挑战。每个 1 或 0 代表参赛者在特定挑战中的“成功”。
通过对矩阵进行排序,使所有的1都在右上角,我希望然后提供每个挑战的内在难度排名和竞争对手的排名(这将考虑到他们成功挑战的难度在,而不仅仅是成功的次数。)
关于接受答案的说明:我已接受模拟退火作为“答案”,但需要注意的是这个问题没有正确答案。这似乎是一个不错的方法,尽管我实际上还没有想出一个适合我的问题的评分函数。
【问题讨论】:
-
问题:(1) 请注意,对于全 1 的矩阵,您无能为力:您可以吗? (2)一旦对角线下方没有零,您是否关心1在对角线上方的位置? (3) 最小化对角线下方 1 的数量是否足够好?如何简单地减少对角线下方(至少)为 1 的行数?
-
Answer 1) 是的,全零或全一永远不会出现,如果它们发生了,那么根据定义,它们都将被认为是等价的,因此将它们分类为其他排列不会是个问题。
-
Answer 2+3) 是的,我希望 1 尽可能靠近每列的顶部,即右上角的 1 尽可能多。请注意,对角线下方可能有 1,上方可能有 0,这不是严格意义上的三角矩阵。
-
您需要对什么大小的矩阵进行排序?您可以使用简单地尝试行和列的每种组合的蛮力方法逃脱吗?这意味着 n!平方组合,所以 5 行仍然是相当可行的,但 6 行/列将是 50 万个组合。
-
矩阵会非常大,至少 100s x 100s,希望它们可以随着新行/列的添加而逐步解决。