Python Scipy Optimization.minimize使用SLSQP显示最大化结果

2024-04-29 09:24:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习用scipy.optimize.minimize优化一个多变量约束非线性问题,但得到了奇怪的结果。

我的问题:

minimize objfun

objfun   x*y

constraints 0<=x<=5,  0<=y<=5,  x+y==5

我的代码:

from scipy import optimize
def func(x):

    return x[0]*x[1]

bnds=((0,100),(0,5))

cons=({'type':'eq','fun':lambda x:x[0]+x[1]-5})
x0=[0,0]
res= optimize.minimize(func,x0,method='SLSQP',bounds=bnds,constraints=cons)

收到的结果:

status: 0 success: True njev: 2 nfev: 8 fun: 6.2499999999999991 x: array([ 2.5, 2.5]) message: 'Optimization terminated successfully.' jac: array([ 2.5, 2.5, 0. ]) nit: 2

我期望乐趣为0或显著接近0,x或y为0


Tags: 代码fromimportdefscipyarrayoptimizefunc
1条回答
网友
1楼 · 发布于 2024-04-29 09:24:18

我觉得你的案子很危险。如果你尝试一个非对称的猜测,你就会收敛到正确的解。

只要把x0=[0,0]改成其他的,比如x0=[.2,.9]

编辑:@pv comment后展开。

[x,y]=[2.5,2.5]是约束函数的局部最大值。在跳转到这个局部最大值之后,算法再次计算最小化目标所需的方向。

它是通过计算[ 2.50000001 2.5 ][ 2.5 2.50000001]处的值来实现的。它发现这个方向是(-1,-1)。但是,该方向与约束正交,然后停止。

出现这个问题是因为目标和约束相对于x=y是对称的,并且我们是从x=y上的猜测开始的。

相关问题 更多 >