• 大小: 8KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: Matlab
  • 标签: PSO  leach  

资源简介

基于matlab的PSO版leach,一种改进,智能优化算法 粒子群算法的leach算法协议,仅供大家参考

资源截图

代码片段和文件信息

clear;
xm=100; %X轴 Y轴
ym=100; %%
sink.x=0.5*xm; %传输目的地(基站)
sink.y=0.5*ym; %
n=100;%节点总数
p=0.1;%簇头节点的概率
a=0.5;%%%%%%%%%%%%%%适应值函数归一化比例
E0=0.05;%初始能量
ETX=50*0.000000001;%传输能量/bit
ERX=50*0.000000001;%接收能量/bit
EFS=10*0.000000000001;%耗散能量/bit
EMP=0.0013*0.000000000001;
EDA=5*0.000000001;%融合能量/bit
rmax=300;%总轮数
do=sqrt(EFS/EMP); %???
figure(1);%图

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%~~~~~~~初始化,随机选节点坐标、节点标准
for i=1:1:n
    S(i).xd=rand(11)*xm;%X
    S(i).yd=rand(11)*ym;%Y
    S(i).G=0;%每一周期结束此变量为0
    S(i).E=E0; %能量
    S(i).F=0;%???
    S(i).type=‘N‘;%节点类型为普通
    S(i).cluster=0;%第i个节点所属簇的id,初始为0
    S(i).AVG=0;
    temp_rnd=i; %??
    plot(S(i).xdS(i).yd‘o‘);
    hold on;
end
%~~~~~~~~~~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

S(n+1).xd=sink.x; %例如100节点, 基站为101
S(n+1).yd=sink.y;
plot(S(n+1).xdS(n+1).yd‘x‘); 
figure(1);
countCHs=0;
rcountCHs=0;
cluster=1; %族头
countCHs;
rcountCHs=rcountCHs+countCHs;
flag_first_dead=0; %第一个死亡节点

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%~~~~~~~~~~~~~~~~~
for r=0:1:rmax 
    r %输出第几轮
    if(mod(rround(1/p))==0) % 判断T(n) by 31/52 
        for i=1:1:n;
            S(i).G=0;
            S(i).cl=0;
        end
    end
    
    %初始为0
    hold off;
    dead=0;
    packets_TO_BS=0;
    packets_TO_CH=0;
    PACKETS_TO_BS(r+1)=0;
    PACKETS_TO_CH(r+1)=0;
    figure(1);
    
    %%%%%%%%%%%%%%%%%%%%%%%
    %~~~~将死亡节点判为红色,未死亡的为黑色
    for i=1:1:n
        if(S(i).E<=0) %能量为0时 节点死亡
            plot(S(i).xdS(i).yd‘red .‘);
            dead=dead+1;
            hold on;
        end
        if(S(i).E>0)
            S(i).type=‘N‘;
            plot(S(i).xdS(i).yd‘o‘);
            hold on;
        end
    end
    %~~~~~~~~~
    %%%%%%%%%%%%%%%%%%%%%%
    
    plot(S(n+1).xdS(n+1).yd‘x‘);
    STATISTICS(r+1).DEAD=dead; %统计死亡数
    DEAD(r+1)=dead; %
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%
    %~~~~~~~~~~~~~~~~~死亡数等于1时, 记第一个死亡
    if (dead==1)
        if(flag_first_dead==0)
            first_dead=r;
            flag_first_dead=1;
        end
    end
    %~~~~~~
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %
    countCHs=0;
    cluster=1;
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~begin选临时簇头,已去除临时簇头传输消息!!
    for i=1:1:n
        if(S(i).E>0) %能量大于0
            if(S(i).G<=0) %???
                temp_rand1=rand; %随机数
                if(temp_rand1<=(p/(1-p*mod(rround(1/p))))) %随机数与T(n)判断,小成为簇头节点
                    S(i).type=‘D‘; %类型变换,第一轮为临时簇头
                    D(cluster).xd=S(i).xd; %簇头节点X轴
                    D(cluster).yd=S(i).yd; %簇头节点Y轴
                    S(i).cluster=cluster; %记入簇头数
                    cluster=cluster+1; %簇头加1
                    countCHs=countCHs+1; %簇头节点数目?????
                    packets_TO_BS=packets_TO_BS+1;%数据包+1
                end
            end
        end
    end
    %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~end选临时簇头
    %%%%%%%%%%%%%%%%%%%%%%%%

评论

共有 条评论