Scipy.optimize 不等式约束 - 考虑不等式的哪一侧?

Posted

技术标签:

【中文标题】Scipy.optimize 不等式约束 - 考虑不等式的哪一侧?【英文标题】:Scipy.optimize Inequality Constraint - Which side of the inequality is considered? 【发布时间】:2017-07-07 07:21:45 【问题描述】:

我正在使用 scipy.optimize 模块来找到可以最小化我的输出的最佳输入权重。从我看到的例子中,我们用一个单边方程来定义约束;然后我们创建一个“不等式”类型的变量。我的问题是优化包如何知道我的约束中的变量总和是否需要小于 1 或大于 1?

...

def constraint1(x):
    return x[0]+x[1]+x[2]+x[3]-1

....

con1 = 'type': 'ineq', 'fun': constraint1

链接到我在示例中使用的完整解决方案: http://apmonitor.com/che263/index.php/Main/PythonOptimization

【问题讨论】:

scipy.optimize.minimize 说“等式约束意味着约束函数结果为零,而不等式意味着它是非负的。” 【参考方案1】:

参考https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/optimize.html,向下滚动到Constrained minimization of multivariate scalar functions(最小化),可以发现

该算法允许处理约束最小化问题 形式:

[![在此处输入图片描述][1]][1]

不等式的形式为C_j(x) >= 0

所以当你将约束定义为

def constraint1(x):
    return x[0]+x[1]+x[2]+x[3]-1

并将约束的类型指定为

con1 = 'type': 'ineq', 'fun': constraint1

它自动假定约束是标准形式x[0]+x[1]+x[2]+x[3]-1>=0,即x[0]+x[1]+x[2]+x[3]>=1 [1]:https://i.stack.imgur.com/E3LPs.png

【讨论】:

作为一个评论,我正在搜索x[0]+x[1]+x[2]+x[3]<10,这通过简单地将10带到左边然后将它全部乘以-1来工作。无论如何,尽量得到标准的形式,然后根据需要进行调整。

以上是关于Scipy.optimize 不等式约束 - 考虑不等式的哪一侧?的主要内容,如果未能解决你的问题,请参考以下文章

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

Scipy.optimize.minimize method='SLSQP' 忽略约束

scipy.optimize.minimize 选择无视约束的参数

scipy.optimize.differential_evolution 的整数解约束?

非线性规划带约束-scipy.optimize.minimize

Scipy优化算法--scipy.optimize.fmin_tnc()/minimize()