You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:10:21