粒子群算法寻优动态图代码
时间: 2023-06-11 19:07:08 浏览: 57
以下是使用Matplotlib库实现粒子群算法寻优的动态图代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# 定义目标函数
def func(x):
return np.sin(10 * np.pi * x) / x + 5 * np.cos(2 * np.pi * x)
# 粒子群算法
def PSO(func, n_particles=50, n_iterations=100, w=0.729, c1=1.494, c2=1.494):
# 初始化粒子群的位置和速度
particles = np.random.uniform(-5, 5, size=(n_particles, 1))
velocities = np.zeros((n_particles, 1))
pbest_positions = particles.copy() # 个体最优位置
pbest_values = np.zeros((n_particles, 1)) # 个体最优值
gbest_position = particles[0].copy() # 全局最优位置
gbest_value = func(gbest_position) # 全局最优值
# 迭代寻优
for i in range(n_iterations):
# 更新粒子速度和位置
velocities = w * velocities + c1 * np.random.rand() * (pbest_positions - particles) \
+ c2 * np.random.rand() * (gbest_position - particles)
particles += velocities
# 计算粒子的适应值,并更新个体最优位置和全局最优位置
for j in range(n_particles):
particle = particles[j]
value = func(particle)
if value > pbest_values[j]:
pbest_values[j] = value
pbest_positions[j] = particle
if value > gbest_value:
gbest_value = value
gbest_position = particle
# 绘制动态图
plt.clf()
plt.plot(np.linspace(-5, 5, 1000), func(np.linspace(-5, 5, 1000)), 'b-')
plt.plot(particles, func(particles), 'ro')
plt.xlim(-5, 5)
plt.ylim(-5, 20)
plt.title('Iteration {}'.format(i+1))
plt.pause(0.1)
return gbest_position, gbest_value
# 运行粒子群算法并绘制动态图
ani = animation.FuncAnimation(plt.gcf(), PSO, fargs=(50, 50), interval=500)
plt.show()
```
在上述代码中,我们定义了目标函数 `func` 和粒子群算法 `PSO`,并使用Matplotlib库绘制了动态图。其中,目标函数为一个在区间 [-5, 5] 上的一维函数,粒子群算法的参数包括粒子数量、迭代次数、惯性权重、加速因子等。在 `PSO` 函数中,我们通过迭代更新粒子的位置和速度,并计算每个粒子的适应值,从而不断更新个体最优位置和全局最优位置。同时,我们使用 Matplotlib 的动态图功能,实时显示粒子的位置和适应值的变化,从而直观地观察算法的收敛过程。最后,我们调用 `animation.FuncAnimation` 方法运行粒子群算法,并使用 `plt.show()` 方法显示动态图。