我正在使用下面的代码进行实验,并开始学习如何使用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)当设置流行大小时,问题就会出现。我得到的人口比预期的多,如果我把它设置为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了,所以我会非常感谢一个简单的解释。
感谢每一个花时间回答我的人。
史蒂夫
发布于 2020-04-15 17:49:34
问题有几个部分,所以我会有几个部分来回答这个问题。
为什么popsize=0不抛出一个错误?
这是differential_evolution的早期实现,原因是它没有抛出一个错误。您可以看到,第一个调用将导致10个调用,而第二个和第三个调用只导致5个,这是因为随机种子。
当您调用differential_evolution时,有一个参数seed,它决定函数中的“随机性”。由于第一个时间点,它可以非常远离真值,它将调用它10次,而在一个步骤中,函数可以优化到真值。
如果您设置了种子并设置为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>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如果我们将波普大小改变为大于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发布于 2021-01-05 04:42:28
在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。
https://stackoverflow.com/questions/60827985
复制相似问题