为何for循环中初始化的粒子x1属性随机数全部相同?
问题原因
你用np.full(20, Particle(Position(), Position(), Position()))创建粒子数组时,所有元素都是同一个Particle实例的引用。因为Particle(...)仅在调用np.full时执行一次,生成单个实例后,数组里的20个元素全指向这个实例。循环中每次修改p.position.x1,本质都是在修改同一个Position对象的属性,最终所有粒子的x1都会变成循环最后一次生成的随机数。
修复方案
不要用np.full复用同一个实例,而是逐个创建独立的Particle对象:
import numpy as np import random from dataclasses import dataclass @dataclass class Position: x1: int = 0 x2: int = 0 @dataclass class Particle: position: Position pbest: Position velocity: Position f : float = 0.0 def initialize(): # 列表推导式逐个生成独立的Particle实例,再转为numpy数组 particles = np.array([Particle(Position(), Position(), Position()) for _ in range(20)]) for p in particles: p.position.x1 = random.randint(-5, 5) return particles
这样每个Particle及其关联的position、pbest、velocity都是独立对象,修改单个粒子的属性不会影响其他粒子。
内容的提问来源于stack exchange,提问作者mSafdel
相关产品推荐
相关产品推荐

