0

我正在使用以下代码进行实验并开始学​​习如何使用 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,所以我真的很感谢你的简单解释。

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

史蒂夫

4

2 回答 2

0

这些问题有几个部分,所以我将对这个答案有几个部分。

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

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

当您调用时differential_evolution,有一个参数 seed决定了函数中的“随机性”。从第一个时间点开始,它可能与真值有很大的偏差,它会调用它10次,而在1个步骤中,函数可以优化到真值。

如果你设置种子并且popsize为0:

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

这是种子所在的位置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
于 2020-04-15T17:49:34.913 回答
0

此处differential_evolution设置的人口中的成员总数。计算如下:

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

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

在最小化期间​​人口规模不会改变。np初始化种群后,必须评估初始种群(总大小)的每个成员。在最小化循环的第一次迭代中 np,对目标进行了进一步的评估。在第一次迭代结束时,会打印更新。因此,将在2 * np打印N第一次更新之前打印。每次后续迭代将仅np打印N.

于 2021-01-05T04:42:28.273 回答