E:\Anaconda\envs\tf1\python.exe G:\My_RL_PID\5\pso.py Traceback (most recent call last): File "G:\My_RL_PID\5\pso.py", line 67, in <module> pso.optimize() File "G:\My_RL_PID\5\pso.py", line 32, in optimize fitness = self.evaluate_fitness(particle.position) File "G:\My_RL_PID\5\pso.py", line 49, in evaluate_fitness Kp, Ki, Kd = position[i] # 为每个粒子分别取值 TypeError: cannot unpack non-iterable numpy.float64 object
时间: 2023-08-08 07:08:27 浏览: 149
认识python.pptx
这个错误是由于你尝试将一个 `numpy.float64` 对象进行解包赋值给 `Kp`、`Ki` 和 `Kd`,但是解包赋值只能用于可迭代对象,而不是单个的浮点数。
为了解决这个问题,你可以将解包赋值改为直接索引赋值,如下所示:
```python
def evaluate_fitness(self, position):
n_particles = position.shape[0] # 获取粒子的数量
j = [0] * n_particles # 初始化误差数组
for i in range(n_particles):
Kp = position[i][0]
Ki = position[i][1]
Kd = position[i][2]
pid = ctl.TransferFunction([Kd, Kp, Ki], [1, 0])
closed_loop = ctl.feedback(pid * self.sys, 1)
t, y = ctl.step_response(closed_loop)
error = 1.0 - y
j[i] = np.sum(np.abs(error))
return np.array(j)
```
通过将 `Kp`、`Ki` 和 `Kd` 直接索引为 `position[i][0]`、`position[i][1]` 和 `position[i][2]`,你可以正确地将粒子位置中的值分配给这些变量。
这样,你应该能够正常运行代码并解决错误。希望对你有所帮助!
阅读全文