【发布时间】: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) >= 0.9。因此我假设他的算法忽略了这个约束或者没有得到正确的连接。我也尝试了{'type': 'ineq', 'fun': g, 'args': arguments},它有效,但我不确定如何在这里实现>= 0.9语句。有什么建议吗? -
我对@987654329@一无所知。 (凸的?平滑的?有可用的衍生物吗?)
标签: function optimization scipy constraints minimize