python粒子群算法工具包_python进阶教程:实现粒子群算法(PSO)详解

2023-11-10

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府

这篇文章主要介绍了Python编程实现粒子群算法(PSO)详解,涉及粒子群算法的原理,过程,以及实现代码示例,具有一定参考价值,需要的朋友可以了解下。

文章目录

1 .原理

2.粒子群算法的过程

3. 代码

1 .原理

粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的。假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位置)。最好的策略就是结合自己的经验在距离鸟群中距离食物最近的区域搜索。

利用粒子群算法解决实际问题本质上就是利用粒子群算法求解函数的最值。因此需要事先把实际问题抽象为一个数学函数,称之为适应度函数。在粒子群算法中,每只鸟都可以看成是问题的一个解,这里我们通常把鸟称之为粒子,每个粒子都拥有:

位置,可以理解函数的自变量的值;

经验,也即是自身经历过的距离食物最近的位置;

速度,可以理解为自变量的变化值;

适应度,距离食物的位置,也就是函数值。

2.粒子群算法的过程

2c94b5303e5337bc85f4e3e7f5e21518.png

初始化。包括根据给定的粒子个数,初始化粒子,包括初始化一下的值:

位置:解空间内的随机值;

经验:与初始位置相等;

速度:0;

适应度:根据位置,带入适应度函数,得到适应度值。

更新。包括两部分:

粒子自身信息:包括根据下面的公式更新粒子的速度、位置,根据适应度函数更新适应度,然后和用更新后的适应度和自身经验进行比较,如果新的适应度由于经验的适应度,就利用当前位置更新经验;

75c4fa616a9d662bbf744731d7c1406d.png

速度更新公式

693f3d888253e461b17fcad2f5ba5a52.png

位置更新公式

上面公式中:i表示粒子编号;t表示时刻,反映在迭代次数上;w是惯性权重,一般设置在0.4左右;c表示学习因子,一般都取值为2;Xpbest表示的是粒子i的经验,也即是粒子i所到过最佳位置;Xgbest代表的是全局最优粒子的位置;r是0到1之间的随机值。

种群信息:把当前适应度和全局最优位置的适应度进行比较,如果当前适应度优于全局最优的适应度,那么久用当前粒子替换群居最优。

判断结束条件。结束条件包括最大迭代次数和适应度的阈值。

3. 代码

实验环境为python 2.7.11。

这个代码最初是用于求解一维最大熵分割图像问题的,因此是求解函数最大值,如果需要求解最小值,把代码中的大于号全部改成小于号就可以了。

首先需要解决的是粒子的存储,我第一反应是利用结构体来存储,但是python并没有相应的数据结构,所以我选择用一个类来表示粒子结构,该类的一个对象就是一个粒子,上代码:

class bird:

"""

speed:速度

position:位置

fit:适应度

lbestposition:经历的最佳位置

lbestfit:经历的最佳的适应度值

"""

def __init__(self, speed, position, fit, lBestPosition, lBestFit):

self.speed = speed

self.position = position

self.fit = fit

self.lBestFit = lBestPosition

self.lBestPosition = lPestFit

接下来就是粒子群算法的主干部分,用一个类来封装,代码:

import random

class PSO:

"""

fitFunc:适应度函数

birdNum:种群规模

w:惯性权重

c1,c2:个体学习因子,社会学习因子

solutionSpace:解空间,列表类型:[最小值,最大值]

"""

def __init__(self, fitFunc, birdNum, w, c1, c2, solutionSpace):

self.fitFunc = fitFunc

self.w = w

self.c1 = c1

self.c2 = c2

self.birds, self.best = self.initbirds(birdNum, solutionSpace)

def initbirds(self, size, solutionSpace):

birds = []

for i in range(size):

position = random.uniform(solutionSpace[0], solutionSpace[1])

speed = 0

fit = self.fitFunc(position)

birds.append(bird(speed, position, fit, position, fit))

best = birds[0]

for bird in birds:

if bird.fit > best.fit:

best = bird

return birds,best

def updateBirds(self):

for bird in self.birds:

# 更新速度

bird.speed = self.w * bird.speed + self.c1 * random.random() * (bird.lBestPosition - bird.position) + self.c2 * random.random() * (self.best.position - bird.position)

