clear;%清除变量

xm=100;%设置区域为100*100

ym=100;

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

sink.y=0.5*ym;

n=100 %区域内的节点数目

p=0.01;% 节点成为簇头的概率

Eo=0.5;%节点初始能量

ETX=50*0.000000001;%发射单位报文损耗能量

ERX=50*0.000000001;%接收单位报文损耗能量

Efs=10*0.000000000001;%自由空间能量

Emp=0.0013*0.000000000001;%衰减空间能量

EDA=5*0.000000001;%多路径衰减能量

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

a=1;%参数

rmax=2500%最大的轮数

do=sqrt(Efs/Emp); %计算do 通信半径

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

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

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=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

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('p=0.01.存活节点图');

figure(3);%输出图形3

hold on;%保持曲线

plot(myenergy,'color','r');%用红色输出剩余能量

xlabel('周期数');

ylabel('剩余能量节点');

title('剩余能量图');

leach算法 matlab,求助LEACH的MATLAB仿真代码相关推荐

  1. 基于MATLAB的变速故障信号仿真代码

    基于MATLAB的变速故障信号仿真代码 前言 一.仿真的方程 二.仿真效果图 三.完整代码下载 更多学习内容: 前言 轴承通常在时变转速条件下工作.对信号进行时频域处理,提取瞬时故障特征频率(IFCF ...

  2. printm matlab,求助:将matlab M文件编译成DLL时出现的问题!

    本人用的matlab2007a和vc6,想利用编译器将M文件编译成COM组件供C#调用,可是编译时却出现一下问题,麻烦高手帮忙解决,不胜感激! 产生的结果如下: Build output( 2009- ...

  3. 代入消元法 matlab,求助 如何用matlab计算期权价格

    期权定价理论是现代金融学中最为重要的理论之一,也是衍生金融工具定价中最复杂的.本文给出了欧式期权定价过程的一个简单推导,并利用Matlab对定价公式给出了数值算例及比较静态分析,以使读者能更直观地理解 ...

  4. 如何生成时间序列matlab,求助:在MATLAB里如何输入时间序列中的时间

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function [logRS,logERS,V]=RSana(x,n,method,q) %Syntax: [logRS,logERS,V]=RSana ...

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

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

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

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

  7. LMS算法的基本理论和MATLAB仿真

    LMS算法的基本理论和MATLAB仿真 1 基本理论 2 仿真 2.1 第一种信号:期望信号+噪声 2.1.1 没有蒙特卡洛 2.1.2 有蒙特卡洛 2.2 第二种信号:期望信号+幅相误差 2.3 第 ...

  8. 【老生谈算法】matlab实现语音信号处理与仿真——语音信号处理算法

    基于Matlab的语音信号处理与仿真 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]MATLAB语音处理.docx 2.算法 ...

  9. 【MATLAB教程案例13】基于SA模拟退火优化算法的函数极值计算matlab仿真及其他应用

    FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...

  10. led的伏安特性曲线 matlab实现_灯泡伏安特性仿真实验的实现算法

    灯泡伏安特性仿真实验的实现算法 冯绍勇 ( 景德镇学院机电系 , 江西景德镇 333000 ) 摘 要 : 针对当前在电学内容课程教学中,"灯泡伏安特性的测定"仿真实验的缺乏,作者 ...

最新文章

  1. 小微商户申请php,微信小微商户申请入驻 - osc_r8q2esik的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. Django 第八课 3.【MySQL问题】
  3. tomcat 内存调整
  4. shell脚本-监控系统资源并通过短信报警
  5. 语音识别代码_Povey正式出任小米语音首席科学家,小米移动端框架MACE全面支持Kaldi...
  6. 在白宫,郎朗为什么选择了《我的祖国》
  7. C语言网络编程——基础
  8. Codeblock一直卡在编译界面
  9. DSP与FPGA的SRIO通信实现
  10. 基于单片机的电子万年历的设计
  11. 干货分享:如何把APP软文推广做到好
  12. 【 C++ 】日期计算器
  13. 微信QQ邮箱插件,附件Excel 无法打开,或者打开乱码问题
  14. innerHTML,outerHTML innerHTML
  15. Python——turtle库之画笔形状
  16. isFile()exists() isDirectory()
  17. keil5错误error: A1355U: A Label was found which was in no AREA 终级解决办法
  18. 什么是节流和防抖?有什么区别?为什么做这个处理?
  19. Matlab中布尔值/逻辑值与数值型类型的相互转换
  20. Linux split文件切分工具的使用

热门文章

  1. 二、Java的三大特征(或者四大特征)
  2. JLink驱动设备管理器中显示黄色感叹号
  3. 新版中日交流标准日本语多媒体版(全25CD)下载
  4. 微信H5 跳转小程序 (html版本)
  5. 飞思卡尔单片机KEA128之ADC学习
  6. 华为数字化转型步骤、方法和目标
  7. 华为鸿蒙主题设计,2020华为全球主题设计大赛,简直就是神仙打架啊!
  8. intersystem-M语言基础语法
  9. REST服务简介和实践
  10. springboot通过code获取微信小程序UnionID