当前位置: 首页 > news >正文

【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 = 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 + EfspacketLength
distance^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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

相关文章:

  • PDA手持机轻松解决库存盘点难题支持一维二维码扫描
  • vscode启动不了,折腾了半天发现已经不支持win7
  • 【智能优化算法-麻雀搜索算法】基于萤火虫结合麻雀搜索算法求解单目标优化问题附matlab代码
  • 22-09-04 西安 谷粒商城(01)MySQL主从复制、MyCat读写分离、MyCat分库分表
  • 猿创征文|Python3,10分钟写了一个WIFI 万(破) 能 (解) 钥 (神) 匙 (器),YYDS。
  • 【每日一练】图解:链表内指定区间反转
  • Java 进阶多线程(一)
  • Softing物联网(IoT)方案之OT/IT数据集成
  • 第13讲:DCL类型的SQL语句之用户管理
  • Python实战回归模型-消费者人群画像-信用智能评分(基于中国移动用户数据)
  • 【尚硅谷】MyBatis
  • 用动图详细讲解——栈
  • Spring事务传播性
  • Pinia不就是Vuex5?
  • Scrapy + selenium + 超级鹰验证码识别爬取网站
  • [PHP内核探索]PHP中的哈希表
  • 时间复杂度分析经典问题——最大子序列和
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • flask接收请求并推入栈
  • MD5加密原理解析及OC版原理实现
  • Odoo domain写法及运用
  • PermissionScope Swift4 兼容问题
  • PHP的Ev教程三(Periodic watcher)
  • 聊聊directory traversal attack
  • 如何在 Tornado 中实现 Middleware
  • 深入浏览器事件循环的本质
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ![CDATA[ ]] 是什么东东
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (MATLAB)第五章-矩阵运算
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二)斐波那契Fabonacci函数
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (九)c52学习之旅-定时器
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • .form文件_SSM框架文件上传篇
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 反射的使用
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • /etc/sudoer文件配置简析
  • ?php echo ?,?php echo Hello world!;?
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [AX]AX2012 R2 出差申请和支出报告
  • [BJDCTF2020]The mystery of ip1