我使用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秒钟。
有没有一种简单的方法来改善表现?
答案 0 :(得分:0)
解算器在每个约束条件下花费的时间越来越长并不是不合理的。但是为了确保它不是C#部分的某种内存泄漏,你应该检查while
循环中所用的时间是否真的在Check
部分,而不是反转/断言部分。如果您确定z3
是责任方,可能会在https://github.com/Z3Prover/z3/issues提交,可能会向开发人员寻求更好的答案。