leach-matlab

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(‘剩余能量图‘);

时间: 2024-10-12 02:56:12

leach-matlab的相关文章

leach协议matlab仿真代码

http://www.ilovematlab.cn/thread-177006-1-1.html LEACH協議clear;%清除內存變量 xm=100;%x軸範圍ym=100;%y軸範圍 sink.x=0.5*xm;%基站x軸sink.y=0.5*ym;%基站y軸 n=100;%節點總數 p=0.1;%簇頭概率 E0=0.02;%初始能量ETX=50*0.000000000001;%傳輸能量,每bitERX=50*0.000000000001;%接收能量,每bitEfs=10*0.000000

无线传感网络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.00000000000

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

一.前言 1.在给定WSN的节点数目(100)前提下,节点随机分布,按照LEACH算法,实现每一轮对WSN的分簇.记录前K轮(k=10)时,网络的分簇情况,即每个节点的角色(簇头或簇成员).标记节点之间的关系,标记其所属的簇头. 2.在1的基础上,增加能量有效性控制:给定的所有节点具有相同的能量,考察第一个节点能量耗尽出现在第几轮.节点的能量消耗仅考虑关键的几次通信过程,其他能量消耗不计.通信过程能量消耗规则如下: Setup:簇成元:每次收到候选簇头信息-1,每个候选簇头仅被收集一次:通知簇头

利用MATLAB进行曲线拟合

软件环境:MATLAB2013a 一.多项式拟合 多项式拟合是利用多项式最佳地拟合观测数据,使得在观测数据点处的误差平方和最小. 在MATLAB中,利用函数ployfit和ployval进行多项式拟合. 函数ployfit根据观测数据及用户指定的多项式阶数得到光滑曲线的多项式表示,polyfit的一般调用格式为:P = polyfit(x,y,n).其中x为自变量,y为因变量,n为多项式阶数. polyval的输入可以是标量或矩阵,调用格式为 pv = polyval(p,a) pv = pol

MATLAB检查指定路径中的子文件夹中的文件名中是否带有空格

测试文件夹为: clear;close all;clc; %% %程序实现的功能 %检查指定路径中的子文件夹中的文件名中是否带有空格,并去掉文件名中的空格 %% %程序中用到的之前不清楚的函数如下 %1)strfind(a,b):即找a中是否有b,如果a中有b,则输出b的位置序号.没有输出空数组 %2)isempty(a):判断数组是否为空 %3)strrep(a,b,c):就是把a中所有出现的b换为c %4)movefile(a,b):a移动为b,如C:\test1.jpg移动为C\test2

关于MATLAB处理大数据坐标文件2017620

暑假已至,接下来组内成员将会各回各家,各找各妈,这肯定是对本次大数据比赛是很不利的. 接下来我会把任务分配给组员,当然任务会比起初的时候轻一点,因为我认为本次比赛的目的并不是我要求组员做什么,而是我的组员要求自己做什么! 我们现在主要接触的两门语言: MATLAB语言在数据处理方面很牛,它的画图功能也是杠杠的,尤其是3D画图 Python语言是一门近几年很火的语言,学好它对自己肯定只有益处,它的出生很晚,但是短短十多年,它已经稳居计算机语言前三名.尤其是现在的大数据时代,它的代码不仅简单易懂,而

linux用命令行运行matlab的.mat文件

入m文件所在目录后,运行 $ matlab -nodesktop -nosplash -r matlabfile 只用文件名matlabfile,不能添加.m

对AM信号FFT的matlab仿真

普通调幅波AM的频谱,大信号包络检波频谱分析 u(t)=Ucm(1+macos ?t)cos ?ct ma称为调幅系数 它的频谱由载波,上下边频组成 , 包络检波中二极管截去负半周再用电容低通滤波,可以得到基带信号,那么,截去负半周后的AM信号必定包含基带信号的频谱.我们可以通过matlab来验证. %已知基带信号为1hz,载波为64hz,调制系数ma=0.3,采样频率1024hz,FFT变换区间N为2048 clear; fs=1024; f=1; %1hz基带信号 fc=64; %64hz载

Matlab中使用jython扩展功能

Matlab中面向对象能力并不强,通过使用jython引擎能够对其功能扩展. 1 编辑classpath.txt增加jython.jar 在matlab中输入 which classpath.txt 结果: /usr/local/MATLAB/R2013a/toolbox/local/classpath.txt 编辑该文件,加入 /home/your_user/jython2.5.3/jython.jar 2 又一次启动matlab 3 编写代码測试 import javax.script.In

MATLAB(5)——生成归一化直方图

作者:桂. 时间:2017-03-10  22:13:36 链接:http://www.cnblogs.com/xingshansi/p/6533579.html 声明:欢迎转载,不过记得注明出处哦~ 前言 本文作为:曲线拟合与分布拟合 一文的补充内容,主要介绍MATLAB直方图的绘制,以及对应归一化直方图的实现.全文分三部分简单介绍: 1)直方图(hist)绘制: 2)栅栏图(bar)绘制: 3)归一化直方图实现. 一.直方图(hist) 可以对hist的直方图进行限定,两种途径:个数模式(n