2

我正在尝试使用scipy.optimize.differential_evolution优化具有 10 个变量的标量函数。

标量值实际上是由模拟软件计算的,每次迭代大约需要 7 秒。问题是,即使我将 popsize 设置为 10,算法也需要 >1000 次迭代,这会导致计算时间非常长。

10 个变量是 5 个角度和 5 个长度:

phi_1 to phi_5 (0 to 360 degress)
l_1 to l_5 (0 to 20 micrometer)

在每次迭代中,值 (X_1, X_2, X_3, X_4, X_5, Y_1, Y_2, Y_3, Y_4, Y_5) 由下式计算

X = l*sin(phi) and Y = l*cos(phi)

仿真软件根据这些输入计算一个标量。

我试图将 popsize 减少到 3-5,但结果不是全局最优值。我之前也尝试过不同的策略,例如“rand1exp”和“best1exp”以及基于梯度的算法(SLSQP),但问题是由于正弦和余弦函数,起点至关重要,这会导致许多不同的(局部)结果。我相信 DE 是解决这个问题的最佳算法,但我无法想象它需要 >1000 次迭代来解决“仅”10 个变量的问题。

我这样称呼DE:

sol = differential_evolution(objective, popsize=10, strategy="best1bin", bounds=boundList)

有没有人对 DE 有一些经验并且可以给我一些正确参数的提示?

4

1 回答 1

1

我不熟悉差分进化算法,但这里有一些你可以考虑的想法:

  • 每次迭代 7 秒很多。我会考虑尽可能减少这个计算时间......

  • 如果您的标准是连续且可微的,则使用基于梯度的方法将是您的第一种方法。对于 10 个参数,基于梯度的算法至少需要 10 次迭代(如果您的标准是二次的)。在实践中,您应该期望更多(数百个),具体取决于收敛的难度。其他算法也可能需要相同数量的迭代。

  • 您的问题退化的事实不取决于算法。由于 phi+2*pi 将给出完全相同的标准值,因此您有无限数量的最小值。您需要从离解决方案不远的地方开始。您可以尝试提供智能猜测作为参数的起始值。

  • Scipy 中提供的一些基于梯度的方法允许为您的参数使用边界。

于 2019-07-04T12:07:41.870 回答