Scipy 最小化 .. '不等式约束不兼容'

问题描述

嗨,我试图最小化一个简单的 3 变量函数,在 x 变量中有一些范围约束......但我得到'不等式约束不兼容 - 知道吗?谢谢!!

from scipy.optimize import minimize

def f(x):
    return (int(558*x[0]*x[1]*x[2])-(x[2]*(558-int(558*x[0])))-(x[2]*558))

x0 = [0.4,1.0,2.0]

#real data Ranges 
#x[0] 0..1    
#x[1] 1..3
#x[2] 5..50

cons=( 
        {'type': 'ineq','fun': lambda x: x[0]},{'type': 'ineq','fun': lambda x: 1-x[0]},'fun': lambda x: x[1]-1},'fun': lambda x: 3-x[1]},'fun': lambda x: x[2]-5},'fun': lambda x: 50-x[2]}
)

res = minimize(f,x0,constraints=cons)
print(res)

完整的结果是

    fun: -33490.99993615066
     jac: array([ 6.7108864e+07,6.7108864e+07,-8.9300000e+02])
 message: 'Inequality constraints incompatible'
    nfev: 8
     nit: 2
    njev: 2
  status: 4
 success: False
       x: array([ 0.4,1.,49.99999993])

解决方法

您好,我怀疑问题出在所用的数值方法上。

在默认情况下,minimize 使用连续最小二乘规划 (SLSQP),这是一种梯度方法。因此,要最小化的函数必须是正则的,但考虑到您使用 int,它不是。

使用替代方法:通过线性逼近(COBYLA)进行约束优化,这是一种不同的性质,我得到以下内容

from scipy.optimize import minimize

def f(x):
    return (int(558*x[0]*x[1]*x[2])-(x[2]*(558-int(558*x[0])))-(x[2]*558))

x0 = [0.4,1.0,2.0]

#real data Ranges 
#x[0] 0..1    
#x[1] 1..3
#x[2] 5..50

cons=( 
        {'type': 'ineq','fun': lambda x: x[0]},{'type': 'ineq','fun': lambda x: 1-x[0]},'fun': lambda x: x[1]-1},'fun': lambda x: 3-x[1]},'fun': lambda x: x[2]-5},'fun': lambda x: 50-x[2]}
)

res = minimize(f,x0,constraints=cons,method="cobyla")
print(res)

带显示器

     fun: -55800.0
   maxcv: 7.395570986446986e-32
 message: 'Optimization terminated successfully.'
    nfev: 82
  status: 1
 success: True
       x: array([-7.39557099e-32,1.93750000e+00,5.00000000e+01])

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...