使用z3进行ALLSAT

时间:2017-07-12 17:09:42

标签: z3

我使用Z3作为黑框,用C#代码查找一些真实世界对象的所有可能组合,如下所示:

while (solver.Check() == Status.SATISFIABLE)

    { 
        SATModel = solver.Model;
        ....
        //invert the Model
        ....
        solver.Assert(InvertedModel)
    }

对于我的大多数问题,该程序运行正常,但现在我遇到了一个更大的问题,即8.5E + 64种可能的组合没有约束。

我从约6000个限制开始。

我观察到的是,检查操作在开始时花费的时间少于0.02秒并且缓慢增加。在100000找到解决方案后,每回合需要1秒钟,在130000转后,我测量2秒钟。

有没有一种简单的方法来改善表现?

1 个答案:

答案 0 :(得分:0)

解算器在每个约束条件下花费的时间越来越长并不是不合理的。但是为了确保它不是C#部分的某种内存泄漏,你应该检查while循环中所用的时间是否真的在Check部分,而不是反转/断言部分。如果您确定z3是责任方,可能会在https://github.com/Z3Prover/z3/issues提交,可能会向开发人员寻求更好的答案。