LEACH协议基于matlab最佳簇半径的无线传感器网络分簇路由算法含Matlab源码 2087期
Posted 海神之光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LEACH协议基于matlab最佳簇半径的无线传感器网络分簇路由算法含Matlab源码 2087期相关的知识,希望对你有一定的参考价值。
一、 数据融合的LEACH协议简介
1 基于自适应数据融合的LEACH协议
1.1 基本定义和概念
无线传感器网络中的一个簇可以用一个无向加权全连通图G=(V,E)来表示,V是簇中所有传感器节点的集合,E使簇中两个节点之间可以直接通信。假设顶点v∈V代表簇中的一个传感器节点,边euv=(u,v)∈E代表顶点u和v所对应的传感器节点能够直接通信。
LEACH采用的能量消耗公式是无线传感器网络中通用的一阶无线电模式[7],传感器节点在距离d发送一条长度为l bit消息所消耗的能量为:
传感器节点接收l bit消息所消耗的能量为:
其中:εamp是信号放大器的放大倍数;Eelec是发送电路和接收电路消耗的能量。
MA从节点u迁移到节点v的总能耗为:
式(3)中F(euv)表示数据融合能量。
用一个矩阵wnxn来表示簇内任意节点到其他节点所需要耗费的能量,用Euv来表示边(u,v)的权值,n表示簇内的节点个数,wij(i,j=0,1,2,…,n-1)表示由顶点i到顶点j所要耗费的能量,wii=∞。
设MA由ID、路由算法、数据缓存、处理测量数据代码组成,其中数据缓存中包含部分融合的簇成员节点的测量数据。
2 基于自适应数据融合的LEACH路由协议
基于自适应数据融合的LEACH协议的基本思想是:在LEACH的簇结构形成后,网络的能耗主要体现在感知数据的传输和融合上。
传输能耗与MA的迁移路由有关,计算MA的路由是TSP问题,本文采用最近邻居算法,从簇头出发,在所有的成员节点中寻找权值(传输能量与融合能量之和最小的边对应的节点加入到路径解中,然后再在没有访问过的节点中寻找与当前权值相比最小的节点,加入到路径解中,依次类推,直至所有的成员节点都被访问完,路径解中最后一个节点为簇头节点。
数据融合能够减少传输的数据量,从而减少传输能量,但数据融合本身又能导致能量的开销,因此当节省的传输能量大于数据融合开销时,进行数据融合对于网络节能才是有益的,反之,则会增加网络能耗。由此分析得出,对簇内成员节点应该动态地进行数据融合(自适应数据融合)。当在该节点进行数据融合能节省网络能耗时,就进行数据融合(融合计算开关置1);否则,不进行(融合计算开关置0)。在某一节点进行数据融合后所节省的能量实际是,按照计算好的MA迁移路由,未融合的感知数据从该节点传输到簇头的能量与融合后的数据从该节点传输到簇头节点的能量之差。差值与数据融合的能量进行比较,大于0时,在该节点进行数据融合,否则,不进行。因此簇中某一节点是否进行数据融合还得在迁移路径上后面的节点开关值确定之后才能确定,于是对应于迁移路径上的节点顺序,各节点的融合开关值是逆序计算的。
簇内各成员节点的数据收集和处理过程是:簇头节点按照簇内成员节点的数目,生成一个TDMA时隙表,簇头节点根据MA的迁移路由中各节点的顺序依次为每个成员分配通信时隙,成员节点只能在其特定的时隙内与由簇头创建的MA进行通信,此时簇内其他成员节点关闭通信模块以节省能量。然后,簇头节点的MAE开始创建并派遣MA,MA从簇头出发,按照已经计算好的迁移路由和各节点的融合计算开关值,MA依次迁移到各节点,当融合计算开关为1(0)时,MA携带的数据缓存中的数据与相应节点采集的数据进行(不进行)数据融合,最后MA携带着融合处理后的数据返回簇头,完成一次数据收集。
基于自适应数据融合的LEACH协议的基本思想简述为以下三点:
(1)计算MA的迁移路由(子函数1)
根据最近邻居算法计算MA的迁移路径:从簇头出发,依次取权值(传输能量与融合能量之和)最小的边对应的点加入当前解中直至形成回路解。
(2)计算自适应数据融合开关值(子函数2)
假设通过子函数1求得的MA迁移路由为x0,x1,x2…,xk,xk+1,…,xn-1,x0(其中x0为簇头),未融合的感知数据从某一节点传输到簇头的能量与融合后的数据从该节点传输到簇头节点的能量作差,其差值和数据融合的能量进行比较,大于0时,在该节点进行数据融合,融合计算开关置1;否则,不进行数据融合,融合计算开关置0。由于节点xk必须知道它后面的节点xk+1,…,xn-1的融合计算开关值,才能计算出它自己的,故逆序求解In-1,In-2,…,I2,I1,亦即得出该簇内哪些节点进行融合计算,哪些不进行。
(3)进行簇内所有成员节点的数据收集(主函数)
调用子函数1,求出MA的迁移路径x0,x1,x2,…,xk,xk+1,…,xn-1,x0;
调用子函数2,根据子函数1的迁移路径求出簇内各节点的融合计算开关值In-1,In-2,…,I2,I1;
簇头节点派遣MA,收集节点xi(i=1,2,…,n-1)的感知数据,根据Ii=1(或0)的值融合(或不融合)节点xi的感知数据与MA数据缓存中的数据,最后所有的数据汇总至簇头节点。
二、部分源代码
clc;
clear;
close all
%% 1.初始参数设定模块
%.传感器节点区域界限(单位 m)
xm = 200;
ym = 200;
% (1)汇聚节坐标给定
sink.x = 0;
sink.y = 0;
% 区域内传器节数
n = 200;
% 簇头优化比例(当选簇头的概率)
p = 0.1;
% 能量模型(单位 J)
% 初始化能量模型
Eo = 0.5;
% Eelec=Etx=Erx
ETX = 500.000000001;
ERX = 500.000000001;
% Transmit Amplifier types
Efs = 100.000000000001;
Emp = 0.00130.000000000001;
% Data Aggregation Energy
EDA = 50.000000001;
% 最大循环次数
rmax = 2000;
% 算出参数 do
do = sqrt(Efs/Emp);
% 包大小(单位 bit)
packetLength = 4000; % 数据包大小
% 参数
alpha = 0.5; % 距离参数
beta = 0.5; % 能量参数
% 感知半径
R = sqrt(xmym/(pinp));
%% 2.无线传感器网络模型产生模块
% 构建无线传感器网络,在区域内均匀投放100个节点,并画出图形
for i = 1:n
S1(i).xd = rand(1,1)*xm;
S1(i).yd = rand(1,1)*ym;
S2(i).xd = S1(i).xd;
S2(i).yd = S1(i).yd;
S3(i).xd = S2(i).xd;
S3(i).yd = S2(i).yd;
S4(i).xd = S3(i).xd;
S4(i).yd = S3(i).yd;
S1(i).G = 0;
S2(i).G = 0;
S3(i).G = 0;
S4(i).G = 0;
S1(i).E = Eo;
S2(i).E = Eo;
S3(i).E = Eo;
S4(i).E = Eo;
S3(i).d = sqrt((S3(i).xd-sink.x)2+(S3(i).yd-sink.y)2);
S4(i).D = S3(i).d;
% initially there are no cluster heads only nodes
S1(i).type = ‘N’;
S2(i).type = ‘N’;
S3(i).type = ‘N’;
S4(i).type = ‘N’;
end
S1(n+1).xd = sink.x;
S1(n+1).yd = sink.y;
S2(n+1).xd = sink.x;
S2(n+1).yd = sink.y;
S3(n+1).xd = sink.x;
S3(n+1).yd = sink.y;
S4(n+1).xd = sink.x;
S4(n+1).yd = sink.y;
%%%%%%%%%%%%%%%%%%%%LEACH%%%%%%%%%%%%%%%%%%
%% 3.网络运行模块
% 簇头节点数
countCHs = 0;
cluster = 1;% 此定义的目的仅仅是给定一个1开始的下标参数,真正的簇头数应该还减去1
flag_first_dead = 0;
flag_teenth_dead = 0;
flag_all_dead = 0;
% 死亡节点数
dead = 0;
first_dead1 = 0;
teenth_dead1 = 0;
all_dead1 = 0;
% 活动节点数
alive = n;
% 传输到基站和簇头的比特计数器
packets_TO_BS = 0;
packets_TO_CH = 0;
% (1)循环模式设定
for r = 0:rmax % 该 for 循环将下面的所有程序包括在内,直到最后 end 才结束循环
r
% 每过一个轮转周期(本程序为10次)使各节点的S(i).G参数(该参数用于后面的簇选举,在该轮转周期内已当选过簇头的节点不能再当选)恢复为零
if mod(r, round(1/p)) == 0
for i = 1:n
S1(i).G = 0;
end
end
% (2)死亡节点检查模块
dead = 0;
Eavg = 0;
for i = 1:n
% 检查有无死亡节点
if S1(i).E <= 0
dead = dead+1;
% (3)第一个死亡节点的产生时间(用轮次表示)
% 第一个节点死亡时间
if dead == 1
if flag_first_dead == 0
first_dead1 = r;
flag_first_dead = 1;
end
end
% 10%的节点死亡时间
if dead == 0.1n
if flag_teenth_dead ==0
teenth_dead1 = r;
flag_teenth_dead = 1;
end
end
if dead == n
if flag_all_dead == 0
all_dead1 = r;
flag_all_dead = 1;
end
end
else
Eavg = Eavg + S1(i).E;
S1(i).type = ‘N’;
end
end
STATISTICS.ENERGY1(r+1) = Eavg;
STATISTICS.DEAD1(r+1) = dead;
STATISTICS.ALIVE1(r+1) = alive-dead;
% (4)簇头选举模块
countCHs = 0;
cluster = 1;
for i = 1:n
if S1(i).E > 0
temp_rand=rand;
if S1(i).G <= 0
% 簇头的选举,当选的簇头会把各种相关信存入下面程序所给定的变量中
if temp_rand <= p/(1-pmod(r,round(1/p)))
countCHs = countCHs+1;
packets_TO_BS = packets_TO_BS+1;
S1(i).type = ‘C’;
S1(i).G = round(1/p)-1;
C(cluster).xd = S1(i).xd;
C(cluster).yd = S1(i).yd;
distance = sqrt((S1(i).xd-S1(n+1).xd)^2 + (S1(i).yd-S1(n+1).yd)^2);
C(cluster).distance = distance;
C(cluster).id = i;
cluster = cluster+1;
% 计算簇头发送packetLength bit数据到基站的能量消耗(这里应是所有节点包括簇头每一轮发送packetLength bit数据)
if distance > do
S1(i).E = S1(i).E- ((ETX+EDA)packetLength + EmppacketLengthdistance^4);
else
S1(i).E=S1(i).E- ((ETX+EDA)packetLength + EfspacketLengthdistance^2);
end
end
end
end
end
STATISTICS.COUNTCHS1(r+1) = countCHs;
% (5)簇内成员选择簇头模块(即簇的形成模块)
% 簇内成员对簇头的选择(即簇的形成)算法
for i = 1:n
if S1(i).type == ‘N’ && S1(i).E > 0
if cluster-1 >= 1
min_dis = inf;
min_dis_cluster = 0;
for c = 1:cluster-1
temp = min(min_dis, sqrt((S1(i).xd-C©.xd)^2 + (S1(i).yd-C©.yd)^2));
if temp < min_dis
min_dis = temp;
min_dis_cluster = c;
end
end
if min_dis_cluster ~= 0
% 簇内节点(发送packetLength bit数据)能量消耗
if min_dis > do
S1(i).E=S1(i).E- (ETXpacketLength + EmppacketLengthmin_dis^4);
else
S1(i).E = S1(i).E- (ETXpacketLength + EfspacketLengthmin_dis^2);
end
% 簇头(接收和融合这一簇内节点packetLength bit数据)的能量消耗
S1(C(min_dis_cluster).id).E = S1(C(min_dis_cluster).id).E- ((ERX + EDA)packetLength);
packets_TO_CH = packets_TO_CH+1;
else
if min_dis > do
S1(i).E = S1(i).E- (ETXpacketLength + EmppacketLengthmin_dis^4);
else
S1(i).E = S1(i).E- (ETXpacketLength + EfspacketLengthmin_dis^2);
end
packets_TO_BS = packets_TO_BS+1;
end
S1(i).min_dis = min_dis;
S1(i).min_dis_cluster = min_dis_cluster;
else
min_dis = sqrt((S1(i).xd-S1(n+1).xd)^2 + (S1(i).yd-S1(n+1).yd)^2);
if min_dis > do
S1(i).E = S1(i).E- (ETXpacketLength + EmppacketLengthmin_dis^4);
else
S1(i).E = S1(i).E- (ETXpacketLength + EfspacketLength*min_dis^2);
end
packets_TO_BS = packets_TO_BS+1;
end
end
end
STATISTICS.PACKETS_TO_CH1(r+1) = packets_TO_CH;
STATISTICS.PACKETS_TO_BS1(r+1) = packets_TO_BS;
end
%%%%%%%%%%%%%%%%%%%%LEACH_E%%%%%%%%%%%%%%%%%%
% 簇头节点数
countCHs = 0;
cluster = 1;% 此定义的目的仅仅是给定一个1开始的下标参数,真正的簇头数应该还减去1
flag_first_dead = 0;
flag_teenth_dead = 0;
flag_all_dead = 0;
% 死亡节点数
dead = 0;
first_dead2 = 0;
teenth_dead2 = 0;
all_dead2 = 0;
% 活动节点数
alive = n;
% 传输到基站和簇头的比特计数器
packets_TO_BS = 0;
packets_TO_CH = 0;
% (1)循环模式设定
for r = 0:rmax % 该 for 循环将下面的所有程序包括在内,直到最后 end 才结束循环
r
% 每过一个轮转周期(本程序为10次)使各节点的S(i).G参数(该参数用于后面的簇选举,在该轮转周期内已当选过簇头的节点不能再当选)恢复为零
if mod(r, round(1/p)) == 0
for i = 1:n
S2(i).G = 0;
end
end
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 王培东,袁召兰,王瑜.基于自适应数据融合的LEACH路由协议[J].电子技术应用. 2011,37(07)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
以上是关于LEACH协议基于matlab最佳簇半径的无线传感器网络分簇路由算法含Matlab源码 2087期的主要内容,如果未能解决你的问题,请参考以下文章
WSN通信基于Matlab LEACH融合树多跳传输协议含Matlab源码 1897期