# 更新位置

bird.position = bird.position + bird.speed

# 跟新适应度

bird.fit = self.fitFunc(bird.position)

# 查看是否需要更新经验最优

if bird.fit > bird.lBestFit:

bird.lBestFit = bird.fit

bird.lBestPosition = bird.position

def solve(self, maxIter):

# 只考虑了最大迭代次数,如需考虑阈值,添加判断语句就好

for i in range(maxIter):

# 更新粒子

self.updateBirds()

for bird in self.birds:

# 查看是否需要更新全局最优

if bird.fit > self.best.fit:

self.best = bird

有了以上代码,只需要自定义适应度函数fitFunc就可以进行求解,但是需要注意的是只适用于求解 一维问题 。

非常感谢你的阅读

大学的时候选择了自学python,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习python核心知识,深入的研习计算机基础知识,整理好了,我放在我们的微信公众号《程序员学府》,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!

其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?[点击加入]想做你自己想成为高尚人,加油!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python粒子群算法工具包_python进阶教程:实现粒子群算法(PSO)详解 的相关文章

  • angular 使用ng-zorro-antd遇到的问题-配置

    这里有优先级 如果要修改antd里面的样式 需要styles scss放在最下面
  • OSAL

    OSAL为 Operating System Abstraction Layer 即操作系统抽象层 支持多任务运行 它并不是一个传统意义上的操作系统 但是实现了部分类似操作系统的功能 OSAL概念是由TI公司在ZIGBEE协议栈引入 他的意
  • 【笔记】Go语言 Http-client 解析json后并插入数据库

    一 Http client 获取json 参考 Go标准库http Client的连接行为控制详解 原创手记 慕课网 因为 代码 resp err http Get http example com resp err http Post h
  • java代码注释指南:三大注释解析与最佳实践

    Java代码注释指南 三大注释解析与最佳实践 在Java编程世界中 注释是一道不可或缺的明灯 为开发者提供了代码背后的灯塔 它们是代码的解释者 为我们提供了更深层次的理解 从而提高了可读性 可维护性和团队协作效率 本篇博客将深入探讨Java
  • 重复元素判断。编写一个函数,接收列表作为参数,如果一个元素在列表中出现不止一次,则返回True,但不改变原列表的值。

    words input 请输入一段字符串 word input 请输入一个字符 print dir words if word in words nt word count get word 0 1 items list count ite
  • 梦幻模拟战更新服务器正在维护,梦幻模拟战魔之启示录更新维护公告

    全新资料片 魔之启示录 重磅来袭 魔王化身丽可丽丝 龙族少女蕾娜塔华丽降临 封印战域 关卡再度开启 战术布局重燃策略战场 时空裂缝 梦幻模拟战 后篇开放 彼端大陆的冒险迎来全新高潮 服务器预计将于3月5日1 00 6 00期间进行更新维护
  • Python全栈工程师-第15周-韦玮-专题视频课程

    Python全栈工程师 第15周 382人已学习 课程介绍 Python全栈工程师 第15周 课程收益 Python全栈工程师 讲师介绍 韦玮 更多讲师课程 企业家 IT讲师 讲师 作家 畅销书 精通Python网络爬虫 作者 CSDN特约
  • 【组合字符和预组字符】

    什么是组合字符 UCS里有些编码点分配给了 组合字符 它们类似于打字机上的无间隔重音键 单个的组合字符不是一个完整的字符 它是一个类似于重音符或其他指示标记 加在前一个字符后面 因而 重音符可以加在任何字符后面 那些最重要的被加重的字符 就
  • error:该操作无法完成,因为DbContext已被释放

    出现这个问题的可能原因是 private readonly Repository
  • 2021-07-14

    提取的权重的整理 在上一篇文章中 介绍了从神经网络中提取权重的步骤 本节主要介绍对于从神经网络中提取出的权重的整理方法 以适应将权重输入到嵌入式程序中的要求 目录 提取的权重的整理 一 使用Excel进行整理 1 将在pycharm中打印出
  • 【C++学习第十一讲】C++数据类型

    文章目录 一 编程语言中的数据类型 1 1 整型 Integer 1 2 浮点型 Floating Point 1 3 字符型 Character 1 4 布尔型 Boolean 1 5 数组 Array 1 6 字符串 String 1
  • alter database open oracle,alter database open resetlogs

    关于alter database open resetlogs及incarnation的一点理解 不完全恢复只能做一次吗 采用rman的默认设置 对数据库进行了backup database备份 进行了一些操作后 然后直接关闭启动到moun
  • JS下载网页为PDF

    1 准备引入包
  • FinalShell连接VM出现channel is not opened.

    问题描述 用finalshell连接虚拟机的服务器时显示连接成功 之后马上出现channel is not opened 解决方案 打开虚拟机 找到相关配置文件 cd etc ssh 更改配置 vi sshd config 找到被注释的 U
  • linux下SD卡mount的问题

    最近发现嵌入式开发板上 有的SD卡 8G SDHC 可以mount 有的则失败 2G SD 仔细看log信息 发现有如下区别 mount成功时 mmc0 host does not support reading read only swi
  • 【JavaScript】利用JS实现柱形统计图

    CSS代码部分
  • 嵌入式(信号机制)

    信号机制 概念 信号是在软件层次上对中断机制的一种模拟 是一种异步通信方式 所有信号的产生及处理全部都是由内核完成的 信号的产生 1 按键产生 2 系统调用函数产生 比如raise kill 3 硬件异常 4 命令行产生 kill 5 软件
  • 拟合工具箱的几个误差参数说明

    使用过Matlab的拟合 优化和统计等工具箱的网友 会经常遇到下面几个名词 SSE 和方差 误差平方和 The sum of squares due to errorMSE 均方差 方差 Mean squared errorRMSE 均方根
  • IDEA打开启动Vue项目和Vue文件

    一般前端Vue都是用VsCode专门用来编辑 今天突发奇想想用IDEA去编辑 首先把项目从git下拉下来在IDEA中打开 在IDEA打开终端运行相关命令 打开终端 也可以通过alt F12快捷键 终端如下 自行根据需要输入命令即可 相关代码

