Python 具有10个变量的Scipy差分进化需要多次迭代
我试图通过使用优化一个10个变量的标量函数 标量值实际上是由模拟软件计算的,每次迭代大约需要7秒。问题是,即使我将popsize设置为10,算法也需要>1000次迭代,这会导致非常长的计算时间 10个变量为5个角度和5个长度: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(
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中提供的一些基于梯度的方法允许对参数使用边界