1

正如标题所说,我正在使用 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 算法的其他重要参数是默认参数。

有没有人有一些关于用神秘调整差分进化的建议?有没有办法避免结果中的这种差异?我知道这是一个随机算法,但我没想到它在 gtol 为 3500 上运行时会给出不同的结果。我的理解也是这个算法不会陷入局部最小值,但我可能错了。

ps

这与问题无关,只是为了说明为什么这对我很重要。

我的工作需要做的是在上述条件下,针对几个输入数据最小化一个函数:我在 O(10) 参数上针对每个数据配置进行优化,然后带有一些参数的配置给出整体最小值是被选中的人。

现在,如果优化器不稳定,它可能会偶然给我错误的数据配置作为最佳配置,因为我运行了数百个。

4

1 回答 1

1

我是mystic作者。正如您所说,差分进化(DE)是一种随机算法。本质上,DE 使用当前解决方案向量上的随机突变来提出新的候选解决方案。因此,在许多情况下,您可以期望在不同的运行中得到不同的结果,尤其是当函数是非线性的时。

理论上,如果你让它永远运行,它会找到全局最小值。但是,我们大多数人都不想等那么久。因此,存在终止条件,例如gtol(世代交替),它设置了迭代次数的截止值而没有改进。还有一些求解器参数会影响突变的生成方式,例如crossscalestrategy。本质上,如果你在不同的运行中得到不同的结果,这意味着你还没有针对特定的成本函数调整优化器,应该尝试使用这些设置。

npop重要的是和之间的平衡gtol,这是我经常首先考虑的地方。通常,您希望增加候选人的数量,直到它饱和(即没有效果)或变得太慢。

如果您有其他信息可以限制问题,这通常会有所帮助(即使用constraintspenalty限制您的搜索空间)。

我还使用 mystic 的可视化工具来尝试了解响应面的样子(即日志数据的可视化和插值)。

简短的回答是,在算法中包含随机性的任何求解器通常都需要调整才能获得一致的结果。

于 2021-03-24T12:20:21.903 回答