⛄一、 数据融合的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 = 50
0.000000001;
% Transmit Amplifier types
Efs = 100.000000000001;
Emp = 0.0013
0.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(xm
ym/(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-p
mod(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- (ETX
packetLength + 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- (ETX
packetLength + 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- (ETX
packetLength + 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期】相关推荐

  1. 【WSN通信】基于最佳簇半径的无线传感器网络分簇路由算法附matlab代码

    1 内容介绍 无线传感器网络(WirelessSensorNetwork,WSN)是由若干个分布在被监控范围内的传感器节点构成的网络,这些节点以随机或者确定位置分布的形式布置在被监测范围内,可以收集温 ...

  2. 基于最佳簇半径的无线传感器网络分簇路由算法

    文章目录 一.理论基础 1.能耗模型 2.基于最佳簇半径的分簇路由算法 (1)分簇优化 (2)簇间通信 二.仿真实验 三.参考文献 一.理论基础 1.能耗模型 本文采用一阶无线电模型作为能量消耗模型. ...

  3. 【Matlab指纹识别】指纹识别匹配门禁系统【含GUI源码 587期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别匹配门禁系统[含GUI源码 587期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  4. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  5. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  6. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

  7. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  8. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  9. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

最新文章

  1. linux命令行下命令参数前的一横(-)和两横(--)的区别
  2. 环境变量 何时source /etc/profile
  3. 步入DevExpress的使用(VS)
  4. Spring入门第一例
  5. nginx在linux reload报错,linux下安装nginx
  6. 数论四之综合训练——Magic Pairs,Crime Management,Top Secret,组合数问题
  7. 真香系列-JSFinder实用改造
  8. php脚本哪里找,我在哪里可以找到PHP-FPM RC脚本?
  9. 硬件创新需要去理解的点(精炼总结)
  10. PyTorch 1.0 中文文档:torch.utils.checkpoint
  11. 14-4 单任务版爬虫的架构
  12. 遥感数据下载平台汇总
  13. 数据分析初试:“梧桐杯”中国移动大数据应用创新大赛 - 智慧城市赛道
  14. Python 获取中文字拼音首个字母
  15. sonarqube如何导入规则_sonar如何添加自定义JAVA规则
  16. 【EMC基础篇①】噪声是什么
  17. Redis是什么?看这一篇就够了
  18. 互联网三大巨头银行,网商银行、微众银行和新网银行有什么区别?
  19. 了解MSIL汇编和IL汇编评估堆栈
  20. 李开复给大学生的第四封信---大学四年应是这样度过

热门文章

  1. 20分钟降服Linux三剑客老大awk,让人拍案叫绝
  2. 十五天掌握OpenCV——直方图均衡化
  3. ElasticSearch学习:ik分词器
  4. 3D动画的霸主:皮克斯(PIXAR)
  5. CTF学习笔记——SQL注入
  6. Linux深入探索01-stty与键盘信号
  7. opencv给图片添加文字水印转
  8. js简单实现鼠标拖拽功能:盒子可以跟着鼠标移动位置
  9. 软件测试报告怎么写?内部文章一目了然!
  10. 【C++广搜,队列】奇怪的电梯