粒子群算法的由来及思想

粒子群算法最早是由两名美国的科学家基于群鸟觅食,寻找最佳觅食区域的过程所提出来的,作为一种智能算法,PSO模拟的就是最佳决策的过程,鸟群觅食类似于人类的决策过程,想想在你做出选择之前,是不是会受到自己的经验(局部最优)以及周围人的经历(全局最优)的影响?同样的道理,群鸟在觅食的过程当中,每一只鸟的初始位置都处于随机状态,当然也不知道最佳的觅食点在何处,并且每只鸟的飞行方向也是随机的。可以认为,在觅食的初期,鸟群的运动轨迹都是杂乱无章的,随着时间的推移,处于随机位置的鸟类通过群内的相互学习、共享觅食信息,每一只鸟在每一次的觅食过程中结合自己的经验和同伴传送的信息估计目前所处的位置能够找到食物有多大的价值。基于这样的搜索方式,粒子群算法(Particle Swarm Optimization,PSO)应运而生。

基本概念

每只鸟在某处位置能够找到食物的可能可以通过适应值来刻画,每只鸟能够记住自己的觅食位置,并且找到其中的最佳位置(局部最优),鸟群中所有个体的最佳位置就可以看做整个鸟群的最佳觅食点(全局最优)。可以预见的是,整个鸟群的觅食活动总体上一定是往这个全局最优的觅食区域运动的,通过鸟群觅食位置的不断移动即不断地迭代,速度的不断更新,鸟群往该最优位置步步逼近。

  • 鸟群中的每一个个体都可以当做一个粒子,鸟群即可被看做粒子群。假设一个有M个粒子的粒子群在一个N维空间内寻找最优位置,那么可以对每个粒子赋予一个“位置”:
  • 对于每一个粒子而言,该位置即为问题的一个潜在解,在这个位置能觅到食物的可能性有多大呢?既可以通过将

    带入目标函数计算其适应值,根据适应值大小来衡量其优劣。在每一次的搜寻过程中,记录每个粒子的最优位置:
  • 在本次觅食搜寻过程中,所有粒子最优位置的最优解即可当做整个粒子群的最佳觅食位置:
  • 反复进行食物的搜寻过程(进行迭代),直至找到全局最优解为止。当然在每一次位置的寻找之后,应该对粒子的速度和所在位置进行更新,记第i个粒子的速度为:
  • 粒子的速度及位置更新的方式如下:
  1. 其中

  2. 是一个非负数,称为惯性因子,对算法的收敛起到很大的作用,其值越大,粒子飞跃的范围就越广,更容易找到全局最优,但是也会错失局部搜寻的能力。
  3. 分别为局部和全局最优位置。
  4. 加速常数
    也是非负常数,是调整局部最优值和全局最优值权重的参数,如果前者为0说明搜寻过程中没有自身经验只有社会经验,容易陷入局部最优解;若后者为0,即只有社会经验,没有自身经验,常常会陷入局部最优解中,不能飞越该局部最优区域。
  5. 是[0,1]范围之内的随机数,
    是约束因子,目的是控制速度的权重。

从上面速度和位置分量的改变规则我们可以看到,速度的存在的根本作用还是为了改变粒子的位置,计算新一轮粒子的适应值,其中的参数的设置也会影响到对全局最优解的搜寻。在一般情况下,我们会对粒子的速度分量进行限制,

,如果粒子的速度分量在更新之后超过最大飞翔速度,则应该根据不同的情况进行优化问题的设定。

迭代终止条件根据具体问题而定,一般达到预定最大迭代次数或者粒子群目前为止搜寻到的最优位置满足目标函数的最小容许误差。

PSO算法的主要实现步骤

  1. 初始化粒子群。包括粒子的初始位置及速度,惯性因子等参数值

粒子数M一般选取20~40个,不过对于一些特殊的难题需要更多的粒子,粒子数量越多,搜索范围就越广,越容易找到全局最优解,但是也会带来更大的计算消耗。

2. 评价各个粒子的初始适应值。

3. 将初始的适应值作为各个粒子的局部最优解,保存各粒子的最优位置。并找到其中的最优值,作为全局最优解的初值,并记录其位置

4. 更新粒子速度及位置

5. 计算更新后粒子的适应值,更新每个粒子的局部最优值以及整个粒子群的全局最优值。

