在 pyswarm 中选择初始位置(粒子群优化)



我在优化问题中应用PSO。我有一个成本函数 c(x(,其中 x 是一个 n 维数组。使用 pyswarms 可以通过以下方式计算最小值

swarm_size = 200
dim = len(X)      # Dimension of X
epsilon = 1.0
options = {'c1': 1.7, 'c2':1.7, 'w':0.729}
bdmin = np.array(bdmin)
bdmax = np.array(bdmax)

constraints = (bdmin,bdmax)
optimizer = ps.single.GlobalBestPSO(n_particles=swarm_size,
dimensions=dim,
options=options,
bounds=constraints)
cost, joint_vars = optimizer.optimize(opt_func, iters=1000)

但是,由于收敛速度很慢,并且我对结果最小的c(x(的向量x有一个概念,我想通知算法从哪里开始群。我尝试init_pos pyswarms 文档中描述的参数。

init_pos = np.array(init_pos) #My guess for a initial swarm

在这种情况下,变量 init_pos 是一个大小为 (len(X(,( 的数组。但是,当我执行代码时

optimizer = ps.single.GlobalBestPSO(n_particles=swarm_size,
dimensions=dim,
options=options,
bounds=constraints,
init_pos = init_pos)

我收到以下错误:

回溯(最近一次调用(:

File "<ipython-input-110-f2477b03016c>", line 1, in <module>
runfile('/home/lps/Downloads/pso.py', wdir='/home/lps/Downloads')
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/spyder_kernels/customize/spydercustomize.py", line 668, in 
runfile
execfile(filename, namespace)
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/spyder_kernels/customize/spydercustomize.py", line 108, in 
execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "/home/lps/Downloads/pso.py", line 234, in <module>
init_pos = init_pos)
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/pyswarms/single/global_best.py", line 132, in __init__
init_pos=init_pos,
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/pyswarms/base/base_single.py", line 110, in __init__
self.reset()
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/pyswarms/base/base_single.py", line 197, in reset
options=self.options,
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/pyswarms/backend/generators.py", line 245, in create_swarm
return Swarm(position, velocity, options=options)
File "<attrs generated init 
73b4f2f5e7b2bdb45fae355f5990e313431ea4d3>", line 11, in __init__
self.dimensions = __attr_factory_dimensions(self)
File "/home/lps/anaconda3/lib/python3.7/site- 
packages/pyswarms/backend/swarms.py", line 117, in dimensions_default
return self.position.shape[1]
IndexError: tuple index out of range

使用init_pos参数的正确方法是什么?

Pyswarms 的作者 这里 :)

init_pos的大小应(swarm_size, num_dimensions)。但是,正如您所说:

在这种情况下,变量 init_pos 是一个大小为 (len(X(,( 的数组。但是,当我执行代码时

由于您正在传递一维数组,因此它将出错。同样,要解决此问题,请初始化您的位置矩阵,使其具有二维。

希望对您有所帮助!

最新更新