Pyswarms库自定义目标函数报错求助:维度不匹配问题
解决Pyswarms自定义目标函数的维度不匹配错误
你的问题出在自定义目标函数的返回值形状不符合Pyswarms的要求。
错误原因
Pyswarms中,目标函数f(x)的输入x是形状为(n_particles, dimensions)的数组(这里是(100,2)),必须返回形状为(n_particles,)的一维数组,每个元素对应一个粒子的标量成本值。
你当前的函数return x**2会返回(100,2)的数组,每个粒子对应两个值,但Pyswarms期望每个粒子只有一个成本值,所以出现了形状不匹配的报错:(100,2) 和 (100,) 无法进行广播比较。
修复后的代码
将目标函数修改为对每个粒子的维度计算结果进行聚合(比如平方和),确保返回一维数组:
import pyswarms as ps from pyswarms.utils.functions import single_obj as fx def f(x): # 对每个粒子的所有维度计算平方和,返回形状(100,)的数组 return (x**2).sum(axis=1) options = {'c1':0.5, 'c2': 0.3, 'w':0.9} optimizer = ps.single.GlobalBestPSO(n_particles=100, dimensions=2, options=options) best_cost, best_pos = optimizer.optimize(f, iters=100) print(best_pos) print(best_cost)
关键说明
- 目标函数的核心要求:输入
(N,D)数组,输出(N,)数组,N是粒子数量,D是维度数。 - 你可以根据自己的需求选择聚合方式:比如求和、均值、最大值等,只要最终每个粒子对应一个标量成本即可。
- 如果你的实际需求是优化多维度的目标,那需要重新设计目标函数——PSO单目标优化必须将多维度目标转化为一个标量值。
内容的提问来源于stack exchange,提问作者rfpg1
相关产品推荐
相关产品推荐

