clear;%清除变量
xm=100;%设置区域为100*100
ym=100;

sink.x=0.5*xm;%sink(汇聚)节点坐标
sink.y=0.5*ym;

n=100 %区域内的节点数目
p=0.1;% 节点成为簇头的概率

%Energy Model (all values in Joules)
Eo=0.5;%节点初始能量
ETX=50*0.000000001;%发射单位报文损耗能量
ERX=50*0.000000001;%接收单位报文损耗能量
Efs=10*0.000000000001;%自由空间能量
Emp=0.0013*0.000000000001;%衰减空间能量
EDA=5*0.000000001;%多路径衰减能量

%Values for Hetereogeneity
m=0.1;%成为高级节点比率

a=1;%参数 %\alpha

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

%Creation of the random Sensor Network
figure(1);%输出图形
for i=1:1:n %i为矩阵1到n,间距为1
    S(i).xd=rand(1,1)*xm;%1行1列矩阵
    XR(i)=S(i).xd;%随机生成的X轴
    
    S(i).yd=rand(1,1)*ym;
    YR(i)=S(i).yd;%随机生成的Y轴
    
    S(i).G=0;%
    S(i).type='N';%节点类型为普通
    
    temp_rnd0=i;%随机数值
    if (temp_rnd0>=m*n+1) %普通节点的随机选举
        S(i).E=Eo;%设置初始能量为E0
        S(i).ENERGY=0;%普通节点
        plot(S(i).xd,S(i).yd,'o');%输出节点,用o表示
        hold on;
    end
    if (temp_rnd0<m*n+1) %高级节点的随机选举
        S(i).E=Eo*(1+a)%设置初始能量为Eo*(1+a)
        S(i).ENERGY=1;%高级节点
        plot(S(i).xd,S(i).yd,'r:+');%输出节点,用+表示
        hold on;
    end
end

S(n+1).xd=sink.x;%汇聚节点X轴坐标
S(n+1).yd=sink.y;%汇聚节点Y轴坐标
plot(S(n+1).xd,S(n+1).yd,'x'); %输出汇聚节点,用x表示

figure(1);
countCHs=0;
rcountCHs=0;
cluster=1;
countCHs;
rcountCHs=rcountCHs+countCHs;
flag_first_dead=0;%第一个节点死亡的标志变量

