Python Z3优化,严格控制质量
我遇到了一个以前提到的问题,我没有完全得到解决方案(将替换与简化结合起来)。在我的编码中,我有严格的不等式,我需要将ε设置为0或非常小的值。例如,我有以下简化的Python代码:Python Z3优化,严格控制质量,python,z3,z3py,optimathsat,Python,Z3,Z3py,Optimathsat,我遇到了一个以前提到的问题,我没有完全得到解决方案(将替换与简化结合起来)。在我的编码中,我有严格的不等式,我需要将ε设置为0或非常小的值。例如,我有以下简化的Python代码: from z3 import * p = Real('p') q = Real('q') s = Optimize() s.add(p > 0, p < 1) s.add(q > 0, q < 1) h = s.maximize(p) print s.check() print s.upp
from z3 import *
p = Real('p')
q = Real('q')
s = Optimize()
s.add(p > 0, p < 1)
s.add(q > 0, q < 1)
h = s.maximize(p)
print s.check()
print s.upper(h)
print s.model()
从z3导入*
p=实('p')
q=实('q')
s=优化()
s、 添加(p>0,p<1)
s、 添加(q>0,q<1)
h=s.最大化(p)
打印s.检查()
打印s.upper(h)
打印s.model()
我怎样才能使p被赋予最大值1?(现在分配1/2)非常感谢 前提:
p
以固定精度接近1- 无论是在Python API中还是在smt2选项中,我都找不到任何选项来设置
epsilon
- 通过更改
的间隔大小,返回模型中x
的值与最佳值的距离不同(例如,间隔x
给出0,10
,而x=9
给出0,1
)x=0.5
因此: 我会用以下方法来做:
from z3 import *
epsilon = 0.0000001
p = Real('p')
q = Real('q')
s = Optimize()
s.add(p > 0, p < 1)
s.add(q > 0, q < 1)
s.push()
h = s.maximize(p)
print s.check() # Here I assume SAT
opt_value = h.value()
if epsilon in opt_value: # TODO: refine
s.pop()
opt_term = instantiate(opt_value, epsilon) # TODO: encode this function
s.add(p > opt_value)
s.check()
print s.model()
else:
print s.model()
s.pop()
OptiMathSAT有一个命令行选项-optimization.theory.la.epsilon=N
,用于在公式的返回模型中控制epsilon
的值。默认情况下,N=6
和epsilon
为10^-6
。以下是输出:
### MAXIMIZATION STATS ###
# objective: p (index: 0)
# interval: [ -INF , +INF ]
#
# Search terminated!
# Exact strict optimum found!
# Optimum: <1
# Search steps: 1 (sat: 1)
# - binary: 0 (sat: 0)
# - linear: 1 (sat: 1)
# Restarts: 1 [session: 1]
# Decisions: 3 (0 random) [session: 3 (0 random)]
# Propagations: 6 (0 theory) [session: 13 (0 theory)]
# Watched clauses visited: 1 (0 binary) [session: 2 (1 binary)]
# Conflicts: 3 (3 theory) [session: 3 (3 theory)]
# Error:
# - absolute: 0
# - relative: 0
# Total time: 0.000 s
# - first solution: 0.000 s
# - optimization: 0.000 s
# - certification: 0.000 s
# Memory used: 8.977 MB
sat
( (p (/ 1999999 2000000))
(q (/ 1 2000000)) )
###最大化统计###
#目标:p(指数:0)
#间隔:[-INF,+INF]
#
#搜索终止!
#找到了精确严格的最优解!
#最佳:请使用code
格式。因此,真正的问题似乎是变量的最佳值不是模型返回的值。这是期望的结果吗?在我的编码中,我需要所有变量的精确值,这些变量会导致目标函数的最优值。使用非严格不等式是一种选择吗?另请参见。用0.0000001
替换epsilon
,并添加强制p
赋值大于opt_值的约束对我起到了作用。谢谢我不认为这是一个完整的答案,但充其量只是一个暂时的调整。如果我能把它作为评论发布,我早就这么做了。也许z3开发人员可以给出一个正确的答案。
### MAXIMIZATION STATS ###
# objective: p (index: 0)
# interval: [ -INF , +INF ]
#
# Search terminated!
# Exact strict optimum found!
# Optimum: <1
# Search steps: 1 (sat: 1)
# - binary: 0 (sat: 0)
# - linear: 1 (sat: 1)
# Restarts: 1 [session: 1]
# Decisions: 3 (0 random) [session: 3 (0 random)]
# Propagations: 6 (0 theory) [session: 13 (0 theory)]
# Watched clauses visited: 1 (0 binary) [session: 2 (1 binary)]
# Conflicts: 3 (3 theory) [session: 3 (3 theory)]
# Error:
# - absolute: 0
# - relative: 0
# Total time: 0.000 s
# - first solution: 0.000 s
# - optimization: 0.000 s
# - certification: 0.000 s
# Memory used: 8.977 MB
sat
( (p (/ 1999999 2000000))
(q (/ 1 2000000)) )