leach-matlab
http://www.oschina.net/code/snippet_860036_21044clear;%清除变量xm=100;%设置区域为100*100ym=100;sink.x=0.5*xm;%sink(汇聚)节点坐标sink.y=0.5*ym;n=100 %区域内的节点数目p=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;%多路径衰减能量m=0.1;%成为高级节点比率a=1;%参数rmax=1500%最大的轮数do=sqrt(Efs/Emp); %计算do 通信半径figure(1);%输出图形for i=1:1:n %i为矩阵1到n,间距为1S(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;%设置初始能量为E0S(i).ENERGY=0;%普通节点plot(S(i).xd,S(i).yd,'o');%输出节点,用o表示hold on;endif (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;endendS(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到最大,间距为1rpnrm=( p/ (1+a*m) );%普通节点的选举概率padv= ( p*(1+a)/(1+a*m) ); %高级节点的选举概率if(mod(r, round(1/pnrm) )==0)%余数为0for i=1:1:n%i为矩阵1到n,间距为1S(i).G=0;%簇头数目S(i).cl=0;endendif(mod(r, round(1/padv) )==0)for i=1:1:n%i为矩阵1到n,间距为1if(S(i).ENERGY==1)S(i).G=0;%簇头数目S(i).cl=0;endendendhold 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,间距为1if (S(i).E<=0)%检查是否有节点死亡plot(S(i).xd,S(i).yd,'red .')%输出节点,用红.表示dead=dead+1;%节点死亡数+1if(S(i).ENERGY==1)%高级节点dead_a=dead_a+1;%高级节点死亡数+1endif(S(i).ENERGY==0)%普通节点dead_n=dead_n+1;%普通节点死亡数+1endhold on; endif S(i).E>0%节点能量大于0S(i).type='N';%节点类型为普通if (S(i).ENERGY==0) plot(S(i).xd,S(i).yd,'o');endif (S(i).ENERGY==1) %节点类型为高级plot(S(i).xd,S(i).yd,'+');endhold on;endendplot(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;%第一个死亡节点标志endendcountCHs=0;%簇头的个数cluster=1;%簇头的数目for i=1:1:n%i为矩阵1到n,间距为1if(S(i).E>0)%节点剩余能量大于0temp_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;%簇头数+1packets_TO_BS=packets_TO_BS+1;%传送到基站的计数器+1PACKETS_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;%簇头总数+1distance;if (distance>do)%距离大于通信半径S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); %能量消耗endif (distance<=do)%距离小于通信半径S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance )); %能量消耗endend if( ( S(i).ENERGY==1 && ( temp_rand <= ( padv / ( 1 - padv * mod(r,round(1/padv)) )) ) ) )%高级节点簇头选举countCHs=countCHs+1;%簇头数+1packets_TO_BS=packets_TO_BS+1;%传送到基站的计数器+1PACKETS_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;%簇头总数+1distance;if (distance>do)%距离大于通信半径S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Emp*4000*( distance*distance*distance*distance )); %能量消耗endif (distance<=do)%距离小于通信半径S(i).E=S(i).E- ( (ETX+EDA)*(4000) + Efs*4000*( distance * distance )); %能量消耗endend endend endSTATISTICS(r+1).CLUSTERHEADS=cluster-1;%r轮后簇头数CLUSTERHS(r+1)=cluster-1;%r轮后簇头数for i=1:1:nif ( 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-1temp=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;endendmin_dis;if (min_dis>do)S(i).E=S(i).E- ( ETX*(4000) + Emp*4000*( min_dis * min_dis * min_dis * min_dis)); endif (min_dis<=do)S(i).E=S(i).E- ( ETX*(4000) + Efs*4000*( min_dis * min_dis)); endif(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; endS(i).min_dis=min_dis;S(i).min_dis_cluster=min_dis_cluster;endendendhold on;countCHs;rcountCHs=rcountCHs+countCHs;STATISTICS(r+1).ENERGY=0;for i=1:1:n%当前节点数if S(i).E > 0%如果节点i剩余能量大于0STATISTICS(r+1).ENERGY = STATISTICS(r+1).ENERGY +S(i).E;%r轮后节点剩余能量加上节点i的剩余能量endend%[vx,vy]=voronoi(X,Y);%plot(X,Y,'r*',vx,vy,'b-');%hold on;% voronoi(X,Y);%axis([0 xm 0 ym]);hold off;endfor i=2:rmax%当前节点数mylive(i) = n - STATISTICS(i).DEAD;myenergy(i) = STATISTICS(i).ENERGY;%剩余能量endmylive(1)=100;myenergy(1)=S(1).E+(n-1)*Eo;figure(2);%输出图形2hold on;%保持曲线plot(mylive,'color','r');%用红色输出存活节点数xlabel('周期数');ylabel('存活节点');title('存活节点图');figure(3);%输出图形3hold on;%保持曲线plot(myenergy,'color','r');%用红色输出剩余能量xlabel('周期数');ylabel('剩余能量节点');title('剩余能量图');leach-matlab的更多相关文章
- leach协议matlab仿真代码
http://www.ilovematlab.cn/thread-177006-1-1.html LEACH協議clear;%清除內存變量 xm=100;%x軸範圍ym=100;%y軸範圍 sink. ...
- LEACH分簇算法实现和能量控制算法实现
一.前言 1.在给定WSN的节点数目(100)前提下,节点随机分布,按照LEACH算法,实现每一轮对WSN的分簇.记录前K轮(k=10)时,网络的分簇情况,即每个节点的角色(簇头或簇成员).标记节点之 ...
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Matlab slice方法和包络法绘制三维立体图
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Matlab 高斯_拉普拉斯滤波器处理医学图像
前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...
- MATLAB中绘制质点轨迹动图并保存成GIF
工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...
- linux下配置matlab运行环境(MCR)
在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...
- EMD分析 Matlab 精华总结 附开源工具箱(全)
前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...
- Atitit MATLAB 图像处理 经典书籍attilax总结
Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...
- Atitit MATLAB 图像处理attilax总结
Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...
随机推荐
- 部署Zipkin分布式性能追踪日志系统的操作记录
Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务. 部署Zipkin环境的操作记录:部署Zipki ...
- Web知识总结
一)window.location.href和window.location.replace的区别 1.window.location.href=“url”:改变url地址: 2.window.loc ...
- C语言 百炼成钢2
//题目4:输入某年某月某日,判断这一天是这一年的第几天? #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<st ...
- HMAC-MD5算法原理及实现
以下是分析节选,对于更详细的描述可以查阅RFC2104文档. HMAC需要一个加密用散列函数(表示为H)和一个密钥K. 假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数. 用B来表 ...
- [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
12.3 We have the following method used in a chess game: boolean canMoveTo( int x, int y). This metho ...
- linux内核分析 第八周
第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程 一.进程调度与切换 1.进程的调度时机与进程切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程 ...
- 学习笔记——Maven实战(三)多模块项目的POM重构
重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...
- selection伪元素小解
上一篇:<RGBA与Opacity区别小解> p{font-size:14px;} 今天说一个简单的伪元素::selection,它的用武之地仅在于改变选中文本时文本的颜色和文本背景颜色. ...
- 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
引言 niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之 ...
- 转摘http://blog.csdn.net/hulihui/article/details/3351922#s6
译文:构建DataGridView的定制NumericUpDown单元格(Cell)和表格列(Column) 分类: DataGridView控件 2008-11-22 20:58 3555人阅读 评 ...