目录

  • 前言
  • 一、粒子群算法原理
  • 二、粒子群算法建模
  • 三、Python编程实现
    • 0.优化问题
    • 1.定义PSO类
    • 2.定义适应度函数
    • 3.定义迭代运行函数
    • 4.定义结果输出函数
    • 5.编写main函数
    • 6.结果展示
  • 总结

前言

  这学期的智能优化课程主要介绍了人工智能领域内的一些优化算法,课程实验要求编程实现任意一种算法解决优化问题。个人对粒子群算法比较感兴趣,主要查阅了《智能优化算法及其MATLAB实例(第3版)》(作者:包子阳,余继周,杨杉)一书,学习了粒子群算法这一章,并且参考书上的matlab实例,采用python进行编程实现。


以下内容主要是本人对课程实验的记录,如果有错误或不妥之处,望指正。
另:点击此处可查看完整代码进行测试

一、粒子群算法原理

  一群鸟在区域中随机搜索食物,每只鸟知道自己当前位置离食物多远(即当前搜索结果),在搜索过程中,每只鸟会记住自己曾经离食物最近的位置(即历史最优搜索结果)并向该位置附近搜索;同时每只鸟通过交流获得其他鸟的位置与搜索结果,然后鸟群就会向目前离食物最近的鸟(即全局最优搜索结果)附近搜索,直至搜索到食物(即最优值)及其位置(即最优解)。
  粒子群算法模仿这种鸟类捕食行为,将优化问题的搜索空间类比于鸟类的飞行空间,将每只鸟抽象为一个粒子,粒子只有位置和速度两个属性,用自身位置表征问题的一个解,粒子在当前位置的搜索结果即当前解对应与问题的值,粒子以一定的速度更新位置进行搜索,并且其速度受到群体中其他粒子位置和历史最佳位置的影响进行更新。每个粒子不停地迭代更新直至搜索到最优值和最优位置

二、粒子群算法建模

  在D维的目标搜索空间中, 随机初始化N个粒子组成一个群落,其中第i个粒子的位置表示为一个D维的向量,记为
Xi=(xi1,xi2,⋯,xiD),i=1,2,⋯,NX_i=(x_{i1},x_{i2},\cdots,x_{iD}),i=1,2,\cdots,NXi​=(xi1​,xi2​,⋯,xiD​),i=1,2,⋯,N第i个粒子的“飞行”速度也是一个D维的向量,记为
Vi=(vi1,vi2,⋯,viD),i=1,2,⋯,NV_i=(v_{i1},v_{i2},\cdots,v_{iD}),i=1,2,\cdots,NVi​=(vi1​,vi2​,⋯,viD​),i=1,2,⋯,N由优化函数计算每个粒子的适应度值,记为
Fi=fit(Xi),i=1,2,⋯,NF_i=fit(X_i),i=1,2,\cdots,NFi​=fit(Xi​),i=1,2,⋯,N然后开始迭代搜索,第i个粒子迄今为止搜索到的最优位置称为个体极值,记为
PBest=(pi1,pi2,⋯,piD),i=1,2,⋯,NP_{Best}=(p_{i1},p_{i2},\cdots,p_{iD}),i=1,2,\cdots,NPBest​=(pi1​,pi2​,⋯,piD​),i=1,2,⋯,N整个粒子群迄今为止搜索到的最优位置为全局极值,记为
GBest=(gi1,gi2,⋯,giD),i=1,2,⋯,NG_{Best}=(g_{i1},g_{i2},\cdots,g_{iD}),i=1,2,\cdots,NGBest​=(gi1​,gi2​,⋯,giD​),i=1,2,⋯,N每次迭代中粒子找到这两个位置后,根据以下两个式子来更新自己的速度和位置:
vij(t+1)=wvij(t)+c1r1(t)[pij(t)−xij(t)]+c2r2(t)[gij(t)−xij(t)]v_{ij}(t+1)=wv_{ij}(t)+c_1r_1(t)\lbrack p_{ij}(t)-x_{ij}(t)\rbrack+c_2r_2(t)\lbrack g_{ij}(t)-x_{ij}(t)\rbrackvij​(t+1)=wvij​(t)+c1​r1​(t)[pij​(t)−xij​(t)]+c2​r2​(t)[gij​(t)−xij​(t)]xij(t+1)=xij(t+1)+vij(t+1),i=1,2,⋯,Nx_{ij}(t+1)=x_{ij}(t+1)+v_{ij}(t+1),i=1,2,\cdots,Nxij​(t+1)=xij​(t+1)+vij​(t+1),i=1,2,⋯,Ni=1,2,⋯,N;j=1,2,⋯,Di=1,2,\cdots,N ;j=1,2,\cdots,Di=1,2,⋯,N;j=1,2,⋯,D其中www为惯性系数,c1c_1c1​和c2c_2c2​为学习因子,也称加速常数;r1r_1r1​和r2r_2r2​为[0,1]范围内的均匀随机数,增加了粒子飞行的随机性。速度更新公式由三部分组成:第一部分为“惯性”部分,反映了粒子的运动“习惯”,代表粒子有维持自己先前速度的趋势;第二部分为“认知”部分,反映了粒子对自身历史经验的记忆或回忆,代表粒子有向自身历史最佳位置逼近的趋势;第三部分为“社会”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体历史最佳位置逼近的趋势。