6. 重复4~5直至满足迭代结束条件

图1 程序设计流程图

粒子群算法的matlab程序实现

  • 问题1:求解

    之间的最小值
% 目标函数
function f=target(x)
%x in[0,9]
f=x+6*sin(4.*x)+9*cos(5.*x);
end

主程序:PSO.m

%looking for min-functinal value using "Practicle Swarm Optimization"function [Gbest_x,Gbest_y]=PSO()
%Parameter settings
lower_bound = 0;
higher_bound = 9;
particle = 20;                            % 粒子个数
max_iteration = 100;                      % 最大迭代数
dimension = 1;                            % 粒子位置的维度,即自变量个数
c1 = 2;                                   % 加速常数1,控制局部最优解
c2 = 2;                                   % 加速常数2,控制全局最优解
w = 0.6;                                  % 惯性因子
vmax = 0.8;                               % 速度最大值
precision=0.001;                          % 精度设置%Initialize
x = lower_bound+rand(particle,dimension).*(higher_bound-lower_bound);
v = 2*rand(particle,dimension);
Pbest_x=x;                                % 将初始位置设置为局部最优解的位置
Pbest_y=target(x);                        % 各个粒子的函数值作为其局部最优解
Gbest_y=inf;                              % 全局最优解的初始值设置为inf
Gbest_x = x(1,:);                         % 初始全局最优位置设定为第一个粒子的位置
k=1;
f=zeros(particle,1);%plot the function
horizon = linspace(0,9,500);
vertical = target(horizon);
plot(horizon,vertical);
hold on
[m,index] = min(vertical);
text(horizon(index)+0.5,m,['{F_{min}}= ',num2str(m)])
pic_num = 1;while k<=max_iterationflagx=Gbest_x;flagy=Gbest_y;% 搜寻各个粒子的局部最优for i=1:particlef(i) = target(x(i,:));if f(i)<Pbest_y(i)Pbest_y(i)=f(i);      % Personal best function valuePbest_x(i)=x(i,:);    % Personal best variableendend% 更新全局最优位置及适应值[Gbest_y,index] = min(Pbest_y);Gbest_x = x(index,:);% 每一次搜寻之后更新粒子的速度及位置for n=1:particlev(n,:)=w*v(n,:)+c1*rand()*(Pbest_x(n,:)-x(n,:))+c2*rand()*(Gbest_x-x(n,:));% 速度越界操作for p=1:dimensionif v(n,p)>vmaxv(n,p)=vmax;elseif v(n,p)<-vmaxv(n,p)=-vmax;endendx(n,:)=x(n,:)+v(n,:);end% 获取动态搜寻过程gif图figure(1)scatter(Gbest_x,target(Gbest_x))hold onh1=text(6,-4,['X by TSO=',num2str(Gbest_x)]);h2=text(6,-6,['Y by TSO=',num2str(target(Gbest_x))]);pause(0.2)drawnow;F=getframe(gcf);I=frame2im(F);[I,map]=rgb2ind(I,256);if pic_num == 1imwrite(I,map,'PSO.gif','gif', 'Loopcount',inf,'DelayTime',0.2);elseimwrite(I,map,'PSO.gif','gif','WriteMode','append','DelayTime',0.2);enddelete(h1);delete(h2)pic_num = pic_num + 1;% 如果迭代前后全局最优解的差小于精度要求退出if abs(flagx-Gbest_x)<precision&&abs(flagy-Gbest_y)<precisionbreakelsek=k+1;endendstring=['Min-value by TSO is ',num2str(Gbest_y),', where x= ',num2str(Gbest_x)];
title(string)

其中一次运行结果:

>> [Gbest_x,Gbest_y]=PSO();
>> Gbest_x
Gbest_x =4.3744
>> Gbest_y
Gbest_y =-10.4199

图2 PSO算法求一元函数最小值

可见,最终在x=4.3744处找到的全局最优解-10.4199,与函数的最小值

=- 10.4122相差不大。手链效果也较好。
  • 问题2:PSO算法求解背包问题

背包问题:现有一小偷入室盗窃,可以偷窃的物品数量共有12件,物品对应的价值(万)为[5;10;13;4;3;11;13;10;8;16;7;4]; 重量(千克)为[2;5;18;3;2;5;10;4;11;7;14;6]。若小偷能拿的物品总质量最大为46kg,如何选取物品使得总价值最大?

