1. 程式人生 > 其它 >MYSQL 服務無法啟動 服務沒有報告任何錯誤 請鍵入 NET HELPMSG 3534 以獲得更多的幫助。

MYSQL 服務無法啟動 服務沒有報告任何錯誤 請鍵入 NET HELPMSG 3534 以獲得更多的幫助。

技術標籤:leach協議matlab感測器網路協議

Leach協議的實現

本片部落格的目的是實現leach協議,體現其中的隨機選取簇頭,50輪次後的能量變化。
1、leach協議的要求;

  1. 隨機生成一圓形無線感測器網路,其中匯聚節點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('節點接受的資料包數量')