【发布时间】:2019-11-07 09:03:22
【问题描述】:
我正在尝试使用 Z3py 优化基于最小化的集合覆盖问题 (SCP41) 的实例。
结果如下:
使用
(1) 我知道 Z3 支持优化 (https://rise4fun.com/Z3/tutorial/optimization)。很多时候我在 SCP41 和其他实例中都达到了最佳状态,但也有一些没有。
(2) 我知道,如果我在没有优化模块的情况下使用 Z3py API,我将不得不执行@Leonardo de Moura 在 (Minimum and maximum values of integer variable) 中描述的典型顺序搜索。它永远不会给我结果。
我的方法
(3) 我试图通过实现类似于它在 (Does Z3 have support for optimization problems) 中解释@Philippe 的二进制搜索来改进顺序搜索方法,当我运行我的算法时它会等待并且我没有得到任何结果。
我知道二进制搜索应该更快并且在这种情况下可以工作?我也知道实例 SCP41 很大,产生了很多限制,它变得非常具有组合性,这是我的完整代码 (Code large instance),这是我的二进制搜索:
def min(F, Z, M, LB, UB, C):
i = 0
s = Solver()
s.add(F[0])
s.add(F[1])
s.add(F[2])
s.add(F[3])
s.add(F[4])
s.add(F[5])
r = s.check()
if r == sat:
UB = s.model()[Z]
while int(str(LB)) <= int(str(UB)):
C = int(( int(str(LB)) + int(str(UB)) / 2))
s.push()
s.add( Z > LB, Z <= C)
r = s.check()
if r==sat:
UB = Z
return s.model()
elif r==unsat:
LB = C
s.pop()
i = i + 1
if (i > M):
raise Z3Exception("maximum not found, maximum number of iterations was reached")
return unsat
而且,这是我在初始测试中使用的另一个实例 (Code short instance),它在任何情况下都运行良好。
什么是不正确的二分搜索或 Z3 的某些概念没有正确应用?
问候, 亚历克斯
【问题讨论】:
标签: z3 z3py sat-solvers