PSO 算法

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

Particle Swarm Optimization

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

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

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

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

v_i=v_i+c_1 *rand()*(pbest_i-x_i)+c_2*rand()*(gbest_i-x_i)

x_i=x_i+v_i

其中 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

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 43 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 53 关注
  • 酷鸟浏览器

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

    3 引用 • 59 回帖 • 22 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • abitmean

    有点意思就行了

    21 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 512 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 游戏

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

    169 引用 • 799 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 493 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 319 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • Node.js

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

    138 引用 • 268 回帖 • 201 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 473 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 348 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 7 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    172 引用 • 990 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    163 引用 • 1450 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 692 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 405 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 525 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 265 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 6 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注