Scipy.optimize.minimize.最小化具有线性约束的SLSQP失败

2024-04-19 20:30:16 发布

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

考虑以下(凸)优化问题:

minimize 0.5 * y.T * y
s.t.     A*x - b == y

其中优化(向量)变量是x和{}和{},b分别是适当维数的矩阵和向量。在

下面的代码使用Scipy的SLSQP方法很容易找到解决方案:

^{pr2}$
Optimization terminated successfully.    (Exit mode 0)
            Current function value: 2.12236220865
            Iterations: 6
            Function evaluations: 192
            Gradient evaluations: 6

注意,约束函数是一个方便的“数组输出”函数。在

现在,原则上可以使用一组等价的“标量输出”约束函数(实际上是scipy.optimize公司文档只讨论这种类型的约束函数作为minimize)的输入。在

下面是minimize输出后面的等价约束集(与上面列出的相同Ab,初始值如下所示):

# this is the i-th element of cons(z):
def cons_i(z, i):
    vx = z[:n]
    vy = z[n:]
    return A[i].dot(vx) - b[i] - vy[i]

# listable of scalar-output constraints input for SLSQP:
cons_per_i = [{'type':'eq', 'fun': lambda z: cons_i(z, i)} for i in np.arange(m)]

sol2 = minimize(obj, x0 = z0, constraints = cons_per_i, method = 'SLSQP', options={'disp': True})
Singular matrix C in LSQ subproblem    (Exit mode 6)
            Current function value: 6.87999270692
            Iterations: 1
            Function evaluations: 32
            Gradient evaluations: 1

显然,算法失败了(返回的目标值实际上是给定初始化的目标值),我觉得有点奇怪。注意,运行[cons_per_i[i]['fun'](sol.x) for i in np.arange(m)]表明使用数组输出约束公式获得的sol.x如预期满足cons_per_i的所有标量输出约束(在数值公差内)。在

如果有人能解释一下这个问题,我将不胜感激。在


Tags: 函数inforvaluemodeexitfunctioncurrent
1条回答
网友
1楼 · 发布于 2024-04-19 20:30:16

您遇到了"late binding closures" gotcha。对cons_i的所有调用都使用第二个参数等于19进行。在

修复方法是在字典中使用argsdictionary元素来定义约束,而不是lambda函数闭包:

cons_per_i = [{'type':'eq', 'fun': cons_i, 'args': (i,)} for i in np.arange(m)]

这样,最小化就起作用了:

^{pr2}$

您也可以使用链接文章中提出的建议,即使用lambda表达式和具有所需默认值的第二个参数:

cons_per_i = [{'type':'eq', 'fun': lambda z, i=i: cons_i(z, i)} for i in np.arange(m)]

相关问题 更多 >