三、Python编程实现

0.优化问题

  选取《智能优化算法及其MATLAB实例(第3版)》中的三个优化问题实例:

  • 计算f(x)=x+6sin⁡(4x)+9cos⁡(5x),x∈[0,9]f(x)=x+6\;\sin(4x)+9\;\cos(5x),x\in\lbrack0,9\rbrackf(x)=x+6sin(4x)+9cos(5x),x∈[0,9]的最小值
  • 计算f(x,y)=3cos(xy)+x+y2,x,y∈[−4,4]f(x,y)=3cos(xy)+x+y^2,x,y\in\lbrack-4,4\rbrackf(x,y)=3cos(xy)+x+y2,x,y∈[−4,4]的最小值
  • 计算f(x)=∑i=110xi2,xi∈[−20,20]f(x)={\textstyle\sum_{i=1}^{10}}x_i^2,x_i\in\lbrack-20,20\rbrackf(x)=∑i=110​xi2​,xi​∈[−20,20]的最小值

1.定义PSO类

  给定相关参数,实例化一个PSO类,初始化生成粒子群,粒子的初始位置和速度的每一维均为给定范围内的随机数,根据适应度函数计算每个粒子的适应度值,初始时每个粒子的局部最优位置均为自身,全局最优位置为所有粒子中适应度最优的粒子的位置。

class PSO:def __init__(self,size,dimension,time,x_bound,v_bound,c1,c2,w):self.size = size                #种群大小self.dimension = dimension      #粒子维数self.time = time                #迭代次数self.c1 = c1                    #加速常数1self.c2 = c2                    #加速常数2self.w = w                      #惯性权重self.x_bound = x_bound          #位置的范围self.v_bound = v_bound            #速度的范围self.x = np.random.rand(self.size,self.dimension) * (x_bound[1] - x_bound[0]) + x_bound[0]   #位置初始化self.v = np.random.rand(self.size,self.dimension) * (v_bound[1] - v_bound[0]) + v_bound[0]   #速度初始化self.p = self.x.copy()           #局部最优位置self.pbest = self.fit()          #局部最优结果self.gbest = min(self.pbest)     #全局最优结果self.g = self.p[self.pbest.index(self.gbest)].copy()   #全局最优位置self.gbestlist = []      #记录每一代的全局最优结果

2.定义适应度函数

  根据优化函数计算粒子群x中每个粒子i对应的适应度值一起返回为f,循环中三行代码分别为本次实验的三个优化函数,也可以自行定义其他的优化函数使用。

    def fit(self):f = []for i in self.x:f.append(i[0]+6*math.sin(4*i[0])+9*math.cos(5*i[0]))# f.append(3 * math.cos(i[0] * i[1]) + i[0] + i[1] * i[1])# f.append(sum(np.power(i,2)))return f

3.定义迭代运行函数

  每次迭代过程中,计算粒子的适应度值,更新全局最优和局部最优。再根据全局最优和局部最优位置更新速度和位置,同时进行速度和位置的边界约束。

    def run(self):for i in range(self.time):f = self.fit()   #计算粒子群的适应度for j in range(self.size):if f[j]<self.pbest[j]:    #更新局部最优值和最优位置self.pbest[j] = f[j]self.p[j] = self.x[j].copy()if f[j] < self.gbest:   #更新全局最优值和最优位置self.gbest = f[j]self.g = self.x[j].copy()self.v[j] = self.w * self.v[j] + self.c1 * np.random.rand() * \(self.p[j]-self.x[j]) + self.c2 * np.random.rand() * (self.g-self.x[j])   #更新粒子群的速度for k in range(self.dimension):   #速度大小约束if(self.v[j][k] > self.v_bound[1] or self.v[j][k] < self.v_bound[0]):self.v[j][k] = np.random.rand() * (v_bound[1] - v_bound[0]) + v_bound[0]self.x[j] = self.x[j] + self.v[j]   #更新粒子群的位置for k in range(self.dimension):     #位置大小约束if(self.x[j][k] > self.x_bound[1] or self.x[j][k] < self.x_bound[0]):self.x[j][k] = np.random.rand() * (x_bound[1] - x_bound[0]) + x_bound[0]self.gbestlist.append(self.gbest)       #保存每一代的全局最优值

