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代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。