基於無線感測器網路的節點分簇演算法matlab模擬

软件算法开发發表於2024-10-02

1.程式功能描述
對感測器網路進行分簇,在分簇過程中考量的有節點能量狀態、節點拓撲位置、孤立節點刪除等條件。與LEACH演算法比較,對比如下幾個方面指標:

1.網路從初始狀態直到首個節點因能量耗盡而死亡的持續時間。

2.顯示了隨著時間的變化,一些節點開始死亡,整個網路的可用率下降的趨勢情況。實驗的終止條件為當網路可用節點下降至 75%時。

3.隨時間變化時網路所有節點能量消耗情況。

2.測試軟體版本以及執行結果展示
MATLAB2022a版本執行


3.核心程式

    STATISTICS.COUNTCHS(ij+1) = CH_num;
    %簇內成員選擇簇頭模組(即簇的形成模組)
    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。

(4) 具有最大權值的未加入簇的強節點宣告為簇頭,利用歐氏距離分簇,重複這一過程,直到所有的節點都被分配入簇。僅當已無強節點剩餘時,弱節點方能擔當簇頭的備選物件。

(5) 若只有單一簇頭而沒有簇成員,則該簇頭認為是異常孤立節點,直接刪除。

(6) 經過一輪的時間段,重複(2)~(6)過程以開始下一輪的分簇。

相關文章