4.定义结果输出函数

  迭代结束后输出适应度进化曲线和最优结果。

    def result(self):plt.figure()plt.plot(range(self.time), self.gbestlist, color='red', marker='.', ms=1.5)plt.rcParams['axes.unicode_minus'] = Falseplt.margins(0)plt.xlabel(u"迭代次数")  # X轴标签plt.ylabel(u"适应度")  # Y轴标签plt.title(u"迭代过程")  # 标题plt.show()print('最优解为:',end='')print(self.g)print('最优值为%f'%self.gbest)

5.编写main函数

  给定对应优化问题的相关参数,一般定义w=0.8,c1=c2=1.5,x,v的范围由问题决定,size,dimension,time根据运行结果调整(此处代码中的三段参数分别对应三个优化问题,与2中的适应度函数对应,测试不同优化问题时,修改注释即可),然后实例化PSO对象,运行run()函数实现粒子群算法的迭代搜索,最后输出适应度曲线。

if __name__ == '__main__':size = 10dimension = 1time = 50x_bound = [0, 9]v_bound = [-3, 3]c1 = 1.5c2 = 1.5w = 0.8# size = 100# dimension = 2# time = 200# x_bound = [-4, 4]# v_bound = [-1, 1]# c1 = 1.5# c2 = 1.5# w = 0.8# size = 100# dimension = 10# time = 200# x_bound = [-20,20]# v_bound = [-10,10]# c1 = 1.5# c2 = 1.5# w = 0.8pso = PSO(size,dimension,time,x_bound,v_bound,c1,c2,w)pso.run()pso.result()

6.结果展示

(1)计算f(x)=x+6sin⁡(4x)+9cos⁡(5x),x∈[0,9]f(x)=x+6\;\sin(4x)+9\;\cos(5x),x\in\lbrack0,9\rbrackf(x)=x+6sin(4x)+9cos(5x),x∈[0,9]的最小值
运行结果:

可作该一元函数的曲线图知,粒子群算法在众多局部最优值中找到了全局最优值

适应度曲线图:

(2)计算f(x,y)=3cos(xy)+x+y2,x,y∈[−4,4]f(x,y)=3cos(xy)+x+y^2,x,y\in\lbrack-4,4\rbrackf(x,y)=3cos(xy)+x+y2,x,y∈[−4,4]的最小值
运行结果:

适应度曲线图:

(3)计算f(x)=∑i=110xi2,xi∈[−20,20]f(x)={\textstyle\sum_{i=1}^{10}}x_i^2,x_i\in\lbrack-20,20\rbrackf(x)=∑i=110​xi2​,xi​∈[−20,20]的最小值
运行结果:适应度曲线图:


总结

  本次实验主要时通过学习粒子群算法原理,了解粒子群算法的基本流程,掌握粒子群算法的算法建模,编程解决优化问题。在实验中,分别解决了一个1维,2维,多维优化函数最小值求解问题。除此之外,上诉代码也提供了一个基础的解决连续型优化问题的框架,修改适应度函数,提供对应的参数,即可测试其他的优化问题。
  另外,本文对于粒子群算法原理的讲解以及实际的应用比较浅显,如果想更详细地了解粒子群算法(包括参数调节,离散问题,算法改进等),可以参考《智能优化算法及其MATLAB实例(第3版)》一书和这篇讲解比较完整的博客

