算法思想
粒子群优化算法灵感来源于鸟群觅食行为,鸟群在寻找食物时会通过互相信息交流来帮助种群更快的寻找到食物。
粒子群优化算法就是秉持这种思想
①:初始化粒子群
②:随即设置每个粒子的位置与速度(可以理解为粒子将要移动的距离)
③:计算每个粒子的适应度值并选出适应度最好的粒子
④:对每个粒子的位置以及速度进行更新
⑤:继续③步骤知道达到终止条件
算法流程图

算法参数设置
pop:population 粒子群规模 #求解函数
dim:dimension 粒子维度大小
low、up:个体上下限
N:惯性权重
Cs:自身认知常数
Cp:社会认知常数
G:generation 最大迭代次数
算法代码详解
导入库
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
定义目标函数
def f(x):
return np.sum((x-1) ** 2 - np.sin(x**2))
定义算法所用参数
pop_size = 100
dim = 20
low = -10
up = 10
iner = 0.5
Cs = 1.5
Cp = 2.0
G = 100
速度与位置更新
def refresh_velocity_position(velocity, position, i):
r1 = np.random.rand(dim)
r2 = np.random.rand(dim)
cognitive_velocity = Cs * r1 * (personal_position[i] - position[i])
social_velocity = Cp * r2 * (best_position - position[i])
velocity[i] = iner * velocity[i] + cognitive_velocity + social_velocity
position[i] = position[i] + velocity[i]
return velocity, position
边界处理
def band_save(position ,low, up):
position[position > up] = up
position[position < low] = low
return position
绘图函数
def drawing(x_values, y_values):
plt.plot(x_values, y_values)
plt.title('PSO优化算法',size = 18)
plt.xlabel('迭代数',size = 14)
plt.ylabel('适应度',size = 14)
plt.grid(True)
plt.show()
算法主程序
position = np.random.uniform(low, up, (pop_size, dim))
velocity = np.random.uniform(-1, 1, (pop_size, dim))
personal_position = np.copy(position)
personal_value = np.array([f(ind) for ind in position])
best_position = personal_position[np.argmin(personal_value)]
best_value = np.min(personal_value)
position_history = []
value_history = []
for iteration in range(G):
for i in range(pop_size):
re_velocity, re_position = refresh_velocity_position(velocity, position, i)
re_position[i] = band_save(re_position[i], low, up)
current_ = f(re_position[i])
if current_ < personal_value[i]:
personal_position[i] = re_position[i]
personal_value[i] = current_
if current_ < best_value:
best_position = re_position[i]
best_value = current_
position_history.append(best_position)
value_history.append(best_value)
drawing(list(i+1 for i in range(G)), value_history)
