【路由优化】基于生物地理学优化的 HWSN 节能聚类协议附matlab代码

该文探讨了无线传感器网络(WSN)中如何通过优化聚类协议来降低能量消耗,延长网络寿命。研究提出了一种新的聚类协议,该协议受到生物地理学启发,实现高效的簇头选举。仿真结果显示,与现有协议相比,该方法能更有效地减少能量消耗,从而增加网络稳定期和生命周期。文章涉及的主要技术包括路由协议设计、能量效率优化和无线通信中的能量消耗模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 内容介绍

无线传感器 网络 WSN 由一组 传感器 节点 以 自组织方 式构成。每个节点兼备路由器和主机两种功能,不仅要执行感知、传输数据等应用任务,还要参与路由发现、维护以及网络构建等任务。WSN中节点一般采用电池供电,节点大部分情况下被布置在无人看守的环境中,电池不能补充和更换,节点能量受限。在这种情况下要延长网络生存时间就必须降低节点工作时能量消耗 ,试验表明节点能量主要消耗在通信模块上。无线通信中的传输数据的能量消耗与有效半径的2—4次方相关 ,减小节点的有效传输半径可以降低节点能量消耗。另外 WSN还有着不同于传统无线 网络的其他特征:首先WSN中节点数量庞大,传统的以 IP地址为基础的路 由协议不适合 WSN;其次 WSN的应用背景主要是多个源节点感知数据,然后将感知数据传给 目的节点 Sink,不要求建立网络中任意两点之间的路由路径,这给设计高效 的路由协议带来了可能性。因此采用合适的、高效的路由协议是降低无线传感器网络整体能耗的关键。这就需要我们设计一个满足需要的高效的路由协议 。

节能是在恶劣环境下实施的无线传感器网络的突出要求。本文研究了使用基于生物地理学的优化启发的新型聚类协议的高效簇头选举对无线传感器网络能量利用率的降低。仿真结果表明,与其他基于进化的聚类协议(如稳定选举协议(SEP)、进化路由协议(ERP)和智能层次聚类路由(IHCR))相比,所提出的方法延长了整个网络的生命周期和稳定期。

2 仿真代码


function [Chromosome,Fitness,NumofCH,Totenergy]=CalculateFitness(PopulationSize,NumberOfNodes,Chromosome,Fitness,Sensor,Sink,ETX,ERX,Efs,Emp,EDA,do,NumofCH,Totenergy)

for IndividualCounter = 1:1:PopulationSize
    
    CHcount = 0;
    for SensorCounter = 1:1:NumberOfNodes 
         %Obtaining Total Direct Distance
        if(Chromosome(IndividualCounter,SensorCounter) ~= -1)
            if(Chromosome(IndividualCounter,SensorCounter) == 1)
                CHcount = CHcount + 1;
                TempCH(CHcount).X = Sensor(SensorCounter).X;
                TempCH(CHcount).Y = Sensor(SensorCounter).Y;
                TempCH(CHcount).ID = SensorCounter;
                TempCH(CHcount).CHDistance = 0;
                TempCH(CHcount).CH2BSDist =sqrt((Sensor(SensorCounter).X - Sink.X)^2 + (Sensor(SensorCounter).Y - Sink.Y)^2 );
                TempCH(CHcount).IndividualClustDist = 0;
           end;
        end;
        TempSensor(SensorCounter).AggEnergy = 0;
        TempSensor(SensorCounter).SendEnergy = 0;
    end;
    
