正如标题所说,我正在使用Python mystic包中实现的差分进化算法来解决O(10)参数的全局优化问题,并有界限和约束。
我使用的是简单的接口diffev
result = my.diffev(func, x0, npop = 10*len(list(bnds)), bounds = bnds,
ftol = 1e-11, gtol = gtol, maxiter = 1024**3, maxfun = 1024**3,
constraints = constraint_eq, penalty = penalty,
full_output=True, itermon=mon, scale = scale)
我多次尝试运行相同的优化:给定差分进化算法的缩放比例,我将优化问题运行10倍。
结果呢?几乎所有的结果我都得到了不同的答案!
我尝试了0.7、0.75、0.8和0.85的缩放比例,所有这些都是大致相同的不良行为(如神秘页面所示)。
这里有一个例子:在x轴上有参数,在y轴上有它们的值。标签表示迭代。理想情况下,您只希望看到一行。
我使用gtol = 3500运行,所以它应该相当长。我使用npop = 10*number pars,ftol = 1e-11,diffev算法的其他重要参数是默认参数。
有没有人有什么建议可以用神秘主义来调整差异进化?有没有办法避免结果中的这种差异?我知道这是一个随机算法,但我没想到它在3500的gtol上运行时会给出不同的结果。我的理解也是这个算法不会陷入局部极小值,但我可能错了。
附注:
这与问题无关,但只是给出一些背景,为什么这对我很重要。
我的工作需要做的是在上面的条件下最小化几个输入数据的函数:我对O(10)参数上的每个数据配置进行优化,然后带有一些参数的配置就是“选择的”配置。
现在,如果优化器不稳定,它可能会给我错误的数据配置作为最佳数据配置,因为我运行了数百个数据配置。
发布于 2021-03-24 20:20:22
我是mystic
的作者。正如您所说的,差分进化(DE)是一种随机算法。本质上,DE使用当前解决方案向量上的随机突变来提出新的候选解决方案。因此,在许多情况下,特别是当函数是非线性函数时,您可以期望在不同的运行中得到不同的结果。
理论上,如果你让它永远运行,它会找到全局最小值。然而,我们大多数人都不想等那么久。因此,有像gtol
(change over generations)这样的终止条件,它设置了没有改进的迭代次数的截止值。还有一些求解器参数会影响变异的生成方式,如cross
、scale
和strategy
。本质上,如果您在不同的运行中得到了不同的结果,这意味着您还没有针对特定的成本函数调优优化器,应该尝试使用这些设置。
重要的是npop
和gtol
之间的平衡,这也是我经常首先考虑的。通常,你想要增加候选者的数量,直到它饱和(即没有效果)或变得太慢。
如果您有其他可以约束问题的信息,这通常会有所帮助(例如,使用constraints
或penalty
来限制您的搜索空间)。
我还使用mystic的可视化工具来尝试了解响应面是什么样子的(例如,日志数据的可视化和插值)。
简短的答案是,在算法中包含随机性的任何求解器通常都需要进行调整,才能获得一致的结果。
https://stackoverflow.com/questions/66772704
复制相似问题