如何优化矩阵中行 x 列组合的搜索?

Posted

技术标签:

【中文标题】如何优化矩阵中行 x 列组合的搜索?【英文标题】:How to optimize search of rows x columns combination in a matrix? 【发布时间】:2017-08-09 14:32:21 【问题描述】:

给定一个由 1 和 0 组成的矩阵,我想找到一个包含最少或没有 0 的行和列的组合,从而最大化所选择的 n_of_rows * n_of_columns

例如,行 (0,1,2) 和列 (0,1,3) 在 col #0 行 #1 中只有一个零,其余 8 个值为 1。

1 1 0 1 0
0 1 1 1 0
1 1 0 1 1
0 0 1 0 0

实际任务是搜索超过 1000 到 1000000 的行和列,在二分图中找到最大的 biclique——行和列可以被视为顶点,而值可以被视为连接。

据我所知,NP 完全问题。

请建议一种可以加快任务并减少对 CPU 和内存要求的方法/算法。

【问题讨论】:

要求不是很清楚。如果您想要最少数量的 0 或最大数量的列+行,那么问题是微不足道的。您想最大化选择的 1s-0 的数量吗?或者您是否给了一个数字 K,表示您可以选择的最大 0 数? 尽管计算机是人造的,但很难说在同样复杂的情况下哪个会更快。 @DinuSorin 这是一种从数据中寻找见解的方法。一项任务是最大化rows * cols,同时只接受 1,不接受 0。另一个任务是允许选择中的 K 0(或更好的 K%),并再次最大化 rows * cols 【参考方案1】:

不确定您是否可以将其最小化 但是,解决这个问题的简单方法是......

    将矩阵乘以 1 列和 n 行全为 1。这将为您提供每行中的数量。接下来做一个1行乘n列的乘法(在前面)你的矩阵充满了1。这将为您提供每列的总计 1,从那里这是一个非常简单的比较........

即原始矩阵... 1 0 1 0 1 1 0 0 0

做 1 0 1 x 1 = 2(行总数) o 1 1 1 2 0 0 0 1 0

做 1 1 1 x 1 0 1 = 1(列总数) 0 1 1 2 0 0 0 0

nb 最大总和为 2(你会在计算时跟踪它。

【讨论】:

谢谢!我正在为每一行和每一列做这个“权重”计算,但是它只有一点帮助,因为在大量的列和行中,相对于总数,最大选择似乎只包含几行和几列每个。可能会出现最大数量为 1 的行根本不包含在最终选择中。 因为存储复杂性会将它们保存为位> 然后围绕计算有多​​少活动位的最快方法进行了大量讨论。见...***.com/questions/109023/… 但考虑到您的矩阵大小没有太多限制......【参考方案2】:

实际上给出了以下假设: 1.你不在乎每行或每列有多少个0 2.您不需要跟踪他们的订单......

然后,您只需要在读取值时存储值以计算每行/列中的总数,而实际上并不存储矩阵本身。

如果在读取矩阵之前给定行数和列数,您可以执行以下启发式方法来减少计算时间...

    跟踪当前最大值。如果当前行不能达到这个潜在的最大值,则停止对该行计数(但继续在列中)。对于列,反之亦然

但您仍然遇到最坏的情况,即所有行和列都有少量的 1 和 0.... :)

【讨论】:

以上是关于如何优化矩阵中行 x 列组合的搜索?的主要内容,如果未能解决你的问题,请参考以下文章

PICOS 中的极小极大优化

数值优化

poj3734 Blocks[矩阵优化dp or 组合数学]

牛顿法求解无约束最优化问题的方法

优化理论19----DNRTR无约束优化的对角拟牛顿修正方法

六省联考2017组合数问题 题解(矩阵快速幂优化DP)