%Obtaining J2 (Compactness)(Distance NCH to CH)
    Compactness = 0;
    Energy_NCH2CH = 0;
    Energy_Aggregation = 0;
    Transmissions = 0;
    for SensorCounter = 1:1:NumberOfNodes
        if(Chromosome(IndividualCounter,SensorCounter) == 0)  
            MinDistance = 100000000;
            
            ClusterOfMinDistance = 0;
            ID = 0;
            for TempCHCount = 1:1:CHcount
                temp = sqrt((Sensor(SensorCounter).X - TempCH(TempCHCount).X)^2 + (Sensor(SensorCounter).Y - TempCH(TempCHCount).Y)^2 );
                if (temp < MinDistance)
                MinDistance = temp;
                ClusterOfMinDistance = TempCHCount;
                 ID = TempCH(TempCHCount).ID;
                end;    
            end; 
                Compactness = Compactness + MinDistance; 
            
            if (CHcount>0)
              TempCH(ClusterOfMinDistance).CHDistance =  TempCH(ClusterOfMinDistance).CHDistance+MinDistance;
              
            end;    
             if(CHcount > 0)
                if (MinDistance > do)
                    TempEnergy_NCH2CH = ( ETX*(4000) + Emp*4000*( MinDistance^4));
                    Energy_NCH2CH = Energy_NCH2CH + TempEnergy_NCH2CH;
                else % (MinDistance <= do)
                    TempEnergy_NCH2CH = ( ETX*(4000) + Efs*4000*( MinDistance^2));
                    Energy_NCH2CH = Energy_NCH2CH + TempEnergy_NCH2CH;
                end; 
                if(Sensor(SensorCounter).Energy - TempEnergy_NCH2CH < 0)
                    Transmissions = Transmissions + 1;
                end;
               if(MinDistance > 0)
             %  if((CHcount > 0) && (MinDistance > 0))
                    Energy_Aggregation = Energy_Aggregation + ( (ERX + EDA)*4000 );
                    TempSensor(ID).AggEnergy = TempSensor(ID).AggEnergy + ( (ERX + EDA)*4000 );
                end;
            end;
        end;     
    end;
    
    
 
        
    %Obtaining CH Distance (Distance CH to Sink)
    CHDistance = 0;
    Energy_CH2Sink = 0;
   
    for SensorCounter = 1:1:NumberOfNodes 
        if(Chromosome(IndividualCounter,SensorCounter) == 1)
            Distance2BS = sqrt((Sensor(SensorCounter).X - Sink.X)^2 + (Sensor(SensorCounter).Y - Sink.Y)^2 );
            CHDistance = CHDistance + Distance2BS;
            if (Distance2BS > do)
                Energy_CH2Sink = Energy_CH2Sink + ((ETX+EDA)*(4000) + Emp*4000 *( Distance2BS ^ 4));
                TempSensor(SensorCounter).SendEnergy = ((ETX+EDA)*(4000) + Emp*4000 *( Distance2BS ^ 4));
            else
                Energy_CH2Sink = Energy_CH2Sink + ((ETX+EDA)*(4000)  + Efs*4000 *( Distance2BS ^ 2 )); 
                TempSensor(SensorCounter).SendEnergy = ((ETX+EDA)*(4000)  + Efs*4000 *( Distance2BS ^ 2 ));
            end;
            if(Sensor(SensorCounter).Energy - (TempSensor(SensorCounter).SendEnergy + TempSensor(SensorCounter).AggEnergy) < 0)
                Transmissions = Transmissions + 1;
            end;
        end;  
    end;
    

    
    TempCHDistanceCounter = 1;
    if (CHcount <= 1)
        Separation = 1;
    else
        for i = 1:1:CHcount - 1
            for j = i + 1:1:CHcount
                TempCHDistance(TempCHDistanceCounter) = sqrt((TempCH(i).X - TempCH(j).X)^2 + (TempCH(i).Y - TempCH(j).Y)^2 );
                TempCHDistanceCounter = TempCHDistanceCounter + 1;
            end;
        end;
       Separation = min(TempCHDistance);
    end
    %Obtaining Total Energy
    TotalEnergy = Energy_NCH2CH + Energy_Aggregation + Energy_CH2Sink;
    
%Fitness Calculation
Fitness(IndividualCounter) = Compactness / Separation ;%+ CHcount;
     NumofCH(IndividualCounter) = CHcount;
     Totenergy(IndividualCounter) =  TotalEnergy;
       
end;


function [STATISTICS, Sensor] = GetStatisticsOfWSN(Sensor, Sink, NumberOfNodes, ...
                                                   STATISTICS,StatisticCounter, ...
                                                   RoundCounter)
