假设我知道一种算法,它将布尔矩阵划分为一组覆盖所有“一”(“trues”)的不相交矩形。 任务是找到矩阵的行和列的排列,这样通过根据排列对列和行进行混洗而构建的矩阵可以被划分为一组最小的矩形。
为了说明,人们可以这样思考问题:
假设我有一组对象和一组属性。每个对象可以具有任意数量的(不同的)属性。任务是使用最少量的句子来总结(报告)该映射。每个句子都有一个“
<list of objects> have properties <list of properties>
”形式。
我知道我可以通过应用排列来强制解决方案并在每次尝试时运行算法。但是时间复杂度呈指数级增长,使得这种方法对于大于15×15的矩阵是不实用的。
我知道我可以在运行算法之前通过删除重复的行和列来简化矩阵。
这个问题感觉它是NP难的,并且可能没有快速(多项式及时)解决方案。如果是这样,我有兴趣了解一些近似的解决方案。
答案 0 :(得分:1)
在给定完整的输入(特征)和所需的真值表(哪些行具有哪个特征)的情况下,这与减少逻辑电路是同构的。您可以使用经典布尔代数解决问题。该过程称为logic optimization。
当我在学校时,我们在棋盘上画了Karnaugh maps并绘制了彩色边界以形成我们的矩形。然而,听起来好像你有一个比一个人在板上处理更大的东西;尝试QM algorithm和引用的启发式方法,为许多应用程序提供“足够好”的解决方案。
答案 1 :(得分:0)
到目前为止我的解决方案:
首先让我们承认,问题是关于用列交换行(对象的特征)是对称的。
让我们用二进制矩阵来表示问题,其中行是对象,列是要素,矩阵中的行表示匹配对(对象,特征)。
到目前为止,我的想法是按顺序运行两个步骤,直到矩阵中没有1:
它可以是网上找到的最大矩形问题的任何实现,例如https://www.geeksforgeeks.org/maximum-size-rectangle-binary-sub-matrix-1s/
非抽动行独立于非抽动列,两个任务可以单独运行(并发)。让我们假设我正在寻找列的无拘无束的排列。
另外,值得注意的是,如果我们用零交换,那么矩阵的非混乱应该会产生相同的结果。
该算法对我的用例来说足够好。 R中的实现可以在https://github.com/adamryczkowski/rectpartitions
中找到