scipy.optimize differential_evolution 似乎忽略了人口规模限制

scipy.optimize differential_evolution seems to ignore population size limit

我正在使用以下代码进行实验并开始学​​习如何使用 DE 来优化更复杂的问题。我需要一个可以处理整数的优化器。

from scipy.optimize import differential_evolution
def objfun(x):
    print('N')
    return x[0]+2*x[1]**-4*x[2]
solution=differential_evolution(objfun,bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True)

设置popsize时出现问题。我得到的人口比预期的要多,如果我将它设置为 0,它会为第一个人口继续提供 10 个元素,然后为其他人口提供 5 个元素,直到达到最大值。

这是我使用上述代码得到的输出示例

runfile('D:/PYTHON/untitled0.py', wdir='D:/PYTHON')
N
N
N
N
N
N
N
N
N
N
differential_evolution step 1: f(x)= 318.074
N
N
N
N
N
differential_evolution step 2: f(x)= 169.667
N
N
N
N
N
differential_evolution step 3: f(x)= 169.667

我真的不明白我做错了什么,至少我预计 popsize=0 会报错。此外,是否还有任何其他隐藏参数来设置必须编辑的初始种群大小?

我还是个初学者,我几周前才开始使用 python,所以非常感谢您提供简单的解释。

非常感谢所有花时间回答我的人。

史蒂夫

问题有几个部分,所以我将有几个部分来回答这个问题。

为什么 popsize=0 不抛出错误?

这是在 differential_evolution 的 scipy 实现中,因为它不会引发错误。您可以看到第一次调用将产生 10 次调用,而第二次和第三次调用只会产生 5 次。这是因为随机种子。

当您调用 differential_evolution 时,有一个参数 seed 决定函数中的 "randomness"。从第一个时间点开始,它可能会非常偏离真实值,它会调用它 10 次,而在 1 步中,函数可以优化到真实值。

如果设置seed且popsize为0:

如果您确实设置了种子,那么您可以重现代码并查看它是否正确。

这里是seed的地方0(没有优化更多):

>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=0,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 1098.52
differential_evolution step 2: f(x)= 1098.52
differential_evolution step 3: f(x)= 1098.52

popsize > 0 的种子:

第一次迭代调用函数的次数可能比最后一次多,这可能是由于函数的优化方式及其随机性所致。

differential_evolution step 1: f(x)= 183.92
differential_evolution step 2: f(x)= 183.92
differential_evolution step 3: f(x)= 5.81206

如果我们将 popsize 更改为大于 10 的值,我们将更接近最小值。

>>> soln = differential_evolution(objfun, bounds=((1,10000),(1,200000),(1,50000)),popsize=100,maxiter=3,polish=False,disp=True, seed=0)
differential_evolution step 1: f(x)= 10.3284
differential_evolution step 2: f(x)= 8.35376
differential_evolution step 3: f(x)= 2.65333

differential_evolution中,人口中的成员总数设置为here。计算方式为:

self.num_population_members = max(5, popsize * self.parameter_count)

这意味着您可以拥有的最小人口数量为 5,最大数量为 popsize * self.parameter_count。最小数量 5 是因为 best2bin 策略需要至少 5 个人口成员。

人口规模在最小化过程中没有改变。初始化种群后,必须评估初始种群的每个成员(总大小 np)。在最小化循环的第一次迭代中,还有一个 np 条 objective 条评价。在第一次迭代结束时,打印更新。因此,在打印第一个更新之前,将打印 2 * npN。每个后续迭代将只有 np 打印 N.