代码
import numpy as np
import matplotlib.pyplot as plt
m = 3
D = 1
wmax = 0.9
wmin = 0.4
c1 = 2
c2 = 2
vmax = 2
xmax = 2.5
xmin = -2.5
t = 1
tmax = 100
x_arr = [(xmax - xmin) * np.random.rand() + xmin for _ in range(m)]
v_arr = [(2 * np.random.rand() - 1) * vmax for _ in range(m)]xp_arr = x_arr.copy()
fxp_arr = [float('inf')] * m xg = 0
fxg = float('inf')
fxg_history = []
w_arr = [wmax - i * (wmax - wmin) / tmax for i in range(tmax)]
def r_array():return [np.random.rand() for _ in range(tmax)]r_1_arr = r_array()
r_2_arr = r_array()
def update_velocity(v, x, xp, xg, w, r1, r2):new_v = v * w + c1 * r1 * (xp - x) + c2 * r2 * (xg - x)if new_v > vmax:new_v = vmaxelif new_v < -vmax:new_v = -vmaxreturn new_v
def update_position(x, v):new_x = x + vif new_x > xmax:new_x = xmaxelif new_x < xmin:new_x = xminreturn new_x
for t in range(tmax):for i in range(m):v_arr[i] = update_velocity(v_arr[i], x_arr[i], xp_arr[i], xg, w_arr[t], r_1_arr[t], r_2_arr[t])x_arr[i] = update_position(x_arr[i], v_arr[i])f = x_arr[i] ** 2if f < fxp_arr[i]:fxp_arr[i] = fxp_arr[i] = x_arr[i]if f < fxg:fxg = fxg = x_arr[i]fxg_history.append(fxg)
print(f"全局最优位置: {xg}")
print(f"全局最优适应度值: {fxg}")
plt.plot(range(tmax), fxg_history, label='Global Best Fitness')
plt.xlabel('Iteration')
plt.ylabel('Fitness Value')
plt.title('PSO Optimization of f(x) = x^2')
plt.legend()
plt.show()