Python Z3优化,严格控制质量

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

我遇到了一个以前提到的问题,我没有完全得到解决方案(将替换与简化结合起来)。在我的编码中,我有严格的不等式,我需要将ε设置为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.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

  • 在北卡罗来纳州(重点是我的)

  • ε是指一个非标准数(无穷小)。您可以将其设置为任意小。同样地,模型只使用标准数字,因此它选择一些数字,在本例中为9

    鉴于

    • 无论是在Python API中还是在smt2选项中,我都找不到任何选项来设置
      epsilon

    • 通过更改
      x
      的间隔大小,返回模型中
      x
      的值与最佳值的距离不同(例如,间隔
      0,10
      给出
      x=9
      ,而
      0,1
      给出
      x=0.5

    …我对上一句话的理解是z3随机选取了一些可满足的值,就是这样


    因此:

    我会用以下方法来做:

    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)) )