for r=0:1:rmax%r为矩阵0到最大,间距为1
    r
    pnrm=( p/ (1+a*m) );%普通节点的选举概率
    padv= ( p*(1+a)/(1+a*m) ); %高级节点的选举概率
    if(mod(r, round(1/pnrm) )==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;
    
    dead=0;%节点死亡数
    dead_a=0;%高级节点死亡数
    dead_n=0;%普通节点死亡数
    
    packets_TO_BS=0;%传输sink节点报文数
    packets_TO_CH=0;%传输簇头的报文数
    PACKETS_TO_CH(r+1)=0;%每轮传送到簇头的报文数
    PACKETS_TO_BS(r+1)=0;%每轮传送到基站的报文数
    
    figure(4);
    
    
    for i=1:1:n %i为矩阵1到n,间距为1
        if (S(i).E<=0)%检查是否有节点死亡
            plot(S(i).xd,S(i).yd,'red .')%输出节点,用红.表示
            dead=dead+1;%节点死亡数+1
            if(S(i).ENERGY==1)%高级节点
                dead_a=dead_a+1;%高级节点死亡数+1
            end
            if(S(i).ENERGY==0)%普通节点
                dead_n=dead_n+1;%普通节点死亡数+1
            end
            hold on;
        end
        if S(i).E>0%节点能量大于0
            S(i).type='N';%节点类型为普通
            if (S(i).ENERGY==0)
                plot(S(i).xd,S(i).yd,'o');
            end
            if (S(i).ENERGY==1) %节点类型为高级
                plot(S(i).xd,S(i).yd,'+');
            end
            hold on;
        end
    end
    plot(S(n+1).xd,S(n+1).yd,'x');
    
    
    STATISTICS(r+1).DEAD=dead;%r轮后死亡节点数
    DEAD(r+1)=dead;%r轮后死亡节点数
    DEAD_N(r+1)=dead_n;%r轮后普通节点死亡数
    DEAD_A(r+1)=dead_a;%r轮后高级节点死亡数
    
    if (dead==1)%第一个节点死亡
        if(flag_first_dead==0)%第一个节点死亡周期
            first_dead=r%第一个节点死亡轮数
            flag_first_dead=1;%第一个死亡节点标志
        end
    end
    
    
    
    
    
    
    countCHs=0;%簇头的个数
    cluster=1;%簇头的数目
    for i=1:1:n%i为矩阵1到n,间距为1
        if(S(i).E>0)%节点剩余能量大于0
            temp_rand=rand;
            if ( (S(i).G)<=0)%没有簇头
                
                if( ( S(i).ENERGY==0 && ( temp_rand <= ( pnrm / ( 1 - pnrm * mod(r,round(1/pnrm)) )) ) ) )%普通节点的簇头选举
                    
                    countCHs=countCHs+1;%簇头数+1
                    packets_TO_BS=packets_TO_BS+1;%传送到基站的计数器+1
                    PACKETS_TO_BS(r+1)=packets_TO_BS;%每轮传送到基站的计数器=传送到基站的计数器
                    
                    S(i).type='C';%节点类型为簇头
                    S(i).G=100;
                    C(cluster).xd=S(i).xd;%簇头X轴坐标
                    C(cluster).yd=S(i).yd;%簇头Y轴坐标
                    plot(S(i).xd,S(i).yd,'k*');%输出节点,用黑*表示
                    
                    distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );%计算距离
                    C(cluster).distance=distance;%距离
                    C(cluster).id=i;%簇头的节点编号
                    X(cluster)=S(i).xd;%X轴坐标
                    Y(cluster)=S(i).yd;%Y轴坐标
                    cluster=cluster+1;%簇头总数+1
                    
                    
                    distance;
                    if (distance>do)%距离大于通信半径
                        S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); %能量消耗
                    end
                    if (distance<=do)%距离小于通信半径
                        S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance )); %能量消耗
                    end
                end
                
                
                if( ( S(i).ENERGY==1 && ( temp_rand <= ( padv / ( 1 - padv * mod(r,round(1/padv)) )) ) ) )%高级节点簇头选举
                    
                    countCHs=countCHs+1;%簇头数+1
                    packets_TO_BS=packets_TO_BS+1;%传送到基站的计数器+1
                    PACKETS_TO_BS(r+1)=packets_TO_BS;%每轮传送到基站的计数器=传送到基站的计数器
                    
                    S(i).type='C';%节点类型为簇头
                    S(i).G=100;
                    C(cluster).xd=S(i).xd;%簇头X轴坐标
                    C(cluster).yd=S(i).yd;%簇头Y轴坐标
                    plot(S(i).xd,S(i).yd,'k*');%输出节点,用黑*表示
                    
                    distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );%计算距离
                    C(cluster).distance=distance;%距离
                    C(cluster).id=i;%簇头的节点编号
                    X(cluster)=S(i).xd;%X轴坐标
                    Y(cluster)=S(i).yd;%Y轴坐标
                    cluster=cluster+1;%簇头总数+1
                    
                    
                    distance;
                    if (distance>do)%距离大于通信半径
                        S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); %能量消耗
                    end
                    if (distance<=do)%距离小于通信半径
                        S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance )); %能量消耗
                    end
                end
                
            end
        end
    end
    STATISTICS(r+1).CLUSTERHEADS=cluster-1;%r轮后簇头数
    CLUSTERHS(r+1)=cluster-1;%r轮后簇头数
    for i=1:1:n
        if ( S(i).type=='N' && S(i).E>0 )%选举正常节点的相关簇头
            if(cluster-1>=1)%簇头总数大于2个
                min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );%两节点间最短距离
                min_dis_cluster=1;%距离最小的簇头数
                for c=1:1:cluster-1
                    temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );
                    if ( temp<min_dis )
                        min_dis=temp;
                        min_dis_cluster=c;
                    end
                end
                min_dis;
                if (min_dis>do)
                    S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis));
                end
                if (min_dis<=do)
                    S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis));
                end
                
                if(min_dis>0)%能量消散
                    S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E- ( (ERX + EDA)*4000 );
                    PACKETS_TO_CH(r+1)=n-dead-cluster+1;
                end
                S(i).min_dis=min_dis;
                S(i).min_dis_cluster=min_dis_cluster;
            end
        end
    end
    hold on;
    countCHs;
    rcountCHs=rcountCHs+countCHs;
    STATISTICS(r+1).ENERGY=0;
    for i=1:1:n%当前节点数
        if S(i).E > 0%如果节点i剩余能量大于0
            STATISTICS(r+1).ENERGY = STATISTICS(r+1).ENERGY +S(i).E;%r轮后节点剩余能量加上节点i的剩余能量
        end
    end
    %[vx,vy]=voronoi(X,Y);
    %plot(X,Y,'r*',vx,vy,'b-');
    %hold on;
    % voronoi(X,Y);
    %axis([0 xm 0 ym]);
    hold off;
end
for i=2:rmax%当前节点数
    mylive(i) = n - STATISTICS(i).DEAD;
    myenergy(i) = STATISTICS(i).ENERGY;%剩余能量
end
mylive(1)=100;
myenergy(1)=S(1).E+(n-1)*Eo;
figure(2);%输出图形2
hold on;%保持曲线
plot(mylive,'color','r');%用红色输出存活节点数
xlabel('周期数');
ylabel('存活节点');
title('存活节点图');
figure(3);%输出图形3
hold on;%保持曲线
plot(myenergy,'color','r');%用红色输出剩余能量
xlabel('周期数');
ylabel('剩余能量节点');
title('剩余能量图');

