我必须使用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的两个约束,我会得到最大值。
答案 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.
的更多详细信息