无线传感网络LEACH的MATLAB实现
时间:2019-12-21
本文章向大家介绍无线传感网络LEACH的MATLAB实现,主要包括无线传感网络LEACH的MATLAB实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
详细代码及注释如下:
xm=100;%设置区域为100*100 ym=100;
sink.x=0.5*xm;%sink(汇聚)节点坐标 sink.y=1.75*ym;
n=100 %区域内的节点数目 p=0.05;% 节点成为簇头的概率 Eo=0.5;%节点初始能量 ETX=50*0.000000001;%发射单位报文损耗能量 ERX=50*0.000000001;%接收单位报文损耗能量 Efs=10*0.000000000001;%自由空间能量 Emp=0.0013*0.000000000001;%衰减空间能量 EDA=5*0.000000001;%聚集数据所要消耗的能量 rmax=2000%最大的轮数 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';%节点类型为普通 S(i).E=Eo;%设置初始能量为E0 S(i).ENERGY=0;%普通节点标志 plot(S(i).xd,S(i).yd,'o');%输出节点,用o表示 hold on; 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表示 %第一次迭代 title('Wireless Sensor Network'); figure(1); cluster=1; flag_first_dead=0;%第一个节点死亡的标志变量 for r=0:1:rmax r if(mod(r, round(1/p) )==0)%如果所有节点都当过簇头,则全部节点清零,回到最初状态 for i=1:1:n S(i).G=0;%簇头数目 end end dead=0; figure(4); for i=1:1:n if (S(i).E<=0)%检查是否有节点死亡 plot(S(i).xd,S(i).yd,'red .')%输出节点,用红.表示 dead=dead+1;%节点死亡数+1 hold on; end if (S(i).E>0)%节点能量大于0 S(i).type='N'; plot(S(i).xd,S(i).yd,'o'); hold on; end end plot(S(n+1).xd,S(n+1).yd,'x');%sink STATISTICS_leach(r+1).DEAD=dead;%r轮后死亡节点数 DEAD_leach(r+1)=dead;%r轮后死亡节点数 if (dead==1)%第一个节点死亡 if(flag_first_dead==0)%第一个节点死亡周期 first_dead=r%第一个节点死亡轮数 flag_first_dead=1;%第一个死亡节点标志 end end countCHs=0;%簇头的个数 cluster=1;%簇头的标号,初始值为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(temp_rand<= (p/(1-p*mod(r,round(1/p)))))%对簇头节点进行处理 countCHs=countCHs+1;%簇头数+1 S(i).type='C';%节点类型为簇头 S(i).G=100;%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 );%相对应的簇头到sink的距离 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 );%普通节点到sink节点间最短距离 min_dis_cluster=1;%初始距离最近的簇头默认为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 ) );%选取节点到簇头距离和到sink节点距离之间最近的一个 if ( temp<min_dis )%即离某个簇头距离更近 min_dis=temp; min_dis_cluster=c; end end%循环结束后,即找到该节点对应的最近簇头或者sink 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 ); end S(i).min_dis=min_dis; S(i).min_dis_cluster=min_dis_cluster; end end end STATISTICS(r+1).ENERGY=0; for i=1:1:n if S(i).E > 0 STATISTICS(r+1).ENERGY = STATISTICS(r+1).ENERGY +S(i).E;%r轮后节点剩余能量加上节点i的剩余能量 end end hold off; end for i=2:1:rmax%当前节点数 mylive(i) = n - STATISTICS_leach(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('Rounds'); ylabel('Operation Nodes'); title('LEACH Operating Nodes per Round'); figure(3);%输出图形3 hold on;%保持曲线 plot(myenergy,'color','r');%用红色输出剩余能量
代码参考自百度文库
原文地址:https://www.cnblogs.com/lrbll/p/12077905.html
- Debian 和Ubuntu Mono 3.0 部署包
- Apache Storm内部原理分析
- 使用lrucache和diskLrucache实现照片墙
- android 减少图片出现oom错误
- android分包方案
- 系统负载能力浅析
- 微软正式发布了Microsoft.Bcl.Async
- parcel和parcelable
- Windows Phone 7 WebBrowser 中文乱码问题
- Java并发包类总览
- 作业调度框架 Quartz.NET 2.0 beta 发布
- 系统捕获异常并发送到服务器
- 当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案
- WCF 4.0路由服务Routing Service
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- codeforces 1384A(构造)
- codeforces 982C (dfs)
- POJ 2493 (map)
- codeforces 1417C(思维)
- codeforces 1256C (贪心+构造)
- codeforces 722C(带权并查集+反向思维)
- codeforces 1144D(思维)
- 经典的SparkSQL/Hive-SQL/MySQL面试-练习题
- codeforces 1249E(dp)
- Redis-KV数据库Java连接以及Jedis包的使用
- codeforces 1203D1(暴力)
- codeforces 1366B(线段相交)
- 一文搞懂Python自动化测试框架
- codeforces 1005D(数学)
- JSP开发简单实例演示