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


    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
    🍎个人主页:海神之光
    🏆代码获取方式:
    海神之光Matlab王者学习之路—代码获取方式
    ⛳️座右铭:行百里者,半于九十。

    更多Matlab仿真内容点击👇
    Matlab图像处理(进阶版)
    路径规划(Matlab)
    神经网络预测与分类(Matlab)
    优化求解(Matlab)
    语音处理(Matlab)
    信号处理(Matlab)
    车间调度(Matlab)

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

    🍅 仿真咨询
    1 各类智能优化算法改进及应用

    生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

    2 机器学习和深度学习方面
    卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

    3 图像处理方面
    图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

    4 路径规划方面
    旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

    5 无人机应用方面
    无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

    6 无线传感器定位及布局方面
    传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

    7 信号处理方面
    信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

    8 电力系统方面
    微电网优化、无功优化、配电网重构、储能配置

    9 元胞自动机方面
    交通流 人群疏散 病毒扩散 晶体生长

    10 雷达方面
    卡尔曼滤波跟踪、航迹关联、航迹融合

  • 相关阅读:
    基于JAVA水果销售管理网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    操作系统之内存的分配与回收——连续分配内存
    29-Gin框架中间件详解
    ffmpeg编译 Error: operand type mismatch for `shr‘
    数字前面填充0工具类
    专利申请怎样做快速预审?
    Docker-compose
    redis运维(十一) python操作redis
    maven以及配置
    校园网络技术需求分析
  • 原文地址:https://blog.csdn.net/TIQCmatlab/article/details/126716273