Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用z3py进行增量求解_Z3_Smt_Z3py - Fatal编程技术网

如何使用z3py进行增量求解

如何使用z3py进行增量求解,z3,smt,z3py,Z3,Smt,Z3py,我正在使用Z3解算器的python API来搜索优化的时间表。它工作得很好,除了它有时非常慢,即使对于小的图形,有时也非常快。原因可能是我的排程问题的约束非常复杂。 我试图加快速度,偶然发现了一些关于增量解决的文章。 据我所知,您可以通过仅应用部分约束,使用增量求解来修剪一些搜索空间 所以我的原始代码是这样的: for constraint in constraint_set: self._opt_solver.add(constraint) self._opt_solver.minim

我正在使用Z3解算器的python API来搜索优化的时间表。它工作得很好,除了它有时非常慢,即使对于小的图形,有时也非常快。原因可能是我的排程问题的约束非常复杂。 我试图加快速度,偶然发现了一些关于增量解决的文章。 据我所知,您可以通过仅应用部分约束,使用增量求解来修剪一些搜索空间

所以我的原始代码是这样的:

for constraint in constraint_set:
    self._opt_solver.add(constraint)
self._opt_solver.minimize(some_objective)
self._opt_solver.check()
model = self._opt_solver.mode()
我现在将其更改为以下内容:

for constraint in constraint_set:
    self._opt_solver.push(constraint)
    self._opt_solver.check()
self._opt_solver.minimize(some_objective)
self._opt_solver.check()
model = self._opt_solver.mode()
我基本上用push命令替换add命令,并在每次推后添加一个检查

首先,我的一般方法正确吗? 此外,我还有一个无法摆脱的例外:

谁能给我一个提示,我做错了什么。还有一个z3py教程,它用一些例子解释了如何使用pythonapi进行增量求解

我的最后一个问题是:这是最小化解算器执行时间的正确方法还是有其他/更好的方法?

函数push不带参数。它创建了一个回溯点,您可以稍后弹出到该点。请看这里:

所以,在这里,推动似乎根本不是你想要/需要的。您应该简单地逐个添加约束并调用check。然而,我非常怀疑每次添加后的检查是否会显著加快速度。特别是,与常规解算器不同的是,优化解算器通常从头开始解算所有问题。请参见此处的相关讨论:


关于增量:python API是自动增量的。增量只是指能够多次调用命令check,而解算器不会忘记以前看到的内容。i、 例如,调用检查,断言更多事实,再次调用检查;第二次检查将从一开始就考虑所有断言。您不应该对此做出任何假设,因为这会让您在最后一次呼叫检查时加快速度:这完全取决于所涉及的启发式和决策程序,这取决于手头的问题。

非常感谢您的快速回答。因此,我的后续问题是:如果迭代求解不能帮助我提高优化速度,我可以做些什么来提高性能?一般的、公认的没有帮助的答案是,你需要选择正确的策略,记住它可能不存在。当您调用check时,解算器使用策略、启发式等组合。如果您知道哪种策略效果最好,那么您应该直接使用它。但找出答案与其说是科学,不如说是一门艺术。您最好的办法是隔离一个您认为应该很容易解决的特别慢的案例,使其独立,并在这里或直接在Z3Github站点寻求帮助。您可以在StackOverflow中搜索z3战术,并看到各种类似的问题!
self._opt_solver.push(constraint) TypeError: push() takes 1 positional argument but 2 were given