数学建模--粒子群算法(PSO)的Python实现

目录

 1.开篇提示

2.算法流程简介

3.算法核心代码

4.算法效果展示

 1.开篇提示

"""
开篇提示:
这篇文章是一篇学习文章,思路和参考来自:https://blog.csdn.net/weixin_42051846/article/details/128673427?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-128673427-blog-127750401.235^v38^pc_relevant_anti_t3&spm=1001.2101.3001.4242.3&utm_relevant_index=7
我基于自己的研究习惯对于该博主的文章进行了部分的学习和理解,并且对于代码进行了部分的修改,但总体还是参考他的思路和代码,在这里表示非常的感谢!
如果你想更了解PSO算法的内核,请您移步其博客,该博客给出了非常细致的分析。
代码修改处如下所示:
1.添加图片中的中文文字(matplotlib汉化问题)
2.fit_fun()书写简化
3.绘图更加清晰精炼
4.修改迭代函数部分中的计算量
"""

2.算法流程简介

"""
粒子群算法(PSO):是一种模拟鸟类觅食的智能优化算法
该算法的求解思路就是将待求解问题的每一个候选解视作鸟群中的每一个个体的具体位置信息,
每个候选解对应的最优适应度值作为每个个体在该位置处所能搜索到的食物的量,
通过个体间位置信息的相互交流来发现目标范围内的最优适应度值对应的最优候选解。
###重要概念
使用粒子群算法的时候我们需要及时去更新两个主要算式,也是PSO中最重要的两个公式
1.粒子的位置信息需要进行不断更新,对于每一个粒子的位置信息的计算更新公式:x(t+1)=x(t)+V(t+1)
2.对于粒子的下一次的移动更新距离,就涉及到了迭代的移动方向和距离,其更新公式如下所示:V(t+1)=wV(t)+c1r1(pbest(t)-x(t))+c2r2(gbest(t)-x(t))
有了以上的公式,我们处理PSO问题就变得比较简单了!
"""
"""
具体的算法流程如下:
1.基础参数的设置
2.初始化loc,v和种群适应度
3.标记最优个体数据
4.进行种群迭代运算
5.绘制可视化图片查看变化趋势
"""

本题中需要处理的问题是:(设置搜索空间维度为20,范围为[-10,10])

3.算法核心代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
#matplotlib支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
def fit_fun(x):y1=0for i in range(len(x)-1):y1=y1+100*((x[i+1]-x[i]*x[i])*(x[i+1]-x[i]*x[i]))+(x[i]-1)*(x[i]-1)y=abs(y1)return y
#1.基础参数的设置
range1=[-10,10]#取值范围
pso_number=300#进化种群的数量
iterators = 2000 #迭代次数最好大于500次以上,不然效果不明显   
w=0.8   #惯性因子
#两个加速系数
c1=2
c2=2
#种群个体的位置
loc=np.zeros((pso_number,20))
#种群个体的移动速度
v= np.zeros((pso_number, 20))
#种群的个体适应度值
fitness=np.zeros(pso_number)#2.初始化loc,v和种群适应度
for j in range(pso_number):loc[j] = np.random.uniform(low=-10, high=10,size=(1, 20))v[j] = np.zeros((1,20))fitness[j] = fit_fun(loc[j])
#3.标记最优个体数据
allpg,bestpg=loc[fitness.argmin()].copy(),fitness.min()#allpg,bestpg分别表示种群历史最优个体和适应度值
poppn,bestpn=loc.copy(),fitness.copy()#poppn,bestpn分别存储个体历史最优位置和适应度值
bestfitness=np.zeros(iterators)#bestfitness用于存储每次迭代时的种群历史最优适应度值
#4.进行种群迭代运算
#开始迭代
for i in range(iterators):print("此时为第",i+1,"次迭代:")for m in range(pso_number):r1 = np.random.rand()r2 = np.random.rand()#计算移动速度同时更新位置信息v[m]=w*v[m]+c1*r1*(poppn[m]-loc[m])+c2*r2*(allpg-loc[m])loc[m]=loc[m]+v[m]#确保更新后的位置在取值范围内loc[loc<range1[0]]=range1[0]loc[loc>range1[1]]=range1[1]#计算适应度值fitness[m] = fit_fun(loc[m])#更新个体历史最优适应度值if fitness[m]<bestpn[m]:bestpn[m]=fitness[m]poppn[m]=loc[m].copy()#更新种群历史最优适应if bestpn.min()<bestpg:bestpg=bestpn.min()allpg=poppn[bestpn.argmin()].copy()bestfitness[i]=bestpgprint("当前最佳的群体适应值为:",bestfitness[i])#5.绘制可视化图片查看变化趋势
fig=plt.figure()
plt.title('适应度的变化曲线')
x=range(1,iterators+1,1)
plt.plot(x,bestfitness,color="green",label="PSO优化曲线",linewidth=2.0, linestyle="-")
plt.xlabel("迭代次数范围")
plt.ylabel("适应度值范围")
plt.legend(loc=3, borderaxespad=0., bbox_to_anchor=(0.7, 0.85))
plt.savefig('C:/Users/Zeng Zhong Yan/Desktop/粒子群算法.png', dpi=500, bbox_inches='tight')
plt.show()

4.算法效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/118830.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkPHP项目搭建

1 宝塔添加站点 &#xff08;1&#xff09;打开命令提示行&#xff0c;输入以下命令&#xff0c;找到hosts文件。 for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\drivers\etc & echo %P & Notepad %P &#xff08;2&#xff09;添加域…

数据库-DQL

DQL&#xff1a;用来查询数据库表中的记录 关键字&#xff1a;SELECT 语法&#xff1a; select&#xff1a;字段列表 from&#xff1a;表名列表 where&#xff1a;条件列表 group by&#xff1a;分组列表 having&#xff1a;分组后条件列表 order by&#xff1a;排序字段列表…

