获得一个范围内的值,该范围给出了z3py中有界函数的最大值

时间:2013-09-26 00:47:09

标签: python z3 z3py

我必须使用z3py获取给出函数最大值的值(在它们的范围内)。 例如:我有一个函数(foo(x,y) = 2*x + 1 + y),我希望找到[x,y]的值(使用约束lo <= foo(x,y) <= hi),使foo(x,y)最大。 换句话说,我必须解决一个范围内的最大问题,这可能吗?

我在python中编写了这个简单的脚本:

    s = Solver()
    # hi is given by the user
    # expr is foo(x)
    s.add(expr <= hi)
    s.add(expr >= lo)
    s.add(X >= 0)
    s.add(Y >= 0)

    if  s.check() == sat:
        print('_upper_bound: got model %s' % s.model())

如果我只使用变量(例如foo(x) = 2*x + 1),则给定模型是正确的,foo(x)的值最高。如果我使用多个变量(例如foo(x,y) = 2*x+y),则找到的结果是最小值。

范围内的所有点都在函数的范围内。

编辑:显然,如果我删除关于X和Y的两个约束,我会得到最大值。

1 个答案:

答案 0 :(得分:2)

使用scipy,您可minimize(如果最小化f,则最大化-f)

scipy.optimize.minimize(fun, x0, args=(), method='BFGS', jac=None, 
    hess=None, hessp=None, bounds=None, constraints=(), tol=None, 
    callback=None, options=None)

如您所见,您有一个bounds参数,

  

bounds:sequence,optional变量的Bounds(仅适用于L-BFGS-B,   TNC,COBYLA和SLSQP)。 x中每个元素的(min,max)对,   定义该参数的边界。使用None表示最小值或最大值之一   当那个方向没有界限时。

有关优化例程to be found here.

的更多详细信息