gpt4 book ai didi

python - scipy.optimize.minimize 方法 ='SLSQP' 忽略约束

转载 作者:太空狗 更新时间:2023-10-29 20:58:29 61 4
gpt4 key购买 nike

我正在使用 SciPy 进行优化,而 SLSQP 方法似乎忽略了我的约束。

具体来说,我希望 x[3] 和 x[4] 在 [0-1] 范围内

我收到消息:“不等式约束不兼容”

这是执行的结果,后面是示例代码(使用虚拟函数):

  status: 4
success: False
njev: 2
nfev: 24
fun: 0.11923608071680103
x: array([-10993.4278558 , -19570.77080806, -23495.15914299, -26531.4862831 ,
4679.97660534])
message: 'Inequality constraints incompatible'
jac: array([ 12548372.4766904 , 12967696.88362279, 39928956.72239509,
-9224613.99092537, 3954696.30747453, 0. ])
nit: 2

这是我的代码:

from random import random
from scipy.optimize import minimize

def func(x):
""" dummy function to optimize """
print 'x'+str(x)
return random()

my_constraints = ({'type':'ineq', 'fun':lambda(x):1-x[3]-x[4]},
{'type':'ineq', 'fun':lambda(x):x[3]},
{'type':'ineq', 'fun':lambda(x):x[4]},
{'type':'ineq', 'fun':lambda(x):1-x[4]},
{'type':'ineq', 'fun':lambda(x):1-x[3]})

minimize(func, [57.9499 ,-18.2736,1.1664,0.0000,0.0765],
method='SLSQP',constraints=my_constraints)

编辑 -即使删除第一个约束,问题仍然存在。

当我尝试使用边界 变量时问题仍然存在。即,

bounds_pairs = [(None,None),(None,None),(None,None),(0,1),(0,1)]
minimize(f,initial_guess,method=method_name,bounds=bounds_pairs,constraints=non_negative_prob)

最佳答案

我知道这是一个非常古老的问题,但我很感兴趣。

什么时候发生?

当优化函数不能可靠地微分时,就会出现这个问题。如果你使用像这样的平滑函数:

opt = numpy.array([2, 2, 2, 2, 2])

def func(x):
return sum((x - opt)**2)

问题消失了。

如何施加硬约束?

请注意,scipy.minimize 中的任何约束算法都不能保证永远不会在约束之外计算函数。如果这是您的要求,您应该使用转换。例如,要确保 x[3] 不使用负值,您可以使用转换 x3_real = 10^x[3]。这样 x[3] 可以是任何值,但您使用的变量永远不会是负数。

深入分析

调查 slsqp 的 Fortran 代码可得出以下关于此错误何时发生的见解。该例程返回一个 MODE 变量,该变量可以采用以下值:

C*        MODE = -1: GRADIENT EVALUATION, (G&A)                        *
C* 0: ON ENTRY: INITIALIZATION, (F,G,C&A) *
C* ON EXIT : REQUIRED ACCURACY FOR SOLUTION OBTAINED *
C* 1: FUNCTION EVALUATION, (F&C) *
C* *
C* FAILURE MODES: *
C* 2: NUMBER OF EQUALITY CONTRAINTS LARGER THAN N *
C* 3: MORE THAN 3*N ITERATIONS IN LSQ SUBPROBLEM *
C* 4: INEQUALITY CONSTRAINTS INCOMPATIBLE *
C* 5: SINGULAR MATRIX E IN LSQ SUBPROBLEM *
C* 6: SINGULAR MATRIX C IN LSQ SUBPROBLEM *

分配模式 4(这是您遇到的错误)的部分如下:

C   SEARCH DIRECTION AS SOLUTION OF QP - SUBPROBLEM

CALL dcopy_(n, xl, 1, u, 1)
CALL dcopy_(n, xu, 1, v, 1)
CALL daxpy_sl(n, -one, x, 1, u, 1)
CALL daxpy_sl(n, -one, x, 1, v, 1)
h4 = one
CALL lsq (m, meq, n , n3, la, l, g, a, c, u, v, s, r, w, iw, mode)

C AUGMENTED PROBLEM FOR INCONSISTENT LINEARIZATION

IF (mode.EQ.6) THEN
IF (n.EQ.meq) THEN
mode = 4
ENDIF
ENDIF

所以基本上您可以看到它试图找到下降方向,如果约束处于事件状态,它会尝试沿约束求导,但在 lsq 子问题 (mode = 6) 中出现奇异矩阵失败, 然后它推断如果所有的约束方程都被评估并且没有一个产生成功的下降方向,这一定是一组矛盾的约束 (mode = 4)。

关于python - scipy.optimize.minimize 方法 ='SLSQP' 忽略约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511284/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com