Algorithm 寻找方法测试矩阵解释的有效方法(数学问题) 设置:
我有一个布尔矩阵 1 0 1 1 0 1 问题: 我现在要计算所有的解释 现在,我已经有了两个可以解决这个问题的实现,一个是自顶向下的,另一个是自下而上的,但这两个实现都会在计算时间上呈指数增长(通过将行数增加一倍) 这是一个已知(可能有效解决)的数学问题吗 让事情变得更简单的是,最后,我只需要解释每种方法的出现次数。在我们的示例中,对于m1三次出现,对于m2四次出现,对于m3三次出现 我目前的算法在26行之前运行良好。但更进一步,它变得非常缓慢Algorithm 寻找方法测试矩阵解释的有效方法(数学问题) 设置:,algorithm,math,performance,matrix,Algorithm,Math,Performance,Matrix,我有一个布尔矩阵 1 0 1 1 0 1 问题: 我现在要计算所有的解释 现在,我已经有了两个可以解决这个问题的实现,一个是自顶向下的,另一个是自下而上的,但这两个实现都会在计算时间上呈指数增长(通过将行数增加一倍) 这是一个已知(可能有效解决)的数学问题吗 让事情变得更简单的是,最后,我只需要解释每种方法的出现次数。在我们的示例中,对于m1三次出现,对于m2四次出现,对于m3三次出现 我目前的算法在26行之前运行良好。但更进一步,它变得非常缓慢 谢谢你的帮助 我不知道是否没有指数数量的可
谢谢你的帮助 我不知道是否没有指数数量的可能解释(这意味着你不能比指数更快地列举它们) 但是,为了消除重复工作,您可以采用动态编程方式来实现这一点:
- 第一级是单个元素的列表:所有方法的集合
- 每个级别的循环:
- 此级别中每个集合的循环:
- 如果此集合是一种解释(
将它们的测试放在一起会给出所有或
s):1
- 把它放到结果列表中
- 创建此集合的所有可能子集,这些子集恰好少了一个方法,并将它们放入下一个“级别”
- 如果此集合是一种解释(
- 从下一级别删除所有重复项
- 此级别中每个集合的循环:
- 直到液位为空
在极限条件下,包含给定行的样本分数收敛到其真实值。在关键字“使用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}
}