【LEACH协议】最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】

news2025/7/11 15:00:50

⛄一、 数据融合的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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合作共赢,就在2022亚马逊云科技re:Invent全球大会

一年一度的科技狂欢盛会&#xff0c;2022年亚马逊云科技re:Invent全球大会即将于北京时间2022年11月29日盛大开启&#xff01;届时全球各领域关注“云计算圈”发展的人都将齐聚一堂&#xff0c;共同聆听5大重磅嘉宾的主题演讲&#xff0c;700前沿技术话题…… 携全球合作伙伴…

APP逆向案例之(三)sign 参数破解

说明&#xff1a;某新闻APP sign 参数 抓包发现包含内容&#xff1a; url: https://124.*.*.*/api/categorynews/lists 参数&#xff1a; 其中 sign 参数是需要变化的否则访问失败&#xff0c;其余都是固定的 page: 3, size: 10, category: -2, from: -1, lng: 116.363…

快收藏!最全GO语言实现设计模式【下】

点个关注&#x1f446;跟腾讯工程师学技术导语| 继上篇【快收藏&#xff01;最全GO语言实现设计模式】&#xff0c;本文继续列出GO语言实现的经典设计模式示例&#xff0c;每个示例都精心设计&#xff0c;力求符合模式结构&#xff0c;可作为日常编码参考&#xff0c;同时一些常…

基于遗传算法的自主式水下潜器路径规划问题附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Pycharm配置python3环境

一、打开pycharm 二、选择preferences 三、选择项目所属Python解释器&#xff0c;点击设置icon&#xff0c;选择“全部显示” 四、选择“添加”&#xff0c;选择最新的python路径进行添加 五、验证是否配置成功 打印输出内容&#xff0c;则配置成功

JMETER也会遇到加密难题,中文乱码也能一并处理

文章目录加密的接口测试导出jar包&#xff0c;放入jmeter的lib/ext扩展目录JMeter输出中文乱码总结加密的接口测试 不管是接口测试还是性能测试&#xff0c;在遇到接口有加密入参的时候&#xff0c;该怎么办&#xff1f; 毫无疑问&#xff0c;放弃自己实现的想法&#xff0c;除…

YOLOv4 NCNN 量化模型和实时推理

又搬来了大佬的啊 膜拜大佬 2021年5月7日&#xff0c;腾讯优图实验室正式推出了ncnn新版本&#xff0c;这一版本的贡献毫无疑问&#xff0c;又是对arm系列的端侧推理一大推动&#xff0c;先剖出nihui大佬博客上关于新版ncnn的优化点&#xff1a;继续保持优秀的接口稳定性和兼…

代码随想录——字符串篇

1、反转字符串 344.反转字符串 力扣题目链接 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数…

必知必会的Java多线程可算是被讲透彻了,让我们一起深入浅出多线程!

Java 提供了多线程编程的内置支持&#xff0c;让我们可以轻松开发多线程应用。 Java 中我们最为熟悉的线程就是 main 线程——主线程。 一个进程可以并发多个线程&#xff0c;每条线程并行执行不同的任务。线程是进程的基本单位&#xff0c;是一个单一顺序的控制流&#xff0c;…

计算机网络——HTTPS协议

目录 1、HTTPS是什么&#xff1f; 2、“加密”是什么&#xff1f; 3、HTTPS的加密机制 3.1、对称加密 3.2、非对称加密 3.3、“中间人问题” 1、HTTPS是什么&#xff1f; HTTPS是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层&#xff0c;进一步来保证…

23-职位分类展示平台响应式网页模板{HTML JS CSS)

扫码或搜索添加文末公众号「搞前端的半夏」&#xff1a;&#x1f357; 回复 ”网站模板“&#xff0c;免费送网站模板&#xff01; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 私信&#x1f4c4; 你还在未HTML网页设计作业头大吗&#xff1f; 你还在为自学前端&#xf…

【Vant Weapp】van-uploader 文件上传

目录 图片上传 图片回填 修改样式 循环多个上传图片 自定义上传的控件 图片上传 未上传样式&#xff1a; 上传限制6张后 &#xff1a; <van-uploader max-count"6" file-list"{{ fileList }}" bind:after-read"afterRead" bind:delete&…

【易忽视】方程两边同时平方会改变方程的解吗?【简洁证明】

问题提出 在做一道题的时候有这样一步&#xff1a;两边平方&#xff0c;最后求解&#xff0c;题很简单&#xff0c;但是这个方法是否能这么用引起了我的好奇。 思考 首先不妨假设一个通用的方程&#xff1a; f(x)g(x)f(x)g(x)f(x)g(x) 然后我们对方程两边平方&#xff1a; …

深度学习基础与线性回归实例

1、机器学习基础-线性回归 介绍&#xff1a;这是一个教育对收入影响的数据&#xff0c;从图像的走势来看&#xff0c;它是具有一个线性关系&#xff0c;即受教育年限越长收入越高&#xff0c;这样我们可以通直线来抽象出它们的关系。 接下来&#xff0c;我们将会介绍一些方法&…

Java中线程的状态

Java中线程的状态操作系统中线程的状态Java中线程的状态线程状态枚举类操作系统中线程的状态 从操作系统层面来看&#xff0c;线程通常有以下五种状态&#xff0c;前三种是线程的基本状态。 【运行态】&#xff1a;进程正处在处理机上运行&#xff0c;在单处理机环境下&#…

【学习笔记39】获取DOM标签对象

获取DOM标签对象一、认识DOM二、获取非常规DOM(html head body)1、HTML2、head3、body三、获取常规DOM&#xff08;一&#xff09;按照类名、标签名和ID名获取标签1、类名(伪数组)2、标签名(伪数组)3、ID名(唯一性)&#xff08;二&#xff09;按照选择器获取标签1、querySelect…

《人月神话》(The Mythical Man-Month)1 看清问题的本质:如果我们想解决问题,就必须试图先去理解它...

第一章 焦油坑&#xff08;The Tar Pit&#xff09;史前史中&#xff0c;没有比巨兽在焦油坑中垂死挣扎的场面更令人震撼的了。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越是猛烈&#xff0c;焦油纠缠得越紧&#xff0c;没有任何猛兽足够强壮或具有足够的技巧&a…

IDEA注释配置程序员信息(带完整截图步骤,超级详细)

1.配置类注释的程序员信息 效果图 配置截图 模板 &#xff08;可根据需要进行位置调整及个数删除&#xff09; /***BelongsProject: ${PROJECT_NAME}*BelongsPackage: ${PACKAGE_NAME}*ClassName ${NAME}*Author: XUXIAN*CreateTime: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINU…

这可能是最权威、最全面的Go语言编码风格规范了!

每种编程语言除了固定的语法之外&#xff0c;都会有属于自己的地道的(idiomatic)写法。其实&#xff0c;自然语言也不例外&#xff0c;你想&#xff0c;你用心想想是不是这样。语言的设计者们希望开发人员都能编写统一风格的地道的代码&#xff0c;这样不仅代码可读性好&#x…

细分图中的可到达节点 : 常规最短路运用题

题目描述 Tag : 「最短路」、「单源最短路」、「Dijkstra」、「SPFA」 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间的新节点数各不相同。 图用…