1.程序功能描述 对传感器网络进行分簇,在分簇过程中考量的有节点能量状态、节点拓扑位置、孤立节点删除等条件。与LEACH算法比较,对比如下几个方面指标:

1.网络从初始状态直到首个节点因能量耗尽而死亡的持续时间。

2.显示了随着时间的变化,一些节点开始死亡,整个网络的可用率下降的趋势情况。实验的终止条件为当网络可用节点下降至 75%时。

3.随时间变化时网络所有节点能量消耗情况。

2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 2.jpeg1.jpeg

3.核心程序

%簇内成员选择簇头模块(即簇的形成模块)
    for c=1:1:Cluster-1
        xr(c)=0;
    end
    yr = 0;
    zr = 0;
    for i=1:1:Node
        if Snode(i).type=='N' && Snode(i).E>0
           if Cluster-1>=1 
              min_dis         = sqrt( (Snode(i).xd-Snode(Node+1).xd)^2 + (Snode(i).yd-Snode(Node+1).yd)^2 );
              min_dis_cluster = 0;
              for c=1:Cluster-1
                  temp = min(min_dis,sqrt((Snode(i).xd-C(c).xd)^2 + (Snode(i).yd-C(c).yd)^2 ));
                  if temp<min_dis
                     min_dis         = temp;
                     min_dis_cluster = c;
                     xr(c)           = xr(c)+1;
                  end
              end
              if(min_dis_cluster~=0)  
                  %簇内节点(发送4000bit数据)能量消耗
                  if min_dis > do
                     Snode(i).E=Snode(i).E - (ETX*(NByte*Byte) + Emp*NByte*Byte*(min_dis * min_dis * min_dis * min_dis)); 
                  end
                  if min_dis <= do
                     Snode(i).E=Snode(i).E -  ETX*(NByte*Byte) + Efs*NByte*Byte*( min_dis * min_dis); 
                  end
                  ch_packet                      = ch_packet+1;
              end
              %簇头的能量消耗
              Snode(i).min_dis               = min_dis;
              Snode(i).min_dis_cluster       = min_dis_cluster;
           else
              yr      = yr+1;
              if min_dis>do
                 Snode(i).E=Snode(i).E-(ETX*(NByte*Byte) + Emp*NByte*Byte*( min_dis * min_dis * min_dis * min_dis)); 
              end
              if min_dis<=do
                 Snode(i).E=Snode(i).E-(ETX*(NByte*Byte) + Efs*NByte*Byte*( min_dis * min_dis)); 
              end
              bs_packet=bs_packet+1;
           end
        end
    end
    
end
 
LIVEs = Node - STATISTICS.DEAD;
ind1  = find(abs(LIVEs - 199)<5);%一个死亡节点
ind2  = find(abs(LIVEs - 150)<5);%存活75%节点
T1    = ind1(1);
T2    = ind2(1);
 
figure
plot(LIVEs,'b');
hold on
plot(T1*ones(1,200),0:199,'r');
hold on
plot(1:T1,199*ones(size([1:T1])),'r');
hold on
plot(T2*ones(1,151),0:150,'r');
hold on
plot(1:T2,150*ones(size([1:T2])),'r');
hold on
xlabel('x(time)');
ylabel('y(live)');
title('首个节点因能量耗尽而死亡的持续时间');
axis([0,500,0,220]);
text(T1,199,['1个死亡节点']);
text(T2,150,['25%死亡节点']);
 
figure
plot(Egc,'b');
xlabel('x(time)');
ylabel('y(consumption)');
title('LEACH的网络能量消耗对比');
axis([0,500,0,800]);
save R0.mat Egc LIVEs T1 T2
12_031m

4.本算法原理 无线传感器网络(Wireless Sensor Networks, WSNs)由大量部署在监测区域内的微型传感器节点组成,通过无线通信方式形成一个多跳的自组织网络系统。其目的是协作地感知、采集和处理网络覆盖区域中被感知对象的信息,并发送给观察者。在WSNs中,节点分簇是一种重要的网络拓扑控制方法,能有效提高网络的可扩展性、能效和生命周期。

4.1节点分簇算法的基本概念

节点分簇是将网络中的节点划分为不同的簇,每个簇由一个簇头(Cluster Head, CH)和多个簇成员(Cluster Members, CMs)组成。簇头负责管理和协调簇内的成员节点,同时负责与其他簇头或基站(Base Station, BS)进行通信。通过分簇,可以实现以下目标:

能量高效:簇头可以进行数据融合,减少传输的数据量,从而节省能量。 可扩展性:簇结构可以适应网络规模的变化。 提高网络生命周期:通过轮换簇头的方式,可以均衡网络中的能量消耗。

4.2节点分簇算法实现步骤 整个网络有一个汇聚节点(Sink节点),能量足够大,相当于基站,其功率足以发送信息至全网节点,Sink节点和簇头信息交换,整个网络共有n个节点。

(1) 在初始状态下,网内各节点向Sink节点发送能量状态信息。

(2) 汇聚节点收到各节点的能量状态信息后,计算平均能量、最大能量,据此标识各节点为强节点或弱节点。若节点i的能量E(i)≥Eav,则标识为强节点,其标识S(i)=1;若E(i)<Eav,则标识为若节点,其标识S(i)=0。

3.png

(4) 具有最大权值的未加入簇的强节点声明为簇头,利用欧氏距离分簇,重复这一过程,直到所有的节点都被分配入簇。仅当已无强节点剩余时,弱节点方能担当簇头的备选对象。

(5) 若只有单一簇头而没有簇成员,则该簇头认为是异常孤立节点,直接删除。

(6) 经过一轮的时间段,重复(2)~(6)过程以开始下一轮的分簇。