2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:区间合并 给定 n 个闭区间 [ai; bi],其中i=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。 我们的任务是…

Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录

Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录 目录 Stable Diffuse 之 本地环境部署/安装包下载搭建过程简单记录 一、简单介绍 二、注意事项 三、环境搭建 git 下载和安装 python 下载和安装 stable-diffusion-webui 下载和安装 测试 stable diffuse w…

构造函数与成员变量初始化

C自学精简教程 目录(必读) 1 为什么需要定义构造函数&#xff1f; 构造函数主要用来给成员变量初始化。 让类对象有一个良好的开始状态。 2 构造函数初始化成员变量 下面我们来完善上一篇文章中的几个构造函数。 让这些构造函数完成给成员变量初始化的职责。 为此&#…

24.排序,插入排序,交换排序

目录 一. 插入排序 &#xff08;1&#xff09;直接插入排序 &#xff08;2&#xff09;折半插入排序 &#xff08;3&#xff09;希尔排序 二. 交换排序 &#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 排序&#xff1a;将一组杂乱无章的数据按一…

(六)k8s实战-存储管理

一、Volumes 1、HostPath 【使用场景&#xff1a;容器目录 挂载到 主机目录】 【可以持久化到主机上】 将节点上的文件或目录挂载到 Pod 上&#xff0c;此时该目录会变成持久化存储目录&#xff0c;即使 Pod 被删除后重启&#xff0c;也可以重新加载到该目录&#xff0c;该目…

【算法题】1761. 一个图中连通三元组的最小度数

题目&#xff1a; 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。 连…

恢复数据的利器:易我数据恢复终身技术版v16.2.0.0

EaseUS Data Recovery Wizard为全球提供数据恢复方案,用于误删数据数据,电脑误删文件恢复,格式化硬盘数据恢复,手机U盘数据恢复等,RAID磁盘阵列数据恢复,分区丢失及其它未知原因丢失的数据恢复,简单易用轻松的搞定数据恢复。 特点描述 - 易我数据恢复中文便携版&#xff0c;无…

Kitchen Hook

双扛厨房排钩&#xff1a;挂刀具

HuggingFace 简介

HuggingFace 简介 0. HuggingFace 简介1. HuggingFace 官网地址2. HuggingFace 标准研发流程3. HuggingFace 工具集4. 编码工具4.1 编码工具介绍4.2 使用编码工具 5. 数据集工具5.1 数据集工具介绍5.2 使用数据集工具 6. 评价指标工具6.1 评价指标工具介绍6.2 使用评价指标工具…

vmware 16增加硬盘容量并在Ubuntu 18.04上边格式化并挂载

参考了《增加 VM虚拟机硬盘容量》 《Linux学习之分区挂载》中有给VMWare 16虚拟机添加一块硬盘的内容&#xff0c;需要先参考添加硬盘。 sudo mkfs.ext4 /dev/sda4给/dev/sda4进行ext4格式化。 sudo mkdir /mountsda4新建一个挂载目录。 sudo mount -t ext4 /dev/sda4 /mo…

gitlab升级

1.下载需要的版本 wget -c https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.7.6-ce.0.el7.x86_64.rpm --no-check-certificate gitlab-ce-15.4.6-ce.0.el7.x86_64.rpm gitlab-ce-15.7.6-ce.0.el7.x86_64.rpm gitlab-ce-15.9.7-ce.0.el7.x86_64.rpm g…

可扩展的Blender插件开发汇总

成熟的 Blender 3D 插件是令人惊奇的事情。作为 Python 和 Blender 的新手,我经常发现自己被社区中的人们创造的强大的东西弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我怀疑或冒名顶替综合症的唠叨声音被打破时,很容易想到“如果有人能做出可以做xxx的东西就好…

JS踩坑: for let 和 for var的区别

最近踩了一个js的坑 踩坑代码 如下两段代码&#xff0c;看起来没什么区别&#xff0c;但是实际运行效果却不一样 for (let i 0; i < 10; i) {console.log("for:" i);setTimeout(() > {console.log("setTimeout:" i);}, 1000); }输出&#xff1…

openGauss学习笔记-55 openGauss 高级特性-全密态数据库

文章目录 openGauss学习笔记-55 openGauss 高级特性-全密态数据库55.1 连接全密态数据库55.2 创建用户密钥55.3 创建加密表55.4 向加密表插入数据并进行查询 openGauss学习笔记-55 openGauss 高级特性-全密态数据库 全密态数据库意在解决数据全生命周期的隐私保护问题&#xf…

git学习笔记 | 版本管理 - 分支管理

文章目录 git学习笔记Git是什么仓库常见的命令commit 备注规范在文件下设置git忽略文件 .gitignore 版本管理git log | git reflog 查看提交日志/历史版本版本穿梭 git resetgit reset HEAD <file> git checkout -- fileName 丢弃工作区的修改git revertGit恢复之前版本的…

裸露土方智能识别算法 python

裸露土方智能识别算法通过opencvpython网络模型框架算法&#xff0c;裸露土方智能识别算法能够准确识别现场土堆的裸露情况&#xff0c;并对超过40%部分裸露的土堆进行抓拍预警。此次算法用到的Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流…

Visual Studio(2022)生成链接过程的.map映射文件以及.map映射文件的内容说明

微软的官方说明 /MAP&#xff08;生成映射文件&#xff09; | Microsoft Learn 设置步骤 1. 右键项目属性, 连接器 -> 常规 -> 启用增量链接&#xff0c;设置为否。如下图&#xff1a; 2. 连接器 -> 调试 生成调试信息 设置为 生成调试信息 (/DEBUG) 生成程序数据库…