我正在寻找一个合适的SciPy(或另一个Python库)算法来找到一个具有非常坚韧非线性约束的光滑函数(实际上是预算的总和)的全局最小值。
我已经尝试过全局优化算法,比如shgo和basinhopping,使用局部优化器,比如'trust-bands','COBYLA'或'SLSQP',但总是失败。所有排除结果都是不适当的高值或非常接近我的x 0。例如,几十种预防措施之一:
def cons_J(x, *args):
return np.ones(len(x))
minimizer_kwargs = {'method': 'SLSQP',
'args': (reach, freq, DF_GROUP, MEMBER, days),
'constraints': cons_sqlsqp,
'tol': 0.01,
'options': {'maxiter': 15, 'disp':True},
'jac': cons_J}
result = basinhopping(minimize_me_reach, x0=x0,
minimizer_kwargs=minimizer_kwargs,
niter=150, T=1500, stepsize=10000,
interval=40, disp=True,
niter_success=80, seed=350
)
也许超参数看起来太奇怪了,但我已经尝试了不同的设置,默认情况下也是如此。
现在有一个非线性约束,它定义为
cons_sqlsqp = ({'type': 'eq', 'fun': constr_reach})
但之后会有3个额外的限制。
那么,有什么合适的算法吗?
1条答案
按热度按时间bnl4lu3b1#
您可以尝试genetic algorithms,这是解决困扰现代优化工具箱的问题的传统选择。这将提供一个近似的解决方案 * 最终**,但可能需要非常,非常长的时间。只要确保启用精英选择,因为在这种情况下有收敛的证明。
这可能在严格意义上回答了这个问题。然而,在这种情况下,通常最好是重新制定的优化问题,可能通过选择不同的建模方法。