PSO算法流程:
1.初始化粒子参数:
粒子群规模、粒子维度、迭代次数、惯性权重、学习因子、迭代步长范围
2.随机初始化每个粒子的(位置,速度):
个体、群体历史最优位置、适应值。
3.迭代:更新个体速度位置,个体最优适应值和位置--再更新群体;更新其他参数;
直到--两次迭代之间适应值最小差值()可接受的满意解/最大迭代次数。
4.速度更新公式
其中,代表粒子自身惯性权重(较大有利于跳出局部最优,较小利于快速收敛找到最优,一般取值范围:(0.4,2),eg:0.9、1.2、1.5、1.8),d是粒子维度(自变量个数),c代表学习因子(一般取值(0,4)eg:1.6,1.8),r代表[0,1]的随机数,增加搜索随机性。
线性变化策略:随着迭代次数的增加,惯性权重ω不断减小,从而使得粒子群算法在初期具有较强的全局收敛能力,在后期具有较强的局部收敛能力。
5.位置更新公式
python代码详解:Python粒子群优化算法实现(PSO)_python 优化算法库-CSDN博客
# coding: utf-8
import numpy as np
import random
import matplotlib.pyplot as plt
# ----------------------PSO参数设置---------------------------------
class PSO(): # 创建类:class
def __init__(self, pN, dim, max_iter): # 构造方法:__init__(self,参数)
self.w = 0.8
self.c1 = 2 # 给属性赋值
self.c2 = 2
self.r1 = 0.6
self.r2 = 0.3
self.pN = pN # 粒子数量
self.dim = dim # 搜索维度
self.max_iter = max_iter # 迭代次数
self.X = np.zeros((self.pN, self.dim)) # 初始化所有粒子的位置和速度
self.V = np.zeros((self.pN, self.dim)) # 形状为(self.pN, self.dim的全零数组)
self.pbest = np.zeros((self.pN, self.dim)) # 个体经历的最佳位置和全局最佳位置
self.gbest = np.zeros((1, self.dim))
self.p_fit = np.zeros(self.pN) # 每个个体的历史最佳适应值
self.fit = 1e10 # 全局最佳适应值
# ---------------------目标函数-----------------------------
def function(self, X):
return X**2-4*X+3
# ---------------------初始化种群----------------------------------
def init_Population(self):
for i in range(self.pN):
for j in range(self.dim):
self.X[i][j] = random.uniform(0, 1)
self.V[i][j] = random.uniform(0, 1)
self.pbest[i] = self.X[i]
tmp = self.function(self.X[i]) # 调用 self.function 方法
self.p_fit[i] = tmp
if tmp < self.fit:
self.fit = tmp
self.gbest = self.X[i]
# ----------------------更新粒子位置----------------------------------
def iterator(self):
fitness = []
for t in range(self.max_iter):
for i in range(self.pN): # 更新gbest\pbest
temp = self.function(self.X[i])
if temp < self.p_fit[i]: # 更新个体最优
self.p_fit[i] = temp
self.pbest[i] = self.X[i]
if self.p_fit[i] < self.fit: # 更新全局最优
self.gbest = self.X[i]
self.fit = self.p_fit[i]
for i in range(self.pN):
self.V[i] = self.w * self.V[i] + self.c1 * self.r1 * (self.pbest[i] - self.X[i]) + \
self.c2 * self.r2 * (self.gbest - self.X[i])
self.X[i] = self.X[i] + self.V[i]
fitness.append(self.fit)
print(self.X[0], end=" ")
print(self.fit) # 输出最优值
return fitness
# ----------------------程序执行-----------------------
my_pso = PSO(pN=30, dim=1, max_iter=100)
my_pso.init_Population()
fitness = my_pso.iterator()
# -------------------画图--------------------
plt.figure(1)
plt.title("Figure1")
plt.xlabel("iterators", size=14)
plt.ylabel("fitness", size=14)
t = np.array([t for t in range(0, 100)])
fitness = np.array(fitness)
plt.plot(t, fitness, color='b', linewidth=3)
plt.show()