leach-matlab相关推荐

  1. 【LEACH协议】基于matlab无线传感器网络LEACH与DEEC协议【含Matlab源码 2187期】

    ⛄一. 简介 1 引言 WSN 由能感知外部环境的传感器节点以自组网的形式构成,是一种分布式无线传感器网络.随着科技的进步和现代生活的需求,由于 WSN 的远程控制.信息即时传播以及低功耗等众多优点, ...

  2. 【Leach协议】基于matlab leach+leach-c+TSI-Leach三种协议对比【含Matlab源码 2512期】

    ⛄一. 简介 1 引言 WSN 由能感知外部环境的传感器节点以自组网的形式构成,是一种分布式无线传感器网络.随着科技的进步和现代生活的需求,由于 WSN 的远程控制.信息即时传播以及低功耗等众多优点, ...

  3. 【LEACH协议】基于matlab最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】

    ⛄一. 数据融合的LEACH协议简介 1 基于自适应数据融合的LEACH协议 1.1 基本定义和概念 无线传感器网络中的一个簇可以用一个无向加权全连通图G=(V,E)来表示,V是簇中所有传感器节点的集 ...

  4. 基于MATLAB的leach协议能量检测算法仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 LEACH协议,全称是"低功耗自适应集簇分层型协议" (Low Energy Adaptive Clust ...

  5. leach分簇功能实现matlab,一种改进的LEACH分簇层次路由算法的制作方法

    本发明涉及无线传感器网络领域,属于leach路由通信 技术领域: . 背景技术: :物联网技术飞速发展,无线传感器网络(wirelesssensornetworks,wsn)也逐渐成为互联网研究领域的 ...

  6. 【WSN通信】基于Matlab LEACH融合树多跳传输协议【含Matlab源码 1897期】

    ⛄一. 数据融合的LEACH协议简介 1 基于自适应数据融合的LEACH协议 1.1 基本定义和概念 无线传感器网络中的一个簇可以用一个无向加权全连通图G=(V,E)来表示,V是簇中所有传感器节点的集 ...

  7. leach协议matlab仿真代码

    http://www.ilovematlab.cn/thread-177006-1-1.html LEACH協議 clear;%清除內存變量 xm=100;%x軸範圍 ym=100;%y軸範圍 sin ...

  8. 【Matlab WSN通信】A_Star改进LEACH多跳传输协议【含源码 487期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]蚁群算法机器人大规模栅格地图最短路径规划[含源码 1860期] 二.蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接.灾 ...

  9. 【LEACH协议】粒子群算法改进LEACH协议【含Matlab源码 2052期】

    ⛄一. 简介 1 引言 WSN 由能感知外部环境的传感器节点以自组网的形式构成,是一种分布式无线传感器网络.随着科技的进步和现代生活的需求,由于 WSN 的远程控制.信息即时传播以及低功耗等众多优点, ...

  10. 【LEACH协议】基于matlab蝴蝶优化算法WSN安全分簇路由设计【含Matlab源码 2567期】

    ⛄一.蝴蝶优化算法(MBO)简介 1 介绍 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算法.该算法受 ...

最新文章

  1. 设置计算机网络为家用,两台电脑怎么同时上网 家用宽带路由器设置【设置方法】...
  2. Ubuntu安装HBase2.2.4并进行单机/伪分布式配置
  3. SkinMagic使用后按钮加自定义图标或菜单GetMneu返回NULL的解决方法
  4. unity中实现简单对象池,附教程原理
  5. 国家开放大学2021春1171科学与技术题目
  6. android:configChanges属性总结
  7. 【洛谷 - U43391】不是0-1背包的暴力AC(思维,二分,可转化为二元组问题,复习暴力dfs总结)
  8. AndroidTelephony学习大纲
  9. [译]Windows 服务用户帐户
  10. 慕课python七月_【慕课有约】七月老师:关于小程序的那些事
  11. MyBatis学习前篇
  12. 单片机开发板抗干扰(转载于51hei单片机)
  13. 误删MySQL数据库中的mysql库怎么恢复
  14. php自动盖章,在线生成实用又方便 (图片印章)
  15. [笔记分享] [Camera] msm8926的ZSL功能小结
  16. 流媒体视频播放代码总结。
  17. Element 之loading颜色修改
  18. 晚还款没事,各行信用卡容时容差服务大汇总!
  19. egde被360导航劫持
  20. expert个人版 sqlite_SQLite Expert Personal下载

热门文章

  1. 全排列的java算法_两种常用的全排列算法(java)
  2. 使用快思聪中控控制PC播放器
  3. 抢尽 Spark 风头的 Flink 强在哪里?
  4. 如何'安装linux系统,如何安装linux系统
  5. IE 9报错 “已经停止工作” 解决方法
  6. 关闭搜狗 ShowInfo.exe 天猫618超级狂欢红包 毒瘤广告
  7. 解析UML工作流管理系统
  8. JAVA队列(Queue)用法附实例讲解
  9. 面试:如何面对HR的提问?
  10. math 百分比误差、百分比差异、百分比变化