PSO 算法

本贴最后更新于 1536 天前,其中的信息可能已经沧海桑田

Particle Swarm Optimization

PSO 是一种基于种群的随机优化技术,由 Eberhart 和 Kennedy 于 1995 年提出。主要模仿昆虫、兽群、鸟群和鱼群等的集群行为。

以鸟群觅食为例,粒子群算法中有粒子、粒子群、粒子的位置及飞行速度、最优解、粒子的适应度、最优粒子、粒子的个体经验及群体经验,它们可以类比于一只鸟、鸟群、鸟的位置与飞行速度、食物的位置、鸟与食物位置的距离、离食物最近的鸟、鸟的记忆能和学习能力。

粒子群优化算法 鸟群觅食
粒子(问题的一个解) 鸟(个体)
粒子群 鸟群(种群)
粒子的位置与飞行速度 鸟的位置与飞行速度
粒子飞行速度的动态调整 鸟的飞行动态
最优解 食物位置
粒子的适应值 鸟与食物位置的距离
最优粒子(当前最好的解) 距离食物最近的鸟
粒子群的邻域拓扑 鸟群的信息交互途径
粒子的个体最优经验与邻域最优经验 鸟类的记忆能力与学习能力

而粒子群优化算法的重要手段就在粒子位置和速度的更新上,通过不断改变粒子速度从而改变粒子位置让粒子群更加接近最优解的位置。速度的更新与位置的更新都有具体的公式:

其中 i 表示粒子的 id,rand()是生成(0,1)的随机数,v 和 x 表示粒子的速度和位置,c1 和 c2 为自我学习因子和社会学习因子,pbest 为粒子自己的最佳历史位置,gbest 是社会中粒子的最佳历史位置。本文中社会代之整个种群,gbest 指的就是整个种群中最好的个体位置。

算法流程图:

QQ 截图 20210122130938.png

代码实现:
lb,ub 分别表示粒子位置的上下限;lv,uv 分别表示粒子速度的上下限;n 表示种群中粒子个数;D 表示粒子的维度;c1 和 c2 表示粒子的自我学习因子和社会学习因子大小;w 表示惯性系数;iterator 表示迭代次数。

初始化粒子群的速度和位置:

position=lb+(ub-lb)*rand(n,D); velocity=lv+(uv-lv)*rand(n,D);

定义目标函数,以 Rastrigin‘s 函数为例:

function f=fun(X) %目标函数 f=20+X(:,1).^2+X(:,2).^2-10*(cos(2*pi.*X(:,1))+cos(2*pi.*X(:,2))); %Rastrigin‘s函数 end

粒子速度更新:

velocity=w.*velocity+c1*rand().*(pbest-position)+c2*rand().*(gbest-position); %更新速度 index=find(velocity>uv | velocity<lv); %速度越界惩罚 velocity(index)=lv+(uv-lv)*rand(1,length(index));

粒子位置更新:

position=position+velocity; %更新位置

完整代码实现(以 Rastrigin‘s 函数为例):

function [best,gbest]=pso(lb,ub,lv,uv,n,D,c1,c2,w,iterator) %初始化起始位置和原始速度 position=lb+(ub-lb)*rand(n,D); velocity=lv+(uv-lv)*rand(n,D); fit=fun(position);%计算适应度 old_fit=fit; %保留适应度以便更新最优历史 [best,location]=min(fit); %计算全局最优结果 pbest=position; %初始最优历史位置 gbest=position(location,:); %初始化全局最优位置 history=zeros(1,iterator); history(1)=best; %保留全局的历史最优值 old_best=best; ite=1; %初始化迭代器 temp=(w-0.1)/iterator; while ite<iterator velocity=w.*velocity+c1*rand().*(pbest-position)+c2*rand().*(gbest-position); %更新速度 index=find(velocity>uv | velocity<lv); %速度越界惩罚 velocity(index)=lv+(uv-lv)*rand(1,length(index)); position=position+velocity; %更新位置 fit=fun(position); %重新评估 [best,location]=min(fit); index=find(fit-old_fit<0); %寻找非负优化粒子 pbest(index,:)=position(index,:); %更新历史最优 if best<old_best gbest=position(location,:); %更新全局最优位置 end old_fit=fit; %保存适应度 ite=ite+1; if best<history(ite-1) history(ite)=best; else history(ite)=history(ite-1); end old_best=best; w=w-temp; end best=history(end); function f=fun(X) %目标函数 f=20+X(:,1).^2+X(:,2).^2-10*(cos(2*pi.*X(:,1))+cos(2*pi.*X(:,2))); %Rastrigin‘s函数 end plot(history,'linewidth',3); end

取参数执行:

QQ 截图 20210122133019.png

untitled.jpg

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 643 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 2 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 1 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 1 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 318 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 164 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 1 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 47 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    57 引用 • 25 回帖 • 9 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 55 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖 • 1 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    951 引用 • 944 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    494 引用 • 928 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 636 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 102 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 782 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 503 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Excel
    31 引用 • 28 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 2 关注