Выбор начальных позиций в pyswarm (Оптимизация роя частиц) - PullRequest
1 голос
/ 08 января 2020

Я применяю PSO в задаче оптимизации. У меня есть функция стоимости c (x), в которой x является размерным массивом. Используя 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)

Однако, поскольку сходимость медленная, и у меня есть представление о том, каким должен быть вектор x, результатом которого является минимум c (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?

1 Ответ

0 голосов
/ 04 апреля 2020

Автор Pyswarms здесь:)

Размер init_pos должен быть (swarm_size, num_dimensions). Однако, как вы сказали:

В этом случае переменная init_pos представляет собой массив размера (len (X),). Однако, когда я выполняю код

Поскольку вы передаете одномерный массив, он выдаст ошибку. Опять же, чтобы решить эту проблему, инициализируйте вашу матрицу положения так, чтобы она имела два измерения.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...