首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.optimize differential_evolution似乎忽略了人口规模的限制

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

Stack Overflow用户
提问于 2020-03-24 09:13:31
回答 2查看 968关注 0票数 0

我正在使用下面的代码进行实验,并开始学习如何使用DE优化更复杂的问题。我需要和优化器,可以与整数工作。

代码语言:javascript
复制
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个元素,直到达到最大值为止。

这是我从上面的代码得到的输出的一个例子。

代码语言:javascript
复制
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了,所以我会非常感谢一个简单的解释。

感谢每一个花时间回答我的人。

史蒂夫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-15 17:49:34

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

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

这是differential_evolution的早期实现,原因是它没有抛出一个错误。您可以看到,第一个调用将导致10个调用,而第二个和第三个调用只导致5个,这是因为随机种子。

当您调用differential_evolution时,有一个参数seed,它决定函数中的“随机性”。由于第一个时间点,它可以非常远离真值,它将调用它10次,而在一个步骤中,函数可以优化到真值。

如果您设置了种子并设置为0:

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

下面是种子为0的地方(它没有优化更多):

代码语言:javascript
复制
>>> 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的种子:

可能第一次迭代比最后一次迭代调用函数的次数更多,这可能是由于函数是如何被优化的,以及函数的随机性。

代码语言:javascript
复制
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的值,我们就会接近最小值。

代码语言:javascript
复制
>>> 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
票数 0
EN

Stack Overflow用户

发布于 2021-01-05 04:42:28

differential_evolution中,人口中的成员总数被设置为这里。计算方法如下:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60827985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档