我可以保存为z3求解器创建的约束,然后重新加载它们以继续寻找更多解决方案吗?
我了解到有用于此类事物的SMT-LIB2格式,并且z3和z3py具有用于以该格式保存和加载的API。不幸的是,我无法使其工作。
这是我的示例程序,它毫无意义地保存并重新加载:
import z3
filename = 'z3test.smt'
# Make a solver with some arbitrary useless constraint
solver = z3.Solver()
solver.add(True)
# Save to file
smt2 = solver.sexpr()
with open(filename, mode='w', encoding='ascii') as f: # overwrite
f.write(smt2)
f.close()
# Load from file
solver.reset()
solver.from_file(filename)
它失败并显示:
Exception has occurred: ctypes.ArgumentError
argument 3: <class 'TypeError'>: wrong type
File "C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\z3\z3-4.8.4.d6df51951f4c-x64-win\bin\python\z3\z3core.py", line 3449, in Z3_solver_from_file
_elems.f(a0, a1, _to_ascii(a2))
File "C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\z3\z3-4.8.4.d6df51951f4c-x64-win\bin\python\z3\z3.py", line 6670, in from_file
_handle_parse_error(e, self.ctx)
File "C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\src\z3test.py", line 17, in <module>
solver.from_file(filename)
我的理解或代码有问题吗?可以这样吗? sexpr()
和from_file()
是正确的一对API调用吗?
我正在Windows 10 64位操作系统上使用https://github.com/z3prover/z3/releases中的z3和z3py 4.8.4。
更多详细信息,如有需要:
我正在使用Python的z3来寻找大型剖分拼图的解决方案。
要查找所有解决方案,请致电solver.check()
。当它返回sat
的结论时,我将模型解释为拼图解决方案的图像。然后,我添加一个阻止该特定解决方案的阻止子句,然后再次调用solver.check()
。
这很好,我很高兴。
查找所有解决方案的运行时间大约需要几天,或者直到我感到无聊为止。我担心我的机器不能连续运行那么长时间。它可能会崩溃,没电或由于其他原因重启。
我可以轻松地重新创建初始约束,这是程序的重点。但是阻塞子句是运行时产品,是我们所走的路的函数。
我以为我可以保存求解器的状态,如果在运行时我发现这样的文件可以通过加载完整的阻塞子句重新启动,然后继续寻找更多的解决方案,而不必从头开始。
感谢您抽出宝贵的时间阅读和思考。
玛丽安