【问题标题】:Scipy Optimization: Pass a function as a constraint with additional arguments (args)Scipy 优化:将函数作为具有附加参数(args)的约束传递
【发布时间】:2020-09-20 23:33:15
【问题描述】:

我有一个优化问题(通过更改 x[0] 和 x[1] 进行优化),其中一个约束是一个函数,它使用与优化函数相同的常量变量(a 和 b)。

min f(x, a, b)
  x[0] <= 100
  x[1] <= 500
  g(x, a, b) >= 0.9

但我不知道如何实现函数f和g之间的连接:

x0 = np.array([10, 100])
bnds = ((0, 500), (0, 5000))
arguments = (100, 4)  # This are varibles a and b

cons = ({'type': 'ineq', 'fun': lambda x: x[0]},
        {'type': 'ineq', 'fun': lambda x: x[1]},
        {'type': 'ineq', 'fun': lambda x: g(x, 100, 4)-0.9})

res = minimize(f, x0, args=arguments, method='SLSQP', bounds=bnds, constraints=cons)
print(res.x)

>> x: array([10, 5000])

但是使用这个结果函数 g 会导致

g(x,a,b)=0.85434

存在x=[452, 4188]的最优解,其中

g(x,a,b)=0.901839

我需要如何调整约束,即 g(x,a,b) 是有效的。

编辑:显然优化不成功:

print(res)
>> fun: 1778.86301369863
>> jac: array([1.00019786e+09, 9.31503296e-01])
>> message: 'Inequality constraints incompatible'
>> nfev: 4
>> nit: 1
>> njev: 1
>> status: 4
>> success: False
>> x: array([ 10., 5000.])

非常感谢。 紫外线

【问题讨论】:

  • slsqp 只是一个带有平滑假设的局部求解器,因此不能保证为任意函数 g 找到最优甚至可行的解。你可以尝试不同的起点。
  • 感谢您的回答。是的,我知道可能没有最佳解决方案,我已经尝试了一些不同的起点。尽管如此,该算法的解决方案并未满足约束g(a, b, x) &gt;= 0.9。因此我假设他的算法忽略了这个约束或者没有得到正确的连接。我也尝试了{'type': 'ineq', 'fun': g, 'args': arguments},它有效,但我不确定如何在这里实现&gt;= 0.9 语句。有什么建议吗?
  • 我对@9​​87654329@一无所知。 (凸的?平滑的?有可用的衍生物吗?)

标签: function optimization scipy constraints minimize


【解决方案1】:

f()g() 不是凸的,不是光滑的,并且没有可用的导数。尽管如此,我的问题是针对正确的语法(使用函数作为约束)。所以我尝试了两个“更简单”的功能(请参阅下面的可执行代码)并且它有效。所以我假设我的语法是正确的,问题在于优化方法“SLSQP”。 SCIPY 包中是否有一种优化方法(某种进化算法),我可以用它来解决我的g()f() 问题

  • 不凸,
  • 不流畅和
  • 衍生品不可用?

    import numpy as np
    from scipy.optimize import minimize
    
    def g(x, a, b):
        return (x[0]+x[1]+a+b)/100
    
    def f(x, a, b):
        return (x[0]*a+x[1]*b)*g(x, a, b)
    
    x0 = np.array([0, 0]) bnds = ((0, 30), (0, 20)) arguments = (2, 3)  # This are varibles a and b
    
    cons = ({'type': 'ineq', 'fun': lambda x: x[0]},
    {'type': 'ineq', 'fun': lambda x: x[1]},
    {'type': 'ineq', 'fun': lambda x: g(x, 2, 3)-0.5}) #<--My question was about the correct syntax of that constraint
    
    
    res = minimize(f, x0, args=arguments, method='SLSQP', bounds=bnds, constraints=cons)
    
    print(res)
    
    >>  fun: 52.50000000000027
    >>  jac: array([2.05000019, 2.55000019])
    >>  message: 'Optimization terminated successfully.'
    >>  nfev: 20
    >>  nit: 5
    >>  njev: 5
    >>  status: 0
    >>  success: True
    >>  x: array([30., 15.])
    

【讨论】:

    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2020-01-20
    • 2020-06-09
    相关资源
    最近更新 更多