智能优化及其应用——课程实验(粒子群算法)相关推荐

  1. 【优化布局】基于matlab粒子群算法求解充电站布局优化问题【含Matlab源码 012期】

    ⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...

  2. 【优化求解】基于matlab粒子群算法和帝国殖民算法和萤火虫算法求解最小生成树优化问题【含Matlab源码 2376期】

    ⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...

  3. matlab虚拟力,31无线传感网络布局优化的虚拟力导向粒子群算法MATLAB源代码

    无线传感网络布局优化的虚拟力导向粒子群算法MATLAB源代码 本源代码主要参考了下面的文献:王雪, 王晟, 马俊杰. 无线传感器网络布局的虚拟力导向微粒群优化策略[J]. 电子学报, 2007, 11 ...

  4. 【优化覆盖】基于matlab粒子群算法优化无人机编队布局求解车载网络通信覆盖优化问题【含Matlab源码 2021期】

    一.无人机简介 无人机的航迹规划是指在综合考虑无人机飞行油耗.威胁.飞行区域以及自身物理条件限制等因素的前提下, 为飞行器在飞行区域内规划出从初始点到目标点最优或者满意的飞行航迹, 其本质是一个多约束 ...

  5. 【优化充电】基于matlab粒子群算法电动汽车充电动态优化策略【含Matlab源码 2163期】

    一.粒子群算法电动汽车充电优化 1 电动汽车充电负荷估算 电动汽车的充电负荷主要与电动汽车起始充电时刻和充电时长相关,而起始充电时刻是由电动汽车用户的到家时间决定的,充电时长主要与电动汽车的行驶里程和 ...

  6. 【微电网优化】基于量子行为粒子群算法机组燃烧控制系统建模含Matlab源码

    1 简介 能源问题与环境问题随着现代社会的快速发展已成为中国乃至全世界关注的焦点.就我国现状来说,由于独特的能源架构和社会形态,直接决定了我国的电力工业在当今乃至未来相当长的一段时期内将以燃煤火电机组 ...

  7. 【优化指派】基于matlab粒子群算法求解指派优化问题(工作质量)【含Matlab源码 2390期】

    ⛄一.飞机指派模型的建立简介 1 飞机指派问题概述 飞机排班是依据航空公司的航班计划和飞机维护工作安排为每一个航班指定一架具体执行的飞机, 也即给每一个航班号分配一个相应的机尾号.目前, 国内航空公司 ...

  8. 微电网优化调度|基于多目标粒子群算法的微电网优化调度【风、光、储能、柴油机、电网交互燃汽轮机】(Matlab代码实现)

  9. 智能优化及其应用——课程设计(粒子群算法)

    目录 基于粒子群算法的路径规划应用 前言 一.粒子群算法介绍 二.路径规划问题 1.设计思路 2.问题建模 三.python编程设计 1.模型建立 2.粒子设计 3.粒子群初始化 4.粒子群迭代更新 ...

最新文章

  1. 驱动人生(离线网卡版)_驱动人生8.0版正式发布,最新功能速看
  2. 用python画皮卡丘画法-python turtle绘图库绘制【皮卡丘】源码
  3. mysql pl安装教程_ubuntu 16 mysql安装包安装 (推荐在线安装)
  4. java args_Java命令行界面(第2部分):args4j
  5. java 类型转换 安全_JAVA 类型转换指令
  6. 飞车手游服务器维护,QQ飞车手游更新出现异常怎么办 更新异常原因及解决方法技巧...
  7. ofbiz mysql_ofbiz+mysql安装求教
  8. MediaInfo源代码分析 5:JPEG解析代码分析
  9. 优品景象 进销存系统推荐_初步了解WMS(仓库管理系统)
  10. 学习总结-《父与子的编程之旅》chapter 17
  11. 游戏开发入行大师攻略
  12. 高德地图API总结--地图加载、权限,定位
  13. matlab 相机焦距,matlab – 给定焦距和摄像机位置/旋转的正确透视图像
  14. PCA(主成分分析法)的理解笔记及算法的实现
  15. 【散文】 如果今生我是你梦中的蝴蝶
  16. html放大镜移动,支持移动手机的jquery放大镜插件enlarge.js
  17. Google VP8 Code 首次深入技术分析 1
  18. 测试人员需要具备哪些基本技能
  19. 智慧城市的互联网大脑架构图,大社交网络与智慧城市结合是关键
  20. 卷积法求解系统的零状态响应_利用卷积可以求解系统的零状态响应..ppt

热门文章

  1. Mysql之半同步复制
  2. Hive 实现 IN 和 NOT IN 子句 和 LEFT SEMI JOIN 应用
  3. 求全排列(1) --- dfs 记录
  4. docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器
  5. 大学英语期末考计算机上答卷,英语期末考试总结(精选7篇)
  6. 一文读懂 UniProt 数据库(2023 最新版)
  7. android 录像限制时间,视频拍摄能不能限制拍摄时间和微信小视频一样
  8. mysql 时间格式转换年月日时分秒
  9. 100个世界上鲜为人知的“常识”
  10. 中级软件设计师简要知识点(5):网络与多媒体基础知识