%目标函数
function f = target_BAG(x,value,weight,ratio,restriction)
Money = sum(x*value);
Lost = sum(x*weight);
if Lost < restrictionf = Money;
elsex=~x;Money = sum(x*value);f = Money-round((Lost-restriction)*ratio);
end

目标函数用于计算小偷所投物品的质量及价值,如果此时的重量超过了限制,就将所偷物品价值减小。

function [GBest_x,GBest_y,Record]= PSO_BAG()
value = [5;10;13;4;3;11;13;10;8;16;7;4];    % 物品重量
weight = [2;5;18;3;2;5;10;4;11;7;14;6];     % 物品价值
restriction = 46;                           % 背包重量限制
practicle = 20;                             % 粒子数
max_iteration = 100;
dimension = size(value,1);
ratio = 2.5;
c1 = 2;
c2 = 2;
wmin = 0.6;
wmax = 0.8;
vmax = 0.8;
time=1;
%Initialize
x = round(rand(practicle,dimension));             % 背包问题中的粒子取值为0或1,代表选择物品或不选择物品
v=rand(practicle,dimension)*(2*vmax)-vmax;PBest_x = x;
PBest_y = zeros(1,dimension);
for i=1:practiclePBest_y(i) = target_BAG(PBest_x(i,:),value,weight,ratio,restriction);    %将总价值作为局部最优解
endGBest_x = ones(1,dimension);
GBest_y = 0;
Record = zeros(1,max_iteration);
for j=1:practicleif PBest_y(j)>GBest_yGBest_y = PBest_y(j);GBest_x = x(j,:);end
endwhile time<=max_iteration% Personal-Best searchingfor i=1:practiclef = target_BAG(x(i,:),value,weight,ratio,restriction);if f>PBest_y(i)PBest_y(i)=f;PBest_x(i,:)=x(i,:);end% Global Best searchingif PBest_y(i) > GBest_yGBest_y = PBest_y(i);GBest_x = PBest_x(i,:);end% Updating the speed and positionw=wmin+rand()*(wmax-wmin);      % weight is dynamicv(i,:) = w*v(i,:) + c1*rand()*(PBest_x(i,:)-x(i,:)) + c2*rand()*(GBest_x-x(i,:));for ii=1:dimensionif (v(i,ii)<-vmax)||(v(i,ii)>vmax)v(i,ii)=rand*(2*vmax)-vmax;endendvv(i,:)=1./(1+exp(-v(i,:)));for k=1:dimensionif vv(i,k)>randx(i,k)=1;elsex(i,k)=0;endendendRecord(k) = GBest_y;time = time+1;
endM = GBest_y;           % the value of the bag
N = GBest_x*weight;    % the weight of the bag
disp('---------------------------------------')
disp(['The final steal value is:',num2str(M)]);
disp(['The final steal weight is:',num2str(N)]);
string=strcat('Steal items:',num2str(GBest_x));
disp(string)

其中一次运行结果:

---------------------------------------
The final steal value is:76
The final steal weight is:44
Steal items:1  1  0  1  1  1  1  1  0  1  0  1选取第1,2,4,5,6,7,8,10,12个物品,总价值为76,总重量为44.

当然,PSO是一个基于概率的随机自搜索算法,每次的搜索结果都不尽相同,但是若算法的收敛性表现的较好,也可以认为对算法的设计是合理的。


