Algorithm 谜题:对于布尔矩阵,找到允许分解为最小覆盖矩形集的行和列的排列

Algorithm 谜题:对于布尔矩阵,找到允许分解为最小覆盖矩形集的行和列的排列,algorithm,Algorithm,假设我知道一种算法,它将布尔矩阵分割成一组最小的不相交矩形,覆盖所有的“一”(“真”)。 任务是找到矩阵的行和列的排列,这样,通过根据排列将列和行混洗而构建的矩阵可以划分为一组最小的矩形 为了举例说明,可以这样思考问题: 假设我有一组对象和一组属性。每个对象可以有任意数量的(不同的)属性。任务是用最少的句子总结(报告)这个映射。每个句子都有一个形式“具有属性”” 我知道我可以通过应用排列来强制解决方案,并在每次尝试时运行算法。但是时间复杂度呈指数级增长,使得这种方法对于大于15×15的矩阵不实用

假设我知道一种算法,它将布尔矩阵分割成一组最小的不相交矩形,覆盖所有的“一”(“真”)。 任务是找到矩阵的行和列的排列,这样,通过根据排列将列和行混洗而构建的矩阵可以划分为一组最小的矩形

为了举例说明,可以这样思考问题:

假设我有一组对象和一组属性。每个对象可以有任意数量的(不同的)属性。任务是用最少的句子总结(报告)这个映射。每个句子都有一个形式“
具有属性”

我知道我可以通过应用排列来强制解决方案,并在每次尝试时运行算法。但是时间复杂度呈指数级增长,使得这种方法对于大于15×15的矩阵不实用

我知道我可以在运行算法之前通过删除重复的行和列来简化矩阵


这个问题感觉像是NP难问题,可能没有快速(多项式时间)的解决方案。如果是这样,我有兴趣了解一些近似解

考虑到全套输入(特征)和所需的真值表(哪些行具有哪些特征),这与简化逻辑电路同构。你可以用经典的布尔代数来解决这个问题。该过程称为

当我在学校的时候,我们在黑板上画画,画彩色的边界来形成我们的矩形。然而,听起来好像你有比你在董事会上处理的更大的事情;对于许多应用程序,请尝试和引用的启发式方法,以获得“足够好”的解决方案。

到目前为止,我的解决方案是:

首先,让我们承认,问题是关于行与列交换的对称性(特性与对象)

让我们用二进制矩阵来表示问题,其中行是对象,列是特征,矩阵中的行代表匹配对(对象,特征)

到目前为止,我的想法是按顺序运行两个步骤,直到矩阵中没有剩余的1:

  • 启发式地找到一个很好的行和列的非缓冲排列,我可以在上面运行2D最大矩形
  • 找到最大矩形,将其保存到答案列表中,并将所有属于它的1归零
  • 最大矩形问题 例如,它可以是在网络上发现的最大矩形问题的任何实现

    取消填充行(和列) 取消缓冲行独立于取消缓冲列,两个任务可以分别(并发)运行。让我们假设我正在寻找列的非缓冲排列

    另外,值得注意的是,如果我们将1与0交换,则取消缓冲矩阵应该会产生相同的结果

  • 构建列的距离矩阵。两列之间的距离定义为数值表示的两列之间的曼哈顿距离(即0-对象和特征之间没有关系,1-存在)
  • 使用距离矩阵运行分层聚类。复杂性是O(n^2),因为我相信单链接应该足够好了
  • 从层次聚类返回的对象顺序是非缓冲排列

  • 该算法对于我的用例来说已经足够好了。R中的实现可以在

    中找到,我考虑了你的想法很多,但仍然看不到同构。假设你指的是多级逻辑(其中二进制表达式的输出是布尔向量,输出的每个维度映射到对象,每个输入变量映射到特征),我的问题是对称的-你可以用特征交换对象,但仍然得到相同的(但转置)解决方案,而afaik的逻辑优化不是对称的输入和输出变量之间的交换。也许我错了-这不是我的专业领域。好吧。。。轮到我思考了。。。我将从一些更经常使用这些东西的朋友那里得到我的想法。现在。。。我看到同构的地方不是最终的结果,而是算法。为了获得最小的逻辑,您必须切换行和列,这样
    1
    位就可以聚集成漂亮的矩形分组。然后确定覆盖所有
    1
    s而不包括任何
    0
    s的最小矩形集。生成and/or逻辑是最后一步。。。这不是我提出的同构的一部分。我已经更新了这个问题,所以它包含了我目前在这个问题上的工作。非常感谢你的努力。干得好。这个周末我不得不做我自己的研究,但我确定这个问题确实与逻辑解决方案是同构的。只是检查一下——这些矩形可以相互重叠,只要它们不包含任何
    0
    条目。对吗?@Prune。目前,我试图编写一个防止重叠的算法,但如果可以的话,我愿意接受一个解决方案。我明白,逻辑优化方法会产生重叠,这对我来说没问题。额外的好处是,它还可以在输出中自然地给出负数(即除了A、B和C之外的所有对象都具有属性A和B)。