【问题标题】:Scipy minimize .. 'Inequality constraints incompatible'Scipy最小化..'不等式约束不兼容'
【发布时间】:2020-12-20 00:24:11
【问题描述】:

你好,我试图最小化一个简单的 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]},
        {'type': 'ineq','fun': lambda x: x[1]-1},
        {'type': 'ineq','fun': lambda x: 3-x[1]},
        {'type': 'ineq','fun': lambda x: x[2]-5},
        {'type': 'ineq','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])

【问题讨论】:

    标签: python scipy constraints minimize


    【解决方案1】:

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

    默认情况下,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]},
            {'type': 'ineq','fun': lambda x: x[1]-1},
            {'type': 'ineq','fun': lambda x: 3-x[1]},
            {'type': 'ineq','fun': lambda x: x[2]-5},
            {'type': 'ineq','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])
    

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 2017-07-07
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2017-08-01
      相关资源
      最近更新 更多