【问题标题】:Python Scipy Optimization.minimize using SLSQP showing maximized resultsPython Scipy Optimization.minimize 使用 SLSQP 显示最大化结果
【发布时间】:2015-01-09 00:24:12
【问题描述】:

我正在学习使用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

我期望 fun 为 0 或显着接近 0,x 或 y 为 0

【问题讨论】:

    标签: python optimization numpy minimize


    【解决方案1】:

    我认为您遇到了极端情况。如果您尝试使用不对称的猜测,您会收敛到正确的解决方案。

    只需将x0=[0,0] 更改为其他名称,例如x0=[.2,.9]

    编辑:@pv 评论后展开。

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

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

    之所以出现问题,是因为目标和约束相对于x=y 是对称的,并且我们从准确的x=y 开始猜测。

    【讨论】:

    • print(x) 添加到func 确实表明求解器在第一次迭代时直接跳转到[2.5, 2.5] --- 这是约束目标函数的梯度为零的点。 SLSQP 可能随后会注意到它已到达鞍点并终止。
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2020-03-08
    • 2019-10-06
    • 2020-02-23
    • 2023-01-22
    • 2018-11-20
    相关资源
    最近更新 更多