粒子群算法组卷_粒子群(PSO)算法概念及代码实现相关推荐

  1. 粒子群算法组卷_概率表示的二进制粒子群算法在组卷中的应用

    概率表示的二进制粒子群算法在组卷中的应用 于庆梅 ; 杨争争 ; 雷景生 ; 刘怡乐 [期刊名称] <计算机仿真> [年 ( 卷 ), 期] 2012(029)009 [摘要] In or ...

  2. 基于粒子群优化BP神经网络的预测 采用PSO算法优化bp网络实现预测

    基于粒子群优化BP神经网络的预测 采用PSO算法优化bp网络实现预测,源码注释详细,matlab实现,直接运行即可. ID:72100632211160748韩雅涵122

  3. 第5章_使用者(User)_群组(Group)_非群组外的其他人(Other)文件权限改变

    1. Linux用户身份与群组相关信息 系统上账号信息 个人密码记录在/etc/shadow文件中 Linux中的组名记录在/etc/group 通过ls -al 查看文件权限,可以分别看到 文件所有 ...

  4. mysql的集群和分布式区别_集群和分布式,你知道其中的区别吗?

    经常听到MySql集群.Redis集群.分布式系统等概念,但是,很少有机会深究,到底什么集群,什么是分布式?在概念上这俩个词很接近,难道不需要区分?其实,非常有必要区分这两个概念,帮助我们对计算机的理 ...

  5. a*算法的优缺点_五种聚类算法一览与python实现

    大家晚上好,我是阿涛. 今天的主题是聚类算法,小结一下,也算是炒冷饭了,好久不用真忘了. 小目录: 1.K-means聚类2.Mean-Shift聚类3.Dbscan聚类4.层次聚类5.GMM_EM聚 ...

  6. labuladong的算法小抄_学会了回溯算法,我终于会做数独了

    经常拿回溯算法来说事儿的,无非就是八皇后问题和数独问题了.那我们今天就通过实际且有趣的例子来讲一下如何用回溯算法来解决数独问题. 一.直观感受 说实话我小的时候也尝试过玩数独游戏,但从来都没有完成过一 ...

  7. 社区发现算法python视频_社区发现FN算法Python实现

    社区发现FN算法Python实现 算法原理 评价指标 结果对比 源码 ​2004年,Newman在GN(Girvan and Newman, 2002)算法的基础上,提出了另外一种快速检测社区的算法, ...

  8. python算法工程师书籍_我是如何成为算法工程师的,超详细的学习路线

    一.前言 各位十一过得如何? 假期,我回了趟老家,文章停更了几天. 写文章以来,被问到最多的问题就是「算法的学习路线」. 今天,它来了. 我会带着大家看看,我们需要学些啥,利用这个假期,我甚至还收集整 ...

  9. 感知算法工程师卷得要死,算法部署工程师却成为了香饽饽

    22年算法岗秋招哀鸿遍野,根据目前知乎与脉脉上各大企业HR发布的数据,达到了恐怖的100:1(100份简历投递,只有1个headcount),计算机视觉岗位尤其如此. 究其原因是,随着深度学习的框架越 ...

最新文章

  1. 阿里云全球19个地域节点,哪个节点的服务器好,速度快?...
  2. PHP生成PDF并转换成图片爬过的坑
  3. foreach遍历打印表格
  4. ucos内存管理笔记
  5. java系统的标准输出对象_到了宋代,虽然司法证明已经发展到以物证为主,用刑讯方式逼问当事人口供在官府断案过程中却一直长期存在。...
  6. SSH连接远程服务器,本地known_hosts文件记录了什么
  7. 基于RTMP实现Linux|麒麟操作系统下屏幕|系统声音采集推送
  8. C# 隐藏TabControl头
  9. 你需要的前端进阶书籍清单,分享下载
  10. 杂项:JFB-权限设置
  11. 分布式监控系统Zabbix--使用Grafana进行图形展示
  12. C#编写的打印排版控件拖拽软件
  13. 机器学习基石01:机器学习简介
  14. 【2018将成为AGI元年】13名专家盘点2017最重要AI事件,预测AGI将取代AI
  15. 怎么用软件测试睡眠质量差怎么办,手机软件可测睡眠质量?
  16. Linux系统中xz命令用法详解(压缩和解压缩)
  17. mysql用其他用户登录报错_mysql如何登录创建的用户
  18. VMT进阶1-自发光
  19. 无人驾驶虚拟仿真(十二)--图像处理之红绿灯识别
  20. 制作系统盘并且重装系统

热门文章

  1. QueryDSL中包含通配符的字符串的精确匹配
  2. maven ant_如何在Maven中运行Ant目标?
  3. jsf标签p:ajax_JSF简单Ajax示例
  4. 身份反模式:联邦筒仓和意大利面条身份
  5. JAXB –新手的观点,第1部分
  6. 编写干净的测试–提防魔术
  7. Java开发中更多常见的危险信号
  8. 使用CLI设置WildFly绑定地址并关闭
  9. 使用WSO2 ESB构建制造服务总线(MSB)
  10. 预热您的JVM –超快速生产服务器和IDE