Python 具有10个变量的Scipy差分进化需要多次迭代

Python 具有10个变量的Scipy差分进化需要多次迭代,python,multidimensional-array,scipy,runtime,differential-evolution,Python,Multidimensional Array,Scipy,Runtime,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(

我试图通过使用优化一个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个变量的问题

我这样给德打电话:

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

有没有人有DE方面的经验,可以给我一些关于正确参数的提示?

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

  • 每次迭代7秒是非常多的。我会尽量减少这个计算时间,只要有可能……

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

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

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


谢谢你的建议。问题是我不能减少模拟软件的运行时间(这是一个复杂的齿轮箱模拟)。我已经尝试了多个基于梯度的方法测试,这些方法对φ1到φ5有不同的起点,比如0、90、180、270、360,每一个都给了我不同的结果。也许运行大量测试并选择具有最佳标量值的测试是最好的主意。幸运的是,基于梯度的方法比DE快得多。事实上,您的问题似乎有很多局部极小值,我不知道既便宜(迭代次数少)又能避免局部极小值的算法:(似乎对解决方案的评估是瓶颈。因此,我建议使用基于单一的元启发式方法,如迭代局部搜索。通常,在这些情况下,它更有效。我现在的解决方法是使用基于梯度的方法(SLSQP)然后我用不同的起点运行多次,以确定一个好的,但可能不是最佳的值。我认为在我的情况下,工程师必须提交他的专家知识,以设置基于梯度的算法的起点。遗憾的是,不期望r评估/模拟的时间很快就会缩短。对于此类问题,全局优化可能不可能/有效。