随机推荐

  • SMB、FTP、DNS、等六个服务总结

    一 SMB服务 1 SMB服务功能 不同系统主机之间实现文件 打印机等资源共享 2 SMB服务主配置文件路径 etc samba smb conf 3 SMB服务启动 重启 停止 方法 service smb start restart s
  • 如何使用docker和docker-compose在本地Testnet上开发EOS区块链

    EOS区块链的开发并不是立竿见影的 因为需要一些非显而易见的组件 需要对它们进行配置和协同工作 nodeos 块生成器守护程序 keosd 钱包守护进程 存储私钥 eosio cpp 智能合约编译器 eosio token 平台的参考标记
  • chapter1 静态分析技术-08PE文件分析 PEview

    1 下载PEview peview exe下载 peview exe绿色版 peview exev0 9 8 0绿色中文版 华军软件园https www onlinedown net soft 977166 htm 2 解压后打开PEvie
  • OTL、OCL、BTL电路及其判断方法(转)

    OTL OCL BTL电路及其判断方法 OTL Output Transformer Less 电路 称为无输出变压器功放电路 是一种输出级与扬声器之间采用电容耦合而无输出变压器的功放电路 它是高保真功率放大器的基本电路之一 但输出端的耦合
  • 鱼和熊掌不可兼得:Spring boot3,Swagger3(使用Mybatis-Plus搭建框架)

    文章写于2023年7月1日 目前使用的配置尽量用最新的 如果晚于这个日期很久 请参考新的配置 使用MyBatis plus搭建框架后使用swagger或者采用的Spring 3后使用swagger 3 启动项目出现如下错误 Type jav
  • 计算机视觉(二):图像检索以及基于图像描述符的搜索

    1 引言 在图像识别中 我们通常将图片的特征提取出来 并使用这些主要特征来进行识别 在OpenCV中提供了许多特征检测算法 下面让我们来学习一下怎么使用这些算法 2 特征定义 粗略的讲 特征就是有意义的图像区域 该区域具有独特性或易于识别性
  • C++14 新特性

    一 新的语言特性 1 泛型的 Lambda 函数 在 C 11 中 lambda 函数的形式参数需要被声明为具体的类型 C 14 放宽了这一要求 允许 lambda 函数的形式参数声明中使用类型说明符 auto auto lambda au
  • Alist V3版本 API使用文档 -个人整理

    Alist V3 API 整理 Alist V3是一个支持多种存储 支持网页浏览和 WebDAV 的文件列表程序 由 gin 和 Solidjs 驱动 Alist的官方文档提供了V2版本的API说明 但对于最新的V3版本并没有 这里个人整理
  • 主析取范式与主合取范式原理探究

    主析取范式 对任意一个命题公式来说 主析取范式与主合取范式都是唯一的 命题变元指原子化的 P Q命题 极小项的定义 包含全部N个命题变元的合取式 称其为极小项 且N个命题变元中 每个变元与它的否定不能同时存在 但两者中必有一个出现且仅出现一
  • 怎样加入马云,马化腾,李彦宏的微信

    让马化腾出如今你的微信聊天里面 首先声明不是 PS 我不会 PS 的 这是程序截图 例如以下图 程序源码 http git oschina net LittleDY isWeiXin 我在他的基础上 又一次设计了图片和聊天记录 图片来自百度
  • C++ 内存模型

    C 内存模型 未完 数据存储 程序数据段 程序代码段 stack栈内存 栈内存属于执行期函数 编译时确定大小 函数执行时栈空间自动分配 结束时栈空间自动销毁 栈对象是线性分配 连续排列 没有内存碎片化效应 栈内存具有函数本地性 不存再多线程
  • mysql 数据库合并命令_mysql多源复制及合并数据库

    背景 机器1 10 1 6 99 机器2 10 1 6 100 机器3 10 1 6 101 1 分别在三台主机上安装mysql数据库 1 配置yum源 root master lucky front cat etc yum repos d
  • Python 发邮件

    来源 微信公众号Crossin的编程教室 0 前言 发送电子邮件是个很常见的开发需求 比如你写了个监控天气的脚本 发现第二天要下雨 或者网站上关注的某个商品降价了 就可以发个邮件到邮箱来提醒自己 使用 Python 脚本发送邮件并不复杂 不
  • maven学习笔记

    1 什么是Maven maven是跨平台的项目管理工具 主要服务于基于java平台 包括j2ee和j2se 的项目构建 依赖管理和项目信息管理 可以帮助开发者管理jar包 一步构建项目 从清理 编译 测试 报告直接到打包 部署 2 Mave
  • 关于洗牌算法的一点总结

    之前写斗地主的时候简单写了一个洗牌函数 基本思路是先产生一个顺序数组 遍历数组 每次产生一个 1 n 随机数 把这个随机数作为下标取出数组里的数与当前位置的数交换 当时也没多想 反正能打乱数组顺序就行 后来跟师兄吃饭的时候聊起来 说到面试里
  • 解决MATLAB Simulink 无法打开高版本模型的问题

    参考及致谢MATLAB版本 R2019a 不同版本的设置方式可能不同 报错内容 解决方案 Step1 Step2 Step3 按照上述流程操作后 就可以在低版本simulink中浏览使用高版本创建的模型文件 slx文件 了
  • 上门维修保养小程序系统开发

    用户通过小程序添加绑定需要售后维保的机器设备 然后用户通过小程序线上提交报修需求清单 后台分配安排人员上门维修 标记确认订单完成 同时提供在线服务商城 积分 优惠劵抵扣会员卡管理会员等级服务 核心功能 维修服务 保养服务 使用攻略 服务商城
  • c++数据读取、保存之dcm格式(需要有dcmtk)

    include
  • 【Shader笔记】Unity Shader基础

    参考书籍 UNITY SHADER入门精要 一 材质 Material 与 Unity Shader 效果的实现需要材质和Unity Shader配合使用 常见流程为 1 创建一个材质 2 创建一个Unity Shader 并赋予给上一步新
  • python粒子群算法工具包_python进阶教程:实现粒子群算法(PSO)详解

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了Python编程实现粒子群算法 PSO 详解 涉及粒子群算法的原理 过程 以及实现代码示例 具有一定参考价值 需要的朋友可以了解下 文章目录 1 原理 2