【优化部署】基于matlab粒子群算法求解无线传感器WSN部署优化问题【含Matlab源码 1691期】

举报
海神之光 发表于 2022/05/29 00:13:00 2022/05/29
【摘要】 一、粒子群算法简介 1 粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对...

一、粒子群算法简介

1 粒子群算法的概念
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

2 粒子群算法分析
2.1基本思想
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。下面的动图很形象地展示了PSO算法的过程:
在这里插入图片描述
2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
在这里插入图片描述
公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。
在这里插入图片描述
公式(2)和 公式(3)被视为标准PSO算法。
3 PSO算法的流程和伪代码
在这里插入图片描述

二、部分源代码

clear all;
clc;
tic
format long;
%------给定初始化条件
XMAX=1000;%区域总长度
XMIN=0;%区域总长度
YMAX=1000;%区域总宽度
YMIN=0;%区域总宽度
deta=2;
x1=XMIN:deta:XMAX;%指从100开始,步长为2,终值为900的数组。
y1=YMIN:deta:YMAX;
[xx,yy]=meshgrid(x1,y1);%生成一个矩阵,用于绘制矩形区域
[m,n]=size(xx);%m是矩阵的行数,n是矩阵的列数
K=m*n; %总的网格点数目
xx1=reshape(xx,K,1);%网格点的横坐标,reshape返回一个K*1(即K行1列)的矩阵xx1
yy1=reshape(yy,K,1);%网格点的纵坐标
r=120;%探测半径
c1=2.0;%学习因子1(局部搜索能力)
c2=2.0;%学习因子2(全局搜索能力)
w=0.9437;%惯性权重
lamda=0.5;
MaxDT=50;%最大迭代次数
vmax=2.5;
N=40;%初始化群体个体数目,传感器的个数
num=20;%粒子数目,每40个传感器构成一个粒子
%初始化种群的个体
for i=1:num
    for j=1:N
        x(i,j,1)=(XMAX-XMIN)*rand(1,1)+XMIN;%随机初始化位置
        x(i,j,2)=(YMAX-YMIN)*rand(1,1)+YMIN;%随机初始化位置
        v(i,j,1)=randn;%随机初始化速度
        v(i,j,2)=randn;%随机初始化速度
    end
end
%计算各个粒子的适应度,并初始化Pi和Pg
for i=1:num
     p(i)=fitness(x(i,:,:));
    y(i,:,:)=x(i,:,:);
end
pg=x(1,:,:);%Pg为全局最优
for i=2:num
   if fitness(x(i,:,:))>fitness(pg)
       pg=x(i,:,:);
   end 
end
%把最优的粒子所代表的传感器分布方案用图形表示
figure,
hold on
plot(pg(1,:,1),pg(1,:,2),'b.','linewidth',2);
o=0:pi/50:2*pi;
for i=1:N
    x1=pg(1,i,1)+r*cos(o);
    y1=pg(1,i,2)+r*sin(o);%表示圆每一个角度对应一个点,然后把这些点连接起来构成圆
    hold on
    plot(x1,y1,'b');%画出各个传感器节点的感知范围
    text(pg(1,i,1)+3,pg(1,i,2),['\fontsize{8}\rm',num2str(i)]);
    hold on
end
axis([0 1000 0 1000]);%设定坐标范围
xlabel('X/m');ylabel('Y/m');
%legend('要监测的区域',['传感器节点(','\fontsize{12}\bf',num2str(N),'\fontsize{10}\rm个)的位置'],' 传感器节点的感知范围');
hold on
plot([XMIN XMAX],[YMIN YMIN],'k','linewidth',1.5);
hold on
plot([XMIN XMIN],[YMIN YMAX],'k','linewidth',1.5);
hold on
plot([XMAX XMAX],[YMIN YMAX],'k','linewidth',1.5);
hold on
plot([XMIN XMAX],[YMAX YMAX],'k','linewidth',1.5);%把四个顶点连接起来组成一个监测区域

%进入主循环,依次迭代,直到满足精度要求
for t=1:MaxDT
    l=t
 for i=1:num  
%对节点坐标进行更新
       v(i,:,:)=w*v(i,:,:)+c1*rand*(y(i,:,:)-x(i,:,:))+c2*rand*(pg(1,:,:)-x(i,:,:));%速度更新
       x(i,:,:)=x(i,:,:)+v(i,:,:);%位置更新
%对粒子中节点的状态进行调整
       [a,b,D]=juli(x(i,:,:));
       v(i,a,:)=lamda*(y(i,a,:)-x(i,a,:));%速度更新
       v(i,b,:)=lamda*(y(i,b,:)-x(i,b,:));%速度更新
       x(i,a,:)=x(i,a,:)+v(i,a,:);%位置更新
       x(i,b,:)=x(i,b,:)+v(i,b,:);%位置更新
%不能出界     
      for j=1:40
          if abs(v(i,j,1))>vmax
              v(i,j,1)=v(i,j,1)/abs(v(i,j,1))*vmax;
          end
          if abs(v(i,j,2))>vmax
              v(i,j,2)=v(i,j,2)/abs(v(i,j,2))*vmax;
          end
          if x(i,j,1)<XMIN
          x(i,j,1)=XMIN;
          end
          if x(i,j,1)>XMAX
          x(i,j,1)=XMAX;
          end
          if x(i,j,2)<YMIN
          x(i,j,2)=YMIN;
          end
          if x(i,j,2)>YMAX
          x(i,j,2)=YMAX; 
          end
      end
%对公告板的内容进行更新
      if fitness(x(i,:,:))>p(i)
          p(i)=fitness(x(i,:,:));
          y(i,:,:)=x(i,:,:);%粒子的最好位置
      end
      if p(i)>fitness(pg)
     pg=y(i,:,:);%全局的最好位置
      end
     end
     Pbest(t)=fitness(pg);
end
figure
plot(Pbest)
%最后结果
figure,
xm=[XMIN YMIN;XMIN YMAX;XMAX YMAX;XMAX YMIN];%区域的四个顶点
hold on
plot(pg(1,:,1),pg(1,:,2),'b.','linewidth',2);
o=0:pi/50:2*pi;
for i=1:N
    x1=pg(1,i,1)+r*cos(o);
    y1=pg(1,i,2)+r*sin(o);%表示圆每一个角度对应一个点,然后把这些点连接起来构成圆
    hold on
    plot(x1,y1,'b');   %画出各个传感器节点的感知范围
    text(pg(1,i,1)+3,pg(1,i,2),['\fontsize{8}\rm',num2str(i)]);
    hold on
end
  
 

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/122772209

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。