为何标准PSO与带被动聚集的PSO无差异?代码需修改吗?
带被动聚集的PSO代码问题修正
你的代码确实存在两处关键错误,导致被动聚集的特性没有真正生效,所以和标准PSO看不出差异,需要修改:
错误1:随机粒子Ri的生成方式错误
方程里的Ri是从当前粒子群中随机选取的粒子位置,但你用np.random.rand(n_particles)生成的是0-1区间的随机数值,和现有粒子的位置完全无关,这相当于给速度项加了一个无意义的随机扰动,而非被动聚集逻辑。
正确的做法是从存储所有粒子位置的数组中随机采样,假设你的粒子位置存在c数组里(对应你代码中的c[j]),应该这样生成Ri:
# 从粒子群中随机选取每个粒子对应的Ri,允许重复选取 R = c[np.random.randint(0, n_particles, size=n_particles)]
错误2:随机系数rand3的生成范围错误
方程里的r3是每个粒子独立的(0,1)均匀随机序列,但你用np.random.uniform(0,1)只生成了一个全局随机值,所有粒子的被动聚集项都用同一个系数,这会大幅削弱被动聚集的差异化特性。
正确的生成方式是给每个粒子生成一个独立的随机值:
rand3 = np.random.uniform(0, 1, n_particles)
修正后的完整代码示例
修正后的速度更新代码如下:
# 从粒子群中随机选取Ri R = c[np.random.randint(0, n_particles, size=n_particles)] # 生成每个粒子独立的rand3 rand3 = np.random.uniform(0, 1, n_particles) # 更新速度 v[j] = w * v[j] + c1 * (p_best[j] - c[j]) * rand1 + \ c2 * (g_best - c[j]) * rand2 + c3 * (R[j] - c[j]) * rand3
修改后,被动聚集项会引导粒子向随机选取的其他粒子位置靠近,这样就能体现出和标准PSO的差异了。
内容的提问来源于stack exchange,提问作者Akshita
相关产品推荐
相关产品推荐

