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

dav*_*vid 8 python optimization numpy minimize

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

我的问题:

minimize objfun

objfun   x*y

constraints 0<=x<=5,  0<=y<=5,  x+y==5
Run Code Online (Sandbox Code Playgroud)

我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

收到的结果:

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

gg3*_*349 6

我认为你正在遇到一个边缘案件.如果您尝试使用非对称的猜测,则可以收敛到正确的解决方案.

只需改变x0=[0,0]别的东西,比如x0=[.2,.9].

编辑:@pv评论后扩展.

[x,y]=[2.5,2.5]是受约束函数的局部最大值.跳到此局部最大值后,算法再次计算最小化目标所需的方向.

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

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