MYSQL 服務無法啟動 服務沒有報告任何錯誤 請鍵入 NET HELPMSG 3534 以獲得更多的幫助。
阿新 • • 發佈:2020-12-30
Leach協議的實現
本片部落格的目的是實現leach協議,體現其中的隨機選取簇頭,50輪次後的能量變化。
1、leach協議的要求;
- 隨機生成一圓形無線感測器網路,其中匯聚節點Sink位於圓心位置,半徑為R,節點個數為N,節點發射和感知半徑為r。
要求:
(1)網路中節點位置引數儲存,可多次使用;
(2)根據引數,繪出網路拓撲結構圖;
(3)根據實驗1中的網路拓撲及其引數,實現LEACH分簇協議。
要求:在一輪資料收集中標繪出網路拓撲中的簇頭節點;標繪出每個簇頭的簇成員。
主函式
clear; global N;%100個節點 N=50; global R %大圓的半徑 R=50; global r;%小圓的 r=15; global NUM;%在圓內的點 NUM=1; global x;%記錄所有的節點資訊,第1,2維度是位置, %第三維表明該輪是不是簇頭,第4維表示跟隨他的節點有多少,第5維表示他的當前能量 x=zeros(N,5); x(1:5,4)=0; x(1:N,5)=5;%讓所有能量出初始化為5 global y; circle=3; %進行50輪的隨機迴圈 global TT;%令隨機數的閾值為0.8,這樣只有20%的節點是簇頭 TT=0.8; global min; %表示距離當前節點最近的簇頭 min=9999; number=0; %表示距離當前節點最近的簇頭的編號 global p; p=0.2; %---畫出範圍------% alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] %R=2;%半徑 x_range=R*cos(alpha); y_range=R*sin(alpha); plot(x_range,y_range,'-') hold on %---畫出sink------% alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] R1=1.5; %半徑 x_sink=R1*cos(alpha); y_sink=R1*sin(alpha); plot(x_sink,y_sink,'-') text(0,3,'sink') fill(x_sink,y_sink,'r'); axis equal hold on %-----這個迴圈決定隨機的N個點-----% for i=1:N x(NUM,1)=(rand(1)-0.5)*100; x(NUM,2)=(rand(1)-0.5)*100; if (x(NUM,1)^2+x(NUM,2)^2)>2500 continue; end alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] R2=0.5; %半徑 x2=x(NUM,1)+R2*cos(alpha); y2=x(NUM,2)+R2*sin(alpha); plot(x2,y2,'k-') fill(x2,y2,'k'); x3=x(NUM,1)+r*cos(alpha); y3=x(NUM,2)+r*sin(alpha); plot(x3,y3,'color',[0.8 0.8 0.8],'LineWidth',0.1) %畫出每個節點的範圍 NUM=NUM+1; axis equal end for i=1:NUM for j=i+1:NUM if dis(x(i,1),x(i,2),x(j,1),x(j,2))<r %使用自己寫的dis函式求距離 line([x(i,1),x(j,1)],[x(i,2),x(j,2)]); end end end for i=1:NUM y(i).en=5;%初始能量 y(i).num=0;%附屬節點 end pause(2); %--------- 實驗二------% %------然後一下為實現選取簇頭節點------% hold on for k=1:circle if(k~=1) figure('Name',"第"+k+"輪"); init(); end TT=p/(1-p*mod(k,1/p)); t=zeros(NUM,1); for i=1:NUM t(i,1)=rand(1); if(t(i,1)<TT) %該節點是簇頭 x(i,3)=1; alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] R2=1; %半徑 x4=x(i,1)+R2*cos(alpha); y4=x(i,2)+R2*sin(alpha); hold on plot(x4,y4,'y-') fill(x4,y4,'y'); end end for i=1:NUM min=9999; if (x(i,3)==0)%如果這個不是簇頭 for j=1:NUM %遍歷最近的節點 if(x(j,3)==1) distance=dis(x(i,1),x(i,2),x(j,1),x(j,2)); if(distance<min) min=distance; number=j; end end end y(number).num=y(number).num+1; pause(0.1); line([x(i,1),x(number,1)],[x(i,2),x(number,2)],'Color','red','LineWidth',0.5); end end pause(1); %---復原---% end
init()函式
function []=init() clear; global N;%100個節點 global R %大圓的半徑 global r;%小圓的 global NUM;%在圓內的 global x;%記錄所有的節點資訊 global min; %表示距離當前節點最近的簇頭 global p; %---畫出範圍------% alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] %R=2;%半徑 x_range=R*cos(alpha); y_range=R*sin(alpha); plot(x_range,y_range,'-') hold on %---畫出sink------% alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] R1=1.5; %半徑 x_sink=R1*cos(alpha); y_sink=R1*sin(alpha); plot(x_sink,y_sink,'-') text(0,3,'sink') fill(x_sink,y_sink,'r'); axis equal hold on %-----這個迴圈決定隨機的N個點-----% for i=1:NUM alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] R2=0.5; %半徑 x2=x(i,1)+R2*cos(alpha); y2=x(i,2)+R2*sin(alpha); plot(x2,y2,'k-') fill(x2,y2,'k'); x3=x(i,1)+r*cos(alpha); y3=x(i,2)+r*sin(alpha); plot(x3,y3,'color',[0.8 0.8 0.8],'LineWidth',0.1) %畫出每個節點的範圍 axis equal end for i=1:NUM for j=i+1:NUM if dis(x(i,1),x(i,2),x(j,1),x(j,2))<r %使用自己寫的dis函式求距離 line([x(i,1),x(j,1)],[x(i,2),x(j,2)]); end end end pause(2); end
dis()函式
function d=dis(x1,y1,x2,y2)
d=sqrt((x2-x1)^2+(y2-y1)^2);
end
**2. Leach中的能力情況 **
根據實驗2中的分簇,統計LEACH協議允許的結果,假設資料包的大小為L,能量消耗模型為:
要求:在一輪資料收集中,每個節點都產生一個數據包,並匯聚到Sink節點
(1)統計每個節點發送和接收的資料包個數,並直觀顯示出來;
(2)統計每個節點能量消耗,並給出三維能量消耗圖
clear; global N;%100個節點 N=50; global R %大圓的半徑 R=50; global r;%小圓的 r=15; global NUM;%在圓內的點 NUM=1; global x;%記錄所有的節點資訊,第1,2維度是位置,第三維表明該輪是不是簇頭,第4維表示跟隨他的節點有多少,第5維表示他的當前能量 x=zeros(N,5); x(1:5,4)=0; x(1:N,5)=5;%讓所有能量出初始化為5 global y; circle=50; %進行50輪的隨機迴圈 global TT;%令隨機數的閾值為0.8,這樣只有20%的節點是簇頭 TT=0.8; global min; %表示距離當前節點最近的簇頭 min=9999; number=0; %表示距離當前節點最近的簇頭的編號 global p; p=0.2; d0=5;%通訊耗能範圍 %-----這個迴圈決定隨機的N個點-----% for i=1:N x(NUM,1)=(rand(1)-0.5)*100; x(NUM,2)=(rand(1)-0.5)*100; if (x(NUM,1)^2+x(NUM,2)^2)>2500 continue; end alpha=0:pi/50:2*pi;%角度zhuan[0,2*pi] R2=0.5; %半徑 x2=x(NUM,1)+R2*cos(alpha); y2=x(NUM,2)+R2*sin(alpha); x3=x(NUM,1)+r*cos(alpha); y3=x(NUM,2)+r*sin(alpha); NUM=NUM+1; end for i=1:NUM y(i).en=zeros(circle,2);%初始能量 y(i).num=0;%附屬節點 y(i).e=5; for j=1:circle y(i).en(j,1)=j; y(i).en(1,2)=5; end end %y表示能量,其en變數決定了第幾輪的能量 send_number=zeros(NUM,1); receive_number=zeros(NUM,1); %--------- 實驗二------% %------然後一下為實現選取簇頭節點------% for k=1:circle TT=p/(1-p*mod(k,1/p)); t=zeros(NUM,1); for i=1:NUM t(i,1)=rand(1); if(t(i,1)<TT) %該節點是簇頭 x(i,3)=1; end end for i=1:NUM min=9999; if (x(i,3)==0)%如果這個不是簇頭 for j=1:NUM %遍歷最近的節點 if(x(j,3)==1) distance=dis(x(i,1),x(i,2),x(j,1),x(j,2)); if(distance<min) min=distance; number=j; end end end y(number).num=y(number).num+1; %---不同距離的能量消耗% if(distance<d0) y(i).e= y(i).e-(distance/1000)^2;%能量減 y(i).en(k,2)= y(i).e; y(number).e= y(number).e-(distance/1000)^2; y(number).en(k,2)= y(number).e; send_number(i,1)=send_number(i,1)+1; send_number(number,1)=send_number(number,1)+1; receive_number(number,1)=receive_number(number,1)+1; end if(distance>=d0) y(i).e= y(i).e-(distance/1000); y(i).en(k,2)= y(i).e; y(number).e= y(number).e-(distance/1000); y(number).en(k,2)= y(number).e; send_number(i,1)=send_number(i,1)+1; send_number(number,1)=send_number(number,1)+1; receive_number(number,1)=receive_number(number,1)+1; end end if (x(i,3)==1)%如果這個是簇頭 distance=dis(x(i,1),x(i,2),0,0); %---不同距離的能量消耗% if(distance<d0) y(i).e= y(i).e-(distance/1000)^2; y(i).en(k,2)= y(i).e; send_number(i,1)=send_number(i,1)+1; end if(distance>=d0) y(i).e= y(i).e-(distance/1000); y(i).en(k,2)= y(i).e; send_number(i,1)=send_number(i,1)+1; end end end %--------------下面開始討論能量的影響---------% % for i=1:NUM % if (x(i,3)==1)%如果這個是簇頭 % y(i).en(circle,2)= y(i).en(circle-1,2)-0.1*y(number).num; % end % end % y(number).num=0; % %---復原---% end for i=1:NUM in(i,1)=i; end for i=1:circle out(i,1)=i; end for i=1:NUM out1(i,1)=i; sss(i)=y(i).en(circle,2) end plot(in,send_number,'ko-') axis([0 NUM+2 0 80]) xlabel('節點的序號') ylabel('節點發送的資料包數量') figure("NAME","接受的圖") plot(in,receive_number,'ko-') axis([0 NUM+2 0 30]) xlabel('節點的序號') ylabel('節點接受的資料包數量') figure("NAME","能量變化圖") plot(out1,sss,'ko-') axis([0 NUM+2 0 5]) xlabel('節點的序號') ylabel('節點接受的資料包數量') figure("NAME","能量隨輪數變化圖") plot(out,y(1).en(1:circle,2),'ko-',out,y(2).en(1:circle,2),'ro-',out,y(3).en(1:circle,2),'ko-',out,y(1).en(1:circle,2),'bo-') axis([0 NUM+2 0 5]) xlabel('輪次') ylabel('節點接受的資料包數量')