具有10个变量的Scipy微分演化需要多次迭代

时间:2019-07-04 09:22:15

标签: python multidimensional-array scipy runtime differential-evolution

我正在尝试使用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有经验,可以给我一些正确参数的提示吗?

1 个答案:

答案 0 :(得分:1)

我不熟悉差分进化算法,但是您可能会考虑以下几点:

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

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

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

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