% disp('GetStatisticsOfWSN');
%Counter For Dead nodes ,dead advanced nodes, and dead normal nodes
STATISTICS(StatisticCounter).DeadNodes = 0;
STATISTICS(StatisticCounter).DeadAdvancedNodes = 0;
STATISTICS(StatisticCounter).DeadNormalNodes = 0;

%Number of Cluster Heads:Normal Cluster Heads,Advanced Cluster Heads
STATISTICS(StatisticCounter).ClusterHeads = 0;
STATISTICS(StatisticCounter).NormalClusterHeads = 0;
STATISTICS(StatisticCounter).AdvancedClusterHeads = 0;

%counter for packets transmitted to Bases Station and to Cluster Heads 
%per round
STATISTICS(StatisticCounter).PACKETS_TO_CH = 0;
STATISTICS(StatisticCounter).PACKETS_TO_BS = 0;

%Counter For Total Dissipated and Remaining Energy
STATISTICS(StatisticCounter).DissipationEnergy = 0;
STATISTICS(StatisticCounter).RemainingEnergy = 0;

for SensorCounter = 1:NumberOfNodes
    %checking if there is a dead node
    if (Sensor(SensorCounter).Energy <= 0)
        STATISTICS(StatisticCounter).DeadNodes = STATISTICS(StatisticCounter).DeadNodes + 1;
        if (Sensor(SensorCounter).EnergyType == 1)
            plot (Sensor(SensorCounter).X, Sensor(SensorCounter).Y, '+r');%Dead Advanced Nodes

            STATISTICS(StatisticCounter).DeadAdvancedNodes = STATISTICS(StatisticCounter).DeadAdvancedNodes + 1;
        end;
        if (Sensor(SensorCounter).EnergyType == 0)
            plot (Sensor(SensorCounter).X, Sensor(SensorCounter).Y, 'vr');%Dead Normal Nodes

            STATISTICS(StatisticCounter).DeadNormalNodes = STATISTICS(StatisticCounter).DeadNormalNodes + 1;
        end;
        hold on; 
    else  % (Sensor(SensorCounter).Energy > 0)
        Sensor(SensorCounter).Type = 'N';
        if (Sensor(SensorCounter).EnergyType == 1)
            plot (Sensor(SensorCounter).X, Sensor(SensorCounter).Y, '+k');%Alive Advanced Node
        else % if (Sensor(SensorCounter).EnergyType == 0)
            plot (Sensor(SensorCounter).X, Sensor(SensorCounter).Y, '^g');%Alive Normal Node
        end;
        hold on; 
    end;
    
end;
 plot(Sink.X,Sink.Y,'ob','MarkerEdgeColor','k','MarkerFaceColor','b','MarkerSize',6);%Sink
 hold on;
 

function [Chromosome, indices,Fitness] = PopSort(Chromosome,Fitness)
    popsize = size(Chromosome,1);
    NumberOfNodes=100;
    Cost = zeros(1, popsize);
    indices = zeros(1, popsize);
    for i = 1 : popsize
        Cost(i) = Fitness(i);
    end
    [Cost, indices] = sort(Cost, 2, 'ascend');
    Chroms = zeros(popsize, NumberOfNodes);
    for i = 1 : popsize
        Chroms(i, :) = Chromosome(indices(i),:);
    end
    for i = 1 : popsize
        Chromosome(i,:) = Chroms(i, :);
        Fitness(i,:) = Cost(i);
    end


end

3 运行结果

4 参考文献

[1]吴斌, 林锦国, 崔志勇. 生物地理学优化算法中迁移算子的比较[J]. 计算机工程与应用, 2012, 48(25):4.

[2]秦烁. 生物地理学优化算法及其在动态车间调度中的应用研究. Diss. 兰州理工大学, 2019.

[3]张长宏, 昝风彪, 唐明虎. 基于能量优化分簇的WSN路由协议[J]. 青海大学学报:自然科学版, 2012(4):5.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值