PSO算法中全局最优位置列表被意外修改的问题求助
解决PSO算法中全局最优位置意外被修改的问题
这个问题我太熟悉了——Python里可变对象的引用坑!你遇到的核心问题是列表是引用类型,赋值操作不会创建新的副本,导致全局最优变量和粒子的位置列表共享了同一块内存空间,粒子位置更新时全局最优也被意外修改了。
下面一步步拆解解决:
1. 修复Particle类的个人最优引用问题
你在Particle初始化里写了self.best_position = self.position,这会让best_position直接指向position的内存地址。当粒子的位置被修改时,best_position也会跟着变,完全违背了PSO里「个人最优是粒子历史最佳位置」的逻辑。
把这行改成创建独立副本:
class Particle(): def __init__(self): self.position, self.velocity = initialize_pos_vel(n_dimension) # 用切片创建position的独立副本作为初始个人最优 self.best_position = self.position[:] self.best_fitness = wish_function(self.best_position)
2. 修复全局最优的引用问题
同样的,你初始化全局最优时直接赋值best_global_particle_vector = swarm.particles[0].best_position,还是在传递引用。改成创建副本:
def main(): swarm = Swarm() # 创建初始粒子个人最优的副本作为全局最优 best_global_particle_vector = swarm.particles[0].best_position[:] k = 0 # 假设你这里定义了迭代次数变量 K = 10 while k < K+1: print(" <<< 1 >>> ", best_global_particle_vector, " <<< 1 >>>") # 注意你这里有个笔误:best_gloval_particle_vector → best_global_particle_vector swarm = swarm.next_pos_vel(best_global_particle_vector) print(" <<< 2 >>> ", best_global_particle_vector, " <<< 2 >>>") # 额外补充PSO核心逻辑:更新个人最优与全局最优 for particle in swarm.particles: current_fitness = wish_function(particle.position) # 假设是求最小值,可根据你的适应度函数调整判断逻辑 if current_fitness < particle.best_fitness: particle.best_position = particle.position[:] particle.best_fitness = current_fitness # 对比更新全局最优 if current_fitness < wish_function(best_global_particle_vector): best_global_particle_vector = particle.best_position[:] k += 1
为什么这样能解决问题?
Python中,像列表这样的可变对象,赋值操作a = b只是让a指向b的内存地址,而非复制内容。用b[:]或者list(b)会创建一个全新的列表,新列表和原列表完全独立,修改其中一个不会影响另一个。
现在运行代码,全局最优位置就不会被意外修改,完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者bananaquit
相关产品推荐
相关产品推荐

