将z3用于ALLSAT

将z3用于ALLSAT,z3,Z3,我使用Z3作为一个黑匣子来查找一些现实世界对象与C#代码的所有可能组合,如下所示: while (solver.Check() == Status.SATISFIABLE) { SATModel = solver.Model; .... //invert the Model .... solver.Assert(InvertedModel) } 对于我的大多数问题,该程序运行良好,但现在我有一个

我使用
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秒


有没有一种简单的方法可以提高性能?

解算器在每个约束下花费的时间越来越长,这并不是不合理的。但是为了确保C#部分没有某种内存泄漏,您应该检查
while
循环所花费的时间是否确实在
检查部分,而不是反转/断言部分。如果您确定
z3
是责任方,那么将其提交给可能会从开发人员那里获得更好的答案。

解决方案在每个约束条件下花费的时间越来越长,这并不是不合理的。但是为了确保C#部分没有某种内存泄漏,您应该检查
while
循环所花费的时间是否确实在
检查部分,而不是反转/断言部分。如果您确定
z3
是责任方,那么将其提交给可能会从开发人员那里获得更好的答案。

谢谢您的回答。时间只用于检查部分,没有内存泄漏。我不会将其作为问题提交,因为我认为我是遗漏某些内容的人。谢谢你的回答。时间只在检查部分占用,没有内存泄漏。我不会将其作为问题提交,因为我认为我是丢失某些内容的人。那么为什么不使用MathSAT呢?Its的All SAT比NAVE blocking子句更好。那么为什么不使用MathSAT呢?Its的All SAT比天真的阻塞子句更好。