资源简介

添加能量感知的分簇路由算法,MATLAB仿真编译程序,可直接运行,注释详细,可用,原版本不变,仅减少积分用

资源截图

代码片段和文件信息

function y1 = advance3()
clear;%清除变量
xm=100;%设置区域为100*100
ym=100;
sink.x=0.5*xm;%sink(汇聚)节点坐标
sink.y=0.5*ym;
n=100 ;%区域内的节点数目
m=0.1;
Eo=0.5;%节点初始能量
ETX=50*0.000000001;%发射单位报文损耗能量 
ERX=50*0.000000001;%接收单位报文损耗能量
Efs=10*0.000000000001;%自由空间能量
Emp=0.0013*0.000000000001;%衰减空间能量
EDA=5*0.000000001;%多路径衰减能量
a=2;
b=50;

rmax=2000; %最大的轮数
do=sqrt(Efs/Emp); %计算do 通信半径

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1);%输出节点分布图形;共有n个节点,具体100前面已经预设

for i=1:1:n %i为矩阵1到n,间距为1
    S(i).xd=rand(11)*xm;%1行1列矩阵
    XR(i)=S(i).xd;%随机生成的X轴坐标
    S(i).yd=rand(11)*ym;
    YR(i)=S(i).yd;%随机生成的Y轴坐标
    S(i).G=0                           ;%定义第i个节点初始值为0,即有资格成为簇首节点
    S(i).type=‘N‘;%节点类型为普通
    temp_rnd0=i;%这一轮循环中的节点i
    if (temp_rnd0>=m*n+1) %普通节点的随机选举
        S(i).E=Eo;%设置初始能量为E0
        S(i).ENERGY=0;%普通节点
        
        plot(S(i).xdS(i).yd‘o‘);%输出节点分布图;图1,用o表示
        hold on;
        
    end
    if (temp_rnd0        S(i).E=Eo;%设置初始能量为Eo
        S(i).ENERGY=1;%高级节点,作为区分高级和非高级节点的标志
       
        plot(S(i).xdS(i).yd‘o‘);%输出节点,用*表示
        hold on;
    end
end
 
S(n+1).xd=sink.x;%基站X轴坐标
S(n+1).yd=sink.y;%基站Y轴坐标
plot(S(n+1).xdS(n+1).yd‘k:x‘); %输出基站,用黑色x表示 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%确定分簇的数目

distance1=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );%计算各个节点到基站的距离
min_dis0=distance1;
max_dis0=distance1;
for i=1:1:n
     temp0=min(min_dis0sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 ) );
                if ( temp0                    min_dis0=temp0;
                end
      temp1=max(max_dis0sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 ) );
                if ( temp1>min_dis0 )
                    max_dis0=temp1;
                end
end                      %找出各个节点到基站的距离d 最大最小值
nplot=(xm/(temp1-temp0))*sqrt(2*n/pi);%优化之后,最佳的簇头个数
p1=nplot/n;%分簇的概率
flag_first_dead1=0;%第一个节点死亡的标志变量初始值为0
figure(1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%每过round(1/p)轮,节点重新选举簇头节点
for r=1:rmax
countCHs1=0;  %  当前簇数目
rcountCHs1=0;  %  r轮后当过簇的节点数目
cluster1=1;  %定义一个以1开始变化的簇头节点数目
countCHs1;
rcountCHs1=rcountCHs1+countCHs1;

 

    pnrm=p1;%普通节点的选举概率
    padv=p1; %高级节点的选举概率
    if(mod(r round(1/pnrm) )==0)       
        %0起始,相当于每过多少轮重新选择一次簇头,最终使得所有节点都当过簇头节点,
        % 每个节点都可能成为簇头节点,(余数为0)
        for i=1:1:n%i为矩阵1到n,间距为1
            S(i).G=0;%能成为簇头的节点标志值
            S(i).cl=0;
        end
    end
    
    if(mod(r round(1/padv) )==0)
  
        for i=1:1:n%i为矩阵1到n,间距为1
            if(S(i).ENERGY==1)
            S(i).G=0;%簇头数目
            S(i).cl=0;
            end
        end
    end
 
 
   hold off;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %统计节点死亡的数目,和第一个节点死亡的轮数
 
 dead1=0;%节点死亡数
 dead_a1=0;%高级节点死亡数
 dead_n1=0;%普通节点死亡数

评论

共有 条评论