背景
汽车应用程序的自动调谐器:应用程序可能会根据汽车的型号而变化,因此目标函数自然也会发生变化。问题是将参数调整为特定车型的最佳参数。输入:车型,输出:针对特定车型的应用程序的最佳参数。我想通过优化来解决这个问题
我试图最小化一个复杂的非线性函数,受两个非线性约束,一个不等式和一个等式约束的约束。问题本身并没有限制,但无论如何我已经对参数进行了限制,以帮助加快优化,因为我或多或少地知道正确参数的位置。参数是:[x0,x1,x2,x3]
我已将 scipy.optimize.minimize() 函数与 SLSQP 方法一起使用,并在问题得到正确界定时发现了良好的结果。虽然, scipy.optimize.minimize() 函数是一个局部优化器,它解决了我认为不是我的问题的 QP 问题。因此,我开始使用 mystic (mystic.differential_evolution) 的全局优化方法。由于我不是全局优化方面的专家,我自然会有一些问题。
问题
如果我选择的边界太宽,优化器(mystic.differential_evolution)将在一段时间后停止迭代并打印:
STOP("ChangeOverGeneration with {'tolerance': 0.005, 'generations': 1500}")
当我运行优化器找到的解决方案时,我发现结果不如我降低(缩小)边界那么好。显然,全局优化器还没有找到全局最优值,但它停止了迭代。我知道有多个参数集会产生相同的全局最小值。
由于目标函数可能会随着汽车模型的变化而变化,我希望边界保持相对宽泛,以防全局最优值发生变化,从而改变正确的参数。
问题
- 如何调整优化器的设置以使其继续搜索并找到全局最优值?
- npop = 10*dim 规则是解决问题的好方法吗?
- 我可以拓宽优化器搜索算法的视野,让它找到它错过的最佳参数吗?
代码
def optimize_mystic_wd(T, param_wp, w_max, safe_f):
# mystic
import mystic
from mystic.monitors import VerboseLoggingMonitor
from mystic.penalty import quadratic_inequality
from mystic.penalty import quadratic_equality
from mystic.solvers import diffev2
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# tools
from mystic.tools import getch
import pylab
import numpy as np
def objective(x):
from model_func import model
[val, _] = model(param_wp, x)
return -val
def penalty1(x): # <= 0.0
t = np.linspace(0, T, 100)
wd = (x[0] * np.sin(x[1] * t + x[3]) + x[2])
index = np.argmax(wd)
t_max = t[index]
return ((x[0] * np.sin(x[1] * t_max + x[3]) + x[2])) -2*np.pi
def penalty2(x): # == 0.0
return x[0] * (np.cos(x[3]) - np.cos(x[1] * T + x[3])) / x[1] + x[2] * T - 2 * np.pi
@quadratic_inequality(penalty1, k=1e12)
@quadratic_equality(penalty2, k=1e12)
def penalty(x):
return 0.0
b1 = (0, 2*np.pi)
b2 = (0, 2 * np.pi/(2*T))
b3 = (0, 2*np.pi)
b4 = (0, 2*np.pi/T)
bounds = [b1, b2, b3, b4]
stepmon = VerboseLoggingMonitor(1,1)
result = diffev2(objective, x0=bounds, bounds=bounds, penalty=penalty, npop=40, gtol=1500, disp=True, full_output=True, itermon=stepmon, handler=True, retall=True, maxiter=4000)