0

我必须使用 z3py 获得函数最大值的值(在它们的范围内)。例如:我有foo(x,y) = 2*x + 1 + y一个函数[x,y](换句话说,我必须解决一个范围内的最大问题,这可能吗?lo <= foo(x,y) <= hifoo(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 的两个约束,我会得到最大值。

4

1 回答 1

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 :序列,变量的可选边界(仅适用于 L-BFGS-B、TNC、COBYLA 和 SLSQP)。x 中每个元素的 (min, max) 对,定义该参数的界限。当该方向没有界限时,将 None 用于 min 或 max 之一。

有关优化例程的更多详细信息,请参见此处。

于 2013-09-26T00:58:02.990 回答