Python 求z3py中有界函数的最大值的范围内的值
我必须使用z3py获得函数最大值的值(在一定范围内)。 例如:我有一个函数(Python 求z3py中有界函数的最大值的范围内的值,python,z3,z3py,Python,Z3,Z3py,我必须使用z3py获得函数最大值的值(在一定范围内)。 例如:我有一个函数(foo(x,y)=2*x+1+y),我想找到[x,y](使用约束lo=0) 如果s.check()==sat: 打印(“上限:获取模型%s”%s.model()) 如果我只使用一个变量(例如,foo(x)=2*x+1),那么给定的模型是正确的,foo(x)的值是最高的。如果我使用多个变量(例如,foo(x,y)=2*x+y),则找到的结果是最小的 范围中的所有点都在函数的域中 编辑:显然,如果我删除关于X和Y的两个约束
foo(x,y)=2*x+1+y
),我想找到[x,y]
(使用约束lo=0)
如果s.check()==sat:
打印(“上限:获取模型%s”%s.model())
如果我只使用一个变量(例如,foo(x)=2*x+1
),那么给定的模型是正确的,foo(x)
的值是最高的。如果我使用多个变量(例如,foo(x,y)=2*x+y
),则找到的结果是最小的
范围中的所有点都在函数的域中
编辑:显然,如果我删除关于X和Y的两个约束,我会得到最大值。使用
scipy
,您可以最小化
(如果最小化f,则最大化-f)
如您所见,您有一个bounds
参数
界限:序列,变量的可选界限(仅适用于L-BFGS-B,
TNC、COBYLA和SLSQP)。x中每个元素的(最小,最大)对,
定义该参数的边界。对于“最小”或“最大”中的一个,请使用“无”
当这个方向没有边界时
关于优化例程的更多细节您的解决方案非常好,但不幸的是,我刚刚发现我必须使用z3py,因为我必须处理位向量。
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())
scipy.optimize.minimize(fun, x0, args=(), method='BFGS', jac=None,
hess=None, hessp=None, bounds=None, constraints=(), tol=None,
callback=None, options=None)