我正在通过Python绑定使用z3来找到解析难题的解决方案(请考虑Tangram)。我承认我不太了解自己在做什么,因此将其视为一种有趣的学习经历。
大多数代码是关于几何的,然后我在不指定逻辑的情况下创建了求解器(调用z3.solver()
),创建了Bool变量负载,并为它们添加了纯粹的布尔约束。使用z3.PbEq()
和z3.PbLe()
创建的混合约束中,也恰好有n个约束中的1个和n个约束中的最多1个。
我的程序可以运行,但是问题很大,我在穷举搜索所有令人满意的模型,因此我需要花费数周甚至数月的时间。
我的一般问题是我是否可以以任何方式帮助z3。更具体地说,我问的是以下三个方面。像我一样无知,我盲目尝试了似乎相关的参数。
我意识到没有简单的答案。我希望能找到指向材料或关键字的指针,以查找继续学习这些东西的方法。
1)明确选择一个理论:
我尝试致电z3.solver()
而不是z3.solverFor('QF_FD')
。
仅此一项似乎没有任何区别。有没有办法找出存在的理论,如果我只是调用solver(),它实际上会使用什么?在哪里可以了解哪种理论最适合我的问题?
2)尝试启用并行性:
我注意到我的程序不能执行我的计算机必须提供的所有CPU内核。与其亲自思考如何并行化它,不如尝试查看z3可以做什么。
我设置了从help()输出中选择的各种参数,听起来好像它们可以控制并行性/多线程处理:
z3.set_param('parallel.enable', True)
z3.set_param('parallel.threads.max', 32)
z3.set_param('sat.local_search_threads', 3)
z3.set_param('sat.threads', 3)
我确实从中得到了不同的行为。与其他运行相比,该程序的确在多个线程中执行,并极大地预热了我的机器。但是不幸的是,我并没有满意地满足模型的要求,即使经过几天的处理,我也没有得到任何默认设置。
除了z3源代码之外,我还可以在哪里了解它的工作方式以及可能构造问题以便更好地并行化?
3)其他晦涩的参数。
我也玩过这些游戏:
z3.set_param('sat.lookahead_simplify', True)
z3.set_param('sat.acce', True)
z3.set_param('sat.pb.solver', 'solver')
但是没有明显改变。在help()的单行代码和实际代码之间有什么解释吗?