http://www.oschina.net/code/snippet_860036_21044
clear;%清除变量
xm=100;%设置区域为100*100
ym=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,间距为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仿真代码

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

  2. LEACH分簇算法实现和能量控制算法实现

    一.前言 1.在给定WSN的节点数目(100)前提下,节点随机分布,按照LEACH算法,实现每一轮对WSN的分簇.记录前K轮(k=10)时,网络的分簇情况,即每个节点的角色(簇头或簇成员).标记节点之 ...

  3. Matlab 绘制三维立体图(以地质异常体为例)

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  4. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  5. Matlab 高斯_拉普拉斯滤波器处理医学图像

    前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...

  6. MATLAB中绘制质点轨迹动图并保存成GIF

    工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...

  7. linux下配置matlab运行环境(MCR)

    在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...

  8. EMD分析 Matlab 精华总结 附开源工具箱(全)

    前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...

  9. Atitit MATLAB 图像处理 经典书籍attilax总结

    Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...

  10. Atitit MATLAB 图像处理attilax总结

    Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...

随机推荐

  1. FMDB 使用方法

    优秀的第三方库,README 也是很优秀的,理解了 README,会对使用带来很多便利. ARC 和 MRC 项目中使用 ARC 还是 MRC,对使用 FMDB 都没有任何影响,FMDB 会在编译项目 ...

  2. kprobe原理解析(二)

    上一篇文章和大家简要说明了下kprobe到底应该怎样用,那么现在我们就揭开kprobe神秘的面纱,刨根问底,一睹kprobe的庐山真面目. kprobe的工作过程大致如下: 1)注册kprobe.注册 ...

  3. poj 1163 The Triangle

    The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43809   Accepted: 26430 De ...

  4. 用Swift GestureRecognizer 的几个注意点

    最近做了一些关于 GestureRecognizer 的工作 ,随笔记录一些需要注意的点: 1. PanGestureRecognizer (1)在使用时 注意在哪个view添加了 手势识别 self ...

  5. log4j+logback+slf4j+commons-logging的关系与调试(转)

    log4j+logback+slf4j+commons-logging的关系与调试 从Log4j迁移到LogBack的理由 http://www.tuicool.com/articles/beeeYv ...

  6. 在WebApi中实现Cors访问

    Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法,对于B网站和C网站 ...

  7. Linux 安装配置Subversion edge

    2014-04-14:修正部分描述.添加JAVA_HOME报错处理步骤.添加配置sudoers 系统:CentOS 5.8 ,6.4 Subversion版本:Subversion Edge 4.0. ...

  8. PHP Yii1.1.13(一):命令行创建应用~shop

    第一节 初始目录结构 (1)初识目录结构 在创建应用之前,我们来看一下Yii 1.x版本的目录结构:将yii-1.1.13安装文件解压到网站根目录下,打开framework目录,其目录如下图所示 (2 ...

  9. 支持Json进行操作的Javascript类库TAFFY DB

    前段时间工作中用到Json数据,希望将一些简单的增删改查放到客户端来做,这样也能减少服务器端的压力.分别查找了几个可以对Json进行操作的javascript 类库,最终选定了TAFFY DB.原因如 ...

  10. jquery面试需要看的基本东西

    1. offset() 方法的学习offset().left offset().top 表示离document的距离.(浏览器可以看到的地方的距离)2. position与offset的区别:a.使用 ...