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

news2025/1/13 10:16:33

目录

 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=0
    for 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]=bestpg
    print("当前最佳的群体适应值为:",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.coloradmin.cn/o/968836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 12 源码分析 —— 应用层 四(SystemUI的基本布局设计及其基本概念)

Android 12 源码分析 —— 应用层 四&#xff08;SystemUI的基本布局设计及其基本概念&#xff09; 在上两篇文章中&#xff0c;我们介绍SystemUI的启动过程&#xff0c;以及基本的组件依赖关系。基本的依赖关系请读者一定要掌握&#xff0c;因为后面的文章&#xff0c;将会时…

数学建模--主成分分析法(PCA)的Python实现(

目录 1.算法核心思想&#xff1a; 2.算法核心代码&#xff1a; 3.算法分类效果&#xff1a; 1.算法核心思想&#xff1a; 1.设置降维后主成分的数目为2 2.进行数据降维 3.设置main_factors1个划分类型 4.根据组分中的值进行分类 5.绘制出对应的图像 2.算法核心代码&#xff1a…

使用多线程std::thread发挥多核计算优势(解答)

使用多线程std::thread发挥多核计算优势&#xff08;题目&#xff09; 单核无能为力 如果我们的电脑只有一个核&#xff0c;那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们…

C语言练习8(巩固提升)

C语言练习8 编程题 前言 奋斗是曲折的&#xff0c;“为有牺牲多壮志&#xff0c;敢教日月换新天”&#xff0c;要奋斗就会有牺牲&#xff0c;我们要始终发扬大无畏精神和无私奉献精神。奋斗者是精神最为富足的人&#xff0c;也是最懂得幸福、最享受幸福的人。正如马克思所讲&am…

无涯教程-JavaScript - CUBESETCOUNT函数

描述 CUBESETCOUNT函数返回集合中的项目数。 语法 CUBESETCOUNT (set)争论 Argument描述Required/Optionalset Microsoft Excel表达式的文本字符串,其输出为由CUBESET函数定义的集合。 OR CUBESET功能。 OR 对包含CUBESET函数的单元格的引用。 Required Notes 求值CUBESE…

【个人博客系统网站】统一处理 · 拦截器

【JavaEE】进阶 个人博客系统&#xff08;2&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;2&#xff09;1. 统一返回格式处理1.1 统一返回类common.CommonResult1.2 统一返回处理器component.ResponseAdvice 2. 统一异常处理3. 拦截器实现3.1 全局变量SESSI…

Mariadb高可用(四十)

目录 一、概述 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;组成 &#xff08;三&#xff09;特点 &#xff08;四&#xff09;工作原理 二、实验要求 三、构建MHA &#xff08;一&#xff09;ssh免密登录 &#xff08;二&#xff09;安装mariadb数据库…

数学建模--一维插值法的多种插值方式的Python实现

目录 1.算法流程步骤 2.算法核心代码 3.算法效果展示 1.算法流程步骤 #算法的核心就是利用scipy中的interpolate来完成工作 #一共是5种一维插值算法形式: #插值方法&#xff1a;1.阶梯插值 2.线性插值 3.2阶样条插值 4.3阶样条插值 #"nearest"阶梯插值 #"zero&…

硬盘数据恢复的基础操作方法分享

确定硬盘故障类型&#xff1a;在进行硬盘数据恢复之前&#xff0c;首先需要确定故障类型是硬件故障还是软件故障。如果是软件故障&#xff0c;可以尝试使用数据恢复软件进行恢复&#xff1b;如果是硬件故障&#xff0c;则需要求助专业数据恢复公司进行处理。 使用数据恢复软件…

JavaScript基础05——字面量、变量介绍及变量基本使用

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 说起变量感觉很熟悉&#xff0c;但要让解释什么是变量时&#xff0c;却有点语塞&#xff0c;就像解释下为啥112一样&#xff0c;感觉非常熟悉&#xff0c;就是知道&#xff0c;但确解释不出来。 不过虽然在其他场景比较…

机器学习——线性回归/岭回归

0、前言&#xff1a; 线性回归会用到python第三方库&#xff1a;sklearn.linear_model中的LinearRegression导入第三方库的方法&#xff1a;from sklearn.linear_model import LinearRegression使用LinearRegression(二维数据&#xff0c;一维数据)进行预测&#xff0c;其中数…

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合&#xff1a;MySQL中的索引事务&#xff08;1&#xff09;索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时&#xff0c;如果你根据name来查询&#xff0c;查到叶子节点得到的只是主键id&#xff0c;还需要通过主键id去主键的B树里面在…

源码角度看待线程池的执行流程

文章目录 前言一、线程池的相关接口和实现类1.Executor接口2.ExecutorService接口3.AbstractExecutorService接口4.ThreadPoolExecutor 实现类 二、ThreadPoolExecutor源码解析1.Worker内部类2.execute()方法3.addWorker()方法 总结 前言 线程池内部维护了若干个线程&#xff…

RT-Thread 内核移植

内核移植 内核移植就是将RTT内核在不同的芯片架构、不同的板卡上运行起来&#xff0c;能够具备线程管理和调度&#xff0c;内存管理&#xff0c;线程间同步等功能。 移植可分为CPU架构移植和BSP&#xff08;Board support package&#xff0c;板级支持包&#xff09;移植两部…

1783_CMD启动MATLAB同时执行一个脚本

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【数据结构】树和二叉树的概念及结构(一)

目录 一&#xff0c;树的概念及结构 1&#xff0c;树的定义 2&#xff0c;树结点的分类及关系 3&#xff0c;树的表示 二&#xff0c;二叉树的概念及结构 1&#xff0c;二叉树的定义 2&#xff0c;特殊的二叉树 3&#xff0c;二叉树的性质 4&#xff0c;二叉树的存储结构 1&…

Unity中Shader 纹理属性 Tilling(缩放度) 和 Offset(偏移度)

文章目录 前言一、Tilling(缩放度)&#xff0c;个人理解有点像减小周期函数的周期的效果&#xff08;在单位空间内&#xff0c;容得下重复的函数图像的多少&#xff09;二、Offset&#xff08;偏移度&#xff09;&#xff0c;个人理解是函数的平移三、在Shader中使用 Tilling 和…

如何批量查询所有德邦快递的物流信息

当我们需要查询多个德邦快递的物流信息时&#xff0c;我们可以使用固乔快递查询助手来批量查询。以下是具体的操作步骤&#xff1a; 1. 在浏览器中搜索并下载【固乔快递查询助手】软件。这款软件支持多种快递公司&#xff0c;包括德邦快递&#xff0c;而且可以批量查询物流信息…

洞发现-APP应用之漏洞探针利用修复(44)

主要分为三个部分&#xff0c;第一部分抓包是很重要的&#xff0c;第二部分是协议&#xff0c;第三部分是逆向&#xff08;讲的不会太多&#xff0c;介绍根据使用不介绍原理&#xff09;&#xff0c; 关于反编译&#xff0c;app就分为安卓和苹果系统&#xff0c;苹果系统的源码…

基于STM32的简易示波器设计

疫情期间闲来无事&#xff0c;正好学习STM32F407&#xff0c;因此设计、制作了简易示波器&#xff0c;以助学习。长话短说方案如下&#xff1a; &#xff08;1&#xff09;单片机&#xff0c;选择STM32F407VET6&#xff0c;采用SWD方式仿真及程序烧写。五路独立按键和两个LED指…