目录
1、概述
(1)智能优化算法
(2)群智能算法
2、粒子群算法
3、程序框图
4、代码
5、结果
6、参考文献
1、概述
(1)智能优化算法
(2)群智能算法
2、粒子群算法
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
3、程序框图
4、代码
#粒子群
#导入包
import numpy as np
from tqdm import tqdm
import matplotlib.pyplot as plt
from pylab import*
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
class Niqun:
def __init__(self):
# Pso参数:
self.w=1
self.c1=2
self.c2=2
self.dim=2
self.size=100
self.iter_num=1000
self.max_vel=0.5
self.min_vel=-0.5
#目标函数公式:
def calc_f(self,x):
a=10
x=x[0]
y=x[1]
return 2*a+x**2-a*np.cos(2*np.pi*x)+y**2-a*np.cos(2*np.pi*y)
#惩罚项公式:
def calc_e1(self,x):
e=x[0]+x[1]-6
return max(0,e)
def calc_e2(self,x):
e=3*x[0]-2*x[1]-5
return max(0,e)
#由惩罚项计算Lj(权重值):
def calc_Li(self,e1,e2):
if (e1.sum()+e2.sum())<=0:
return 0,0
else:
L1=e1.sum()/(e1.sum()+e2.sum())
L2=e2.sum()/(e1.sum()+e2.sum())
return L1,L2
#粒子群速度更新公式:
def velocity_update(self,v,x,pbest,gbest):
r1=np.random.random((self.size),1)
r2=np.random.random((self.size),1)
v=self.w*v+self.c1*r1*(pbest-X)+self.c2*r2+(gbest-x)
#防止越界:
v[vself.min_vel]=self.min_vel
#粒子群位置更新公式:
def position_update(self,x,v):
x=x+v
size=np.shape(x)[0]
for i in range(size):
if x[i][0]<=1 or x[i][0]>=2:
x[i][0]=np.random.uniform(1,2,1)[0]
if x[i][1]<=-1 or x[i][1]>=0:
x[i][1]=np.random.uniform(-1,0,1)[0]
return x
#更新种群函数:
def update_pbest(self,pbest,pbest_fitness,pbest_e,xi,xi_fitness,xi_e):
A=0.0000001
#1、如果pbest和xi都没有违反约束,则取适应度(目标函数)小的:
if pbest_e<=A and xi_e<=A:
if pbest_fitness<=xi_fitness:
return pbest,pbest_fitness,pbest_e
else:
return xi,xi_fitness,xi_e
if pbest_e<=A and xi_e>=A:
return pbest,pbest_fitness,pbest_e
if pbest_e>=A and xi_e<=A:
return xi,xi_fitness,xi_e
#4、如果两个都违反了,取适应度较小的一个:
if pbest_fitness<=xi_fitness:
return pbest,pbest_fitness,pbest_e
else:
return xi,xi_fitness,xi_e
#更新全局最优位置
def update_gbest(self,gbest, gbest_fitness, gbest_e, pbest, pbest_fitness, pbest_e):
A = 0.0000001 # 可接受阈值,不同问题修改为不同的值
# 先对种群,寻找约束惩罚项=0 的最优个体,如果每个个体的约束惩罚项都大于 0,就找适应度最小的个体
pbest2 = np.concatenate([pbest, pbest_fitness.reshape(-1, 1), pbest_e.reshape(-1, 1)],axis=1) # 将几个矩阵拼接成矩阵 ,4 维矩阵(x,y,fitness,e)
pbest2_1 = pbest2[pbest2[:, -1] <= A] # 找出没有违反约束的个体
if len(pbest2_1) > 0:
pbest2_1 = pbest2_1[pbest2_1[:, 2].argsort()] # 根据适应度值排序
else:
pbest2_1 = pbest2[pbest2[:, 2].argsort()] # 如果所有个体都违反约束,直接找出适应度值最小
# 当前迭代的最优个体
pbesti, pbesti_fitness, pbesti_e = pbest2_1[0, :2], pbest2_1[0, 2], pbest2_1[0, 3]
# 当前最优和全局最优比较
# 如果两者都没有约束
if gbest_e <= A and pbesti_e <= A:
if gbest_fitness < pbesti_fitness:
return gbest, gbest_fitness, gbest_e
else:
return pbesti, pbesti_fitness, pbesti_e
if gbest_e <= A and pbesti_e > A:
return gbest, gbest_fitness, gbest_e
if gbest_e > A and pbesti_e <= A:
return pbesti, pbesti_fitness, pbesti_e
# 如果都违反约束,直接取适应度小的
if gbest_fitness < pbesti_fitness:
return gbest, gbest_fitness, gbest_e
else:
return pbesti, pbesti_fitness, pbesti_e
# 主函数
def main(self):
# 初始化一个矩阵 info, 记录:
# 0、种群每个粒子的历史最优位置对应的适应度,
# 1、历史最优位置对应的惩罚项,
# 2、当前适应度,
# 3、当前目标函数值,
# 4、约束 1 惩罚项,
# 5、约束 2 惩罚项,
# 6、惩罚项的和
# 所以列的维度是 7
info = np.zeros((self.size, 7))
fitneess_value_list = []
# 用一个 size*dim 的矩阵表示种群,每行表示一个粒子
X = np.random.uniform(-5, 5, size=(self.size, self.dim))
# 初始化种群的各个粒子的速度
V = np.random.uniform(-0.5, 0.5, size=(self.size, self.dim))
# 初始化粒子历史最优位置为当当前位置
pbest = X
# 计算每个粒子的适应度
for i in range(self.size):
info[i, 3] = self.calc_f(X[i]) # 目标函数值
info[i, 4] = self.calc_e1(X[i]) # 第一个约束的惩罚项
info[i, 5] = self.calc_e2(X[i]) # 第二个约束的惩罚项
# 计算惩罚项的权重,及适应度值
L1, L2 = self.calc_Lj(info[i, 4], info[i, 5])
info[:, 2] = info[:, 3] + L1 * info[:, 4] + L2 * info[:, 5] # 适应度值
info[:, 6] = L1 * info[:, 4] + L2 * info[:, 5] # 惩罚项的加权求和
# 历史最优
info[:, 0] = info[:, 2] # 粒子的历史最优位置对应的适应度值
info[:, 1] = info[:, 6] # 粒子的历史最优位置对应的惩罚项值
# 全局最优
gbest_i = info[:, 0].argmin() # 全局最优对应的粒子编号
gbest = X[gbest_i] # 全局最优粒子的位置
gbest_fitness = info[gbest_i, 0] # 全局最优位置对应的适应度值
gbest_e = info[gbest_i, 1] # 全局最优位置对应的惩罚项
# 记录迭代过程的最优适应度值
fitneess_value_list.append(gbest_fitness)
# 接下来开始迭代
for j in tqdm(range(self.iter_num)):
# 更新速度
V = self.velocity_update(V, X, pbest=pbest, gbest=gbest)
# 更新位置
X = self.position_update(X, V)
# 计算每个粒子的目标函数和约束惩罚项
for i in range(self.size):
info[i, 3] = self.calc_f(X[i]) # 目标函数值
info[i, 4] = self.calc_e1(X[i]) # 第一个约束的惩罚项
info[i, 5] = self.calc_e2(X[i]) # 第二个约束的惩罚项
# 计算惩罚项的权重,及适应度值
L1, L2 = self.calc_Lj(info[i, 4], info[i, 5])
info[:, 2] = info[:, 3] + L1 * info[:, 4] + L2 * info[:, 5] # 适应度值
info[:, 6] = L1 * info[:, 4] + L2 * info[:, 5] # 惩罚项的加权求和
# 更新历史最优位置
for i in range(self.size):
pbesti = pbest[i]
pbest_fitness = info[i, 0]
pbest_e = info[i, 1]
xi = X[i]
xi_fitness = info[i, 2]
xi_e = info[i, 6]
# 计算更新个体历史最优
pbesti, pbest_fitness, pbest_e =
self.update_pbest(pbesti, pbest_fitness, pbest_e, xi, xi_fitness, xi_e)
pbest[i] = pbesti
info[i, 0] = pbest_fitness
info[i, 1] = pbest_e
# 更新全局最优
pbest_fitness = info[:, 2]
pbest_e = info[:, 6]
gbest, gbest_fitness, gbest_e =
self.update_gbest(gbest, gbest_fitness, gbest_e, pbest, pbest_fitness, pbest_e)
# 记录当前迭代全局之硬度
fitneess_value_list.append(gbest_fitness)
# 最后绘制适应度值曲线
print('迭代最优结果是:%.5f' % self.calc_f(gbest))
print('迭代最优变量是:x=%.5f, y=%.5f' % (gbest[0], gbest[1]))
print('迭代约束惩罚项是:', gbest_e)
# 绘图
plt.plot(fitneess_value_list[: 30], color='r')
plt.title('迭代过程')
plt.show()
if __name__ == '__main__':
ni = Niqun()
ni.main()
5、结果
6、参考文献
最优化算法之粒子群算法(PSO)_青萍之末的博客-CSDN博客_粒子群算法一、粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制...https://blog.csdn.net/daaikuaichuan/article/details/81382794?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%B2%92%E5%AD%90%E7%BE%A4%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-81382794.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187粒子群算法求解无约束优化问题 源码实现_总裁余(余登武)博客-CSDN博客粒子群算法求解无约束优化问题 源码实现 语言pythonhttps://blog.csdn.net/kobeyu652453/article/details/115298847



