Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻找方法测试矩阵解释的有效方法(数学问题) 设置:_Algorithm_Math_Performance_Matrix - Fatal编程技术网

Algorithm 寻找方法测试矩阵解释的有效方法(数学问题) 设置:

Algorithm 寻找方法测试矩阵解释的有效方法(数学问题) 设置:,algorithm,math,performance,matrix,Algorithm,Math,Performance,Matrix,我有一个布尔矩阵 1 0 1 1 0 1 问题: 我现在要计算所有的解释 现在,我已经有了两个可以解决这个问题的实现,一个是自顶向下的,另一个是自下而上的,但这两个实现都会在计算时间上呈指数增长(通过将行数增加一倍) 这是一个已知(可能有效解决)的数学问题吗 让事情变得更简单的是,最后,我只需要解释每种方法的出现次数。在我们的示例中,对于m1三次出现,对于m2四次出现,对于m3三次出现 我目前的算法在26行之前运行良好。但更进一步,它变得非常缓慢 谢谢你的帮助 我不知道是否没有指数数量的可

我有一个布尔矩阵

1 0 1 1 0 1 问题: 我现在要计算所有的解释

现在,我已经有了两个可以解决这个问题的实现,一个是自顶向下的,另一个是自下而上的,但这两个实现都会在计算时间上呈指数增长(通过将行数增加一倍)

这是一个已知(可能有效解决)的数学问题吗

让事情变得更简单的是,最后,我只需要解释每种方法的出现次数。在我们的示例中,对于m1三次出现,对于m2四次出现,对于m3三次出现

我目前的算法在26行之前运行良好。但更进一步,它变得非常缓慢


谢谢你的帮助

我不知道是否没有指数数量的可能解释(这意味着你不能比指数更快地列举它们)

但是,为了消除重复工作,您可以采用动态编程方式来实现这一点:

  • 第一级是单个元素的列表:所有方法的集合
  • 每个级别的循环:
    • 此级别中每个集合的循环:
      • 如果此集合是一种解释(
        将它们的测试放在一起会给出所有
        1
        s):
        • 把它放到结果列表中
        • 创建此集合的所有可能子集,这些子集恰好少了一个方法,并将它们放入下一个“级别”
    • 从下一级别删除所有重复项
  • 直到液位为空

如果你能满足于近似概率,并且想要一些可扩展的东西,吉布斯抽样可能会奏效。基本思想非常简单:从“所有行”解释开始,重复下面的步骤,对一组解释进行示例

  • 随机选择一行
  • 掷硬币
  • 如果硬币正面朝上,则将该行添加到解释中(如果已经存在,则不做任何操作)
  • 如果硬币出现了尾巴,尝试从解释中删除这一行。如果结果不是解释,请将该行放回原处

  • 在极限条件下,包含给定行的样本分数收敛到其真实值。在关键字“使用Gibbs采样的贝叶斯推断”下有一些实际的实现(您有一个统一的先验,并且观察到对于每一列,与它相关的行的析取是真实的)。但是,由于我不是这方面的专家,我不能建议您自己滚动的危害。

    我认为这可能是一个指数问题。例如,如果其中一个方法在每列中都有一个,则包含该方法的任何方法子集都是一个解释,因此,如果有M个方法,则至少有2^(M-1)个解释;类似地,如果某些方法对在任何列中都有一个,则至少有2^(M-2)种解释

    这是一种方法,虽然仍然是指数型的,但我认为它比列举所有的解释都要快,特别是当有很多1的方法时

    设T(A,B)为A(一组方法)的子集数,其中B(一组列)中的每列中至少有一个1

    如果B为空,T(A,B)是A的子集数,即2^#A,其中A有#A个元素。 否则,如果A为空,则T(A,B)为0。 否则,如果i是A的一个元素(例如第一个元素)

    T(A,B)=T(A\{i},B\m[i])+T(A\{i},B)

    (这里A\{i}是没有i的A,B\m[i]是没有方法i中任何列的B)

    T可以非常简洁地编码为递归函数

    最后,c[j]是方法j在解释中出现的次数

    c[j]=T(A\{j},c\m[j])


    其中C是所有列的集合。

    您现在在做什么?我对如何做到这一点有想法,但我不知道它们是否比您已经使用的更好/更差。在文献中,这本质上是单调布尔可满足性的计数版本,它是#P-完全的(因此是NP难的)。您希望在多少行上运行?你愿意接受一个近似值吗?所以这是由软件工程中的一个实际问题引起的(方法、测试的名称听起来很响亮),还是来自统计领域?对不起,我没有答案,但这确实引起了一些好奇。谢谢你的提示“单调布尔可满足性”,事实上它是NP难的。是的,这是一个实际问题,我想在运行测试集之后找到可疑的方法。所以,我看到的唯一机会是使用采样技术。谢谢大家,谢谢大家提出进一步的算法建议。
    {
      {m2}, 
      {m1,m2},{m1,m3},{m2,m3},
      {m1,m2,m3}
    }