其他分享
首页 > 其他分享> > MATLAB-泛洪(Flooding)协议仿真

MATLAB-泛洪(Flooding)协议仿真

作者:互联网

MATLAB-无线传感器网络泛洪(Flooding)协议仿真

总结

参考文档链接
1.无线传感器网络flooding路由协议的MATLAB仿真论文
2.原代码出处_MATLAB实现洪泛路由的模拟


若复制的代码不能运行,联系我;
或在这个链接里自行下载
链接:https://pan.baidu.com/s/1bXKE7QWY5JNycOWpiBfa7g
提取码:zkrt

一.界面介绍

1.主窗口:含五个按钮:开始绘图按钮、所有邻居节点的Flooding按钮、5个邻居节点的Flooding按钮、3个邻居节点的Flooding按钮、点击运行效率对比按钮

在这里插入图片描述

2.绘图窗口

在这里插入图片描述

3.绘制路线窗口,点上标的76543210代表跳数,空心点代表寻找过的邻居节点

在这里插入图片描述
所有邻居节点的Flooding
在这里插入图片描述
5个邻居节点的Flooding
在这里插入图片描述
3个邻居节点的Flooding
在这里插入图片描述
4.查找路线节点运行效率曲线对比窗口

在这里插入图片描述

二、 Flooding算法工作流程图

在这里插入图片描述

三、 .m文件

flooding.m



%% 界面介绍

% 1.主窗口:含五个按钮:开始绘图按钮、所有邻居节点的Flooding按钮、

%   5个邻居节点的Flooding按钮、3个邻居节点的Flooding按钮、点击运行效率对比按钮

% 2.绘图窗口

% 3.绘制路线窗口,点上标的76543210代表跳数

% 4.查找路线节点运行效率曲线对比窗口



%% 操作说明:

% 1.首先点击开始绘图按钮,创建图像;

% 2.点击所有邻居节点的Flooding按钮,绘制路线,线段颜色为红色;

% 3.点击5个邻居节点的Flooding按钮,绘制路线,线段颜色为绿色;

% 4.点击3个邻居节点的Flooding按钮,绘制路线,线段颜色为蓝色;

% 5.经过以上的步骤,我们已经得到了三个算法的一条路线及一个查找路线节点的时间,后即可关闭绘制的窗口,

%   重新绘制新的路线、计算新的查找路线节点的时间,重复1、2、3、4步骤10次,获取每个算法10个不同的查找路线节点的时间

%   (因为在运行效率对比按钮那我用了10个数据点去绘制对比曲线,所以,当某一个算法的数据点不足10个或大于10个时,

%      
都无法绘制曲线成功)

%   (命令行窗口会有节点序号、查找路线节点的时间的记录反馈);

%   (当数据点不足10个时,接着画;大于10个时,只能关闭程序,重新画了(因为我没有提供删除时间的功能));

% 6.当集满三个算法的时间后,即可点击运行效率对比按钮,查看三个算法的查找路线节点时间曲线对比图。

%   (注:有时候没有返回值,是因为没有找到路线,关掉窗口,重新绘制个图,重新找)



%% 主程序

function flooding

%用于存放三个算法的运行事件

global flooding1;

global flooding5;

global flooding3;

flooding1=[];

flooding5=[];

flooding3=[];

%用于标记邻居节点数,0代表所有个,5代表5个,3代表3个

num1=0;

num2=5;

num3=3;

%创建窗口

fig = uifigure;   

% 创建按钮

%所有制邻居节点的Flooding按钮

btn1 = uibutton(fig,'push',...

              'Position',[120, 330, 200,
34],...

               'Text', '所有制邻居节点的Flooding',...

              'ButtonPushedFcn', @(btn1,event)
plotButtonPushed1(btn1,num1));

%5个邻居节点的Flooding按钮           

btn2 = uibutton(fig,'push',...

              'Position',[120, 230, 200,
34],...

               'Text', '5个邻居节点的Flooding',...

              'ButtonPushedFcn', @(btn2,event)
plotButtonPushed2(btn2,num2));

%5个邻居节点的Flooding按钮                   

btn3 = uibutton(fig,'push',...

              'Position',[120, 130, 200,
34],...

               'Text', '3个限制邻居节点的Flooding',...

              'ButtonPushedFcn', @(btn3,event)
plotButtonPushed3(btn3,num3));

%三个算法的运行效率对比            

btn4 = uibutton(fig,'push',...

              'Position',[230, 30, 200,
34],...

               'Text', '运行效率对比',...

              'ButtonPushedFcn', @(btn4,event)
plotButtonPushed4(btn4)); 

%开始绘图按钮

btn5 = uibutton(fig,'push',...

       
     'Position',[20, 30, 200,
34],...

               'Text', '开始绘图',...

              'ButtonPushedFcn', @(btn5,event)
plotButtonPushed5(btn5)); 



end



function plotButtonPushed1(btn1,num1)

global flooding1;

global srcx;

global destx;

global xLocation;   

global yLocation; 

global route;%记录传输路径

global radius;%作用范围

global distMatrix;

global numOfNodes;

global success;%标记是否成功访问到目的节点

success=0;

global visited;%标记节点是否被访问过

visited=zeros(1,100);%初始时都未被访问

route=[];

global neighborNodes;%记录传输路径

neighborNodes=[];

%% 建立距离矩阵







distMatrix = zeros(numOfNodes);



for i=1:numOfNodes



  
for j=i+1:numOfNodes



      
distMatrix(i,j)=distance([xLocation(i),yLocation(i)],[xLocation(j),yLocation(j)]);



  
end



  
distMatrix(i,i)=10;%排除自身节点



end



distMatrix = distMatrix+distMatrix';





%% 开始查找

% clock用于计算查找节点的时间,ttl是条数

ttl=7;

t1=clock;

DFS_num(srcx,ttl,num1);

t2=clock;

%将记录下来的时间放入flooding1

i=length(flooding1)+1;

flooding1(i)=etime(t2,t1);

disp('所有邻居节点查找路线节点所需的时间为:');

disp(flooding1);

%% 画出传输路径图



if(ismember(destx,route))



 
disp('传输成功')

 
j=length(route);



  
while(j~=1)



      
for i=1:j-1



          
if(distMatrix(route(i),route(j))<=radius&&i~=j-1)



               route(i+1:1:j-1)=[];

               

        


          
break;



          
end



      
end



      
j=i;

    


  
end



else



  
route=[];



  
disp('传输失败');



end

%绘制路线

plot(xLocation(route),yLocation(route),'o-r','Markerfacecolor','r','MarkerSize',3);

disp('所有邻居节点路线上的节点序号为:');

disp(route)



end



% Create the function for the
ButtonPushedFcn callback

function plotButtonPushed2(btn2,num2)

global flooding5;

global srcx;

global destx;

global xLocation;   

global yLocation; 

global route;%记录传输路径

global numOfNodes;

global distMatrix;

global radius;%作用范围

global success;%标记是否成功访问到目的节点

success=0;

global visited;%标记节点是否被访问过

visited=zeros(1,100);%初始时都未被访问

route=[];

global neighborNodes;%记录传输路径

neighborNodes=[];

%% 建立距离矩阵







distMatrix = zeros(numOfNodes);



for i=1:numOfNodes



  
for j=i+1:numOfNodes



      
distMatrix(i,j)=distance([xLocation(i),yLocation(i)],[xLocation(j),yLocation(j)]);



  
end



  
distMatrix(i,i)=10;%排除自身节点



end



distMatrix = distMatrix+distMatrix';

%% 开始查找

% clock用于计算查找节点的时间,ttl是条数

t11=clock;

num=5;

ttl=7;

DFS_num(srcx,ttl,num2);

%将记录下来的时间放入flooding5

t22=clock;

i=length(flooding5)+1;

flooding5(i)=etime(t22,t11);

disp('5个邻居节点查找路线节点所需的时间为:');

disp(flooding5);

%% 画出传输路径图



if(ismember(destx,route))



 
disp('传输成功')

 
j=length(route);



  
while(j~=1)



      
for i=1:j-1



          
if(distMatrix(route(i),route(j))<=radius&&i~=j-1)



               route(i+1:1:j-1)=[];

               

        


          
break;



          
end



      
end



      
j=i;

    


  
end



else



  
route=[];



  
disp('传输失败');



end

%绘制路线图

plot(xLocation(route),yLocation(route),'.-g','Markerfacecolor','r','MarkerSize',3);

disp('5个邻居节点路线上的节点序号为:');

disp(route)



end

function plotButtonPushed3(btn3,num3)

global flooding3;

global srcx;

global destx;

global xLocation;   

global yLocation; 

global route;%记录传输路径

global numOfNodes;

global distMatrix;

global radius;%作用范围

global success;%标记是否成功访问到目的节点

success=0;

global visited;%标记节点是否被访问过

visited=zeros(1,100);%初始时都未被访问

route=[];

global neighborNodes;%记录传输路径

neighborNodes=[];

%% 建立距离矩阵







distMatrix = zeros(numOfNodes);



for i=1:numOfNodes



  
for j=i+1:numOfNodes



      
distMatrix(i,j)=distance([xLocation(i),yLocation(i)],[xLocation(j),yLocation(j)]);



  
end



  
distMatrix(i,i)=10;%排除自身节点



end



distMatrix = distMatrix+distMatrix';

%% 开始查找

% clock用于计算查找节点的时间,ttl是条数

t111=clock;

num=3;

ttl=7;

DFS_num(srcx,ttl,num3);

%将记录下来的时间放入flooding3

t222=clock;

i=length(flooding3)+1;

flooding3(i)=etime(t222,t111);

disp('3个邻居节点查找路线节点所需的时间为:');

disp(flooding3);

%% 画出传输路径图



if(ismember(destx,route))



 
disp('传输成功')

 
j=length(route);



  
while(j~=1)



      
for i=1:j-1



          
if(distMatrix(route(i),route(j))<=radius&&i~=j-1)



               route(i+1:1:j-1)=[];

               

        


          
break;



          
end



      
end



      
j=i;

    


  
end



else



  
route=[];



  
disp('传输失败');



end

%绘制路线图

plot(xLocation(route),yLocation(route),'>-b','Markerfacecolor','r','MarkerSize',3);

disp('3个邻居节点路线上的节点序号为:');

disp(route)



end

function plotButtonPushed4(btn4)

global flooding1;

global flooding5;

global flooding3;



%记录10条算法的时间,

  
Ay=flooding1;%所有邻居节点的

  
Ax=[1,2,3,4,5,6,7,8,9,10];

  
By=flooding5;%5个邻居节点的

     
Bx=[1,2,3,4,5,6,7,8,9,10];

  
Cy=flooding3;%3个邻居节点的

     
Cx=[1,2,3,4,5,6,7,8,9,10];

     


   %绘制时间对比曲线图,注!必须有10条记录了才能绘制(因为x有10个点,y也得有10个点)   

     plot(Ax,Ay,'o-r',Bx,By,'.-g',Cx,Cy,'>-b');

legend('所有邻居节点','5个邻居节点','3个邻居节点');

   %显示线段上的备注

     
for i=1:10

          
str1=sprintf('%2.4f',Ay(i));   

           
str2=sprintf('%2.4f',By(i));  

             str3=sprintf('%2.4f',Cy(i));   

     
text(Ax(i),Ay(i),str1);

      
text(Bx(i),By(i),str2);

      
text(Cx(i),Cy(i),str3);

     
end

     
disp('所有邻居节点查找路线节点所需的时间为:');

      
disp(Ay);

     
disp('5个邻居节点查找路线节点所需的时间为:');

      
disp(By);

     
disp('3个邻居节点查找路线节点所需的时间为:');

      
disp(Cy);

end

function plotButtonPushed5(btn5)

% Create a figure window

global flooding1;

global flooding5;

global flooding3;

%global ttl;



%ttl=7;%设置最大传输跳数为7



%% 初始化无线传感网示意图



%.传感器节点区域界限



envSize=10;



%区域内传感器数量



global numOfNodes;



numOfNodes=100;



global radius;%作用范围



radius=5;



global xLocation;   



global yLocation;   



xLocation = rand(numOfNodes,1) * envSize;



yLocation = rand(numOfNodes,1) *
envSize;   %x,y坐标



global srcx;



global destx;



srcx = floor(0.1345 * numOfNodes)+1; %第srcx个节点作为源节点



destx = floor(0.5126 * numOfNodes)+1;%第destx个节点作为目的节点



global success;%标记是否成功访问到目的节点



success=0;



global visited;%标记节点是否被访问过



visited=zeros(1,100);%初始时都未被访问



global route;%记录传输路径



route=[];



global neighborNodes;%记录传输路径

neighborNodes=[];

%% 画图



figure(1);

hold on;



plot(xLocation, yLocation, '.');



plot(xLocation(srcx),yLocation(srcx),'ko','Markerfacecolor','k','MarkerSize',3);



plot(xLocation(destx),yLocation(destx),'ko','Markerfacecolor','k','MarkerSize',3);



text(xLocation(srcx),yLocation(srcx), '源节点');



text(xLocation(destx),yLocation(destx), '目的节点');%标记源节点和目的节点



src=[xLocation(srcx),yLocation(srcx)];
dest=[xLocation(destx),yLocation(destx)];



legend('红线所有邻居节点','绿线5个邻居节点','蓝线3个邻居节点');

end


DFS_num.m(DFS数据传输阶段)





function [] = DFS_num(r,ttl,num)% r:源节点 
TTL:生存周期 num:邻居节点数



%% 



global success;



global visited;%标记节点是否被访问过



global distMatrix;%节点间的距离矩阵



global destx;%目的节点



global radius;%作用范围



global route;%记录传输路径



global neighborNodes1;%记录所有邻居节点数



global xLocation;   



global yLocation;   



global neighborNodes;%记录所需邻居节点数



visited(r)=1;



if(success==1||ttl<0)



   
return;



end



if(~ismember(r,route))



  
route=[route,r];



else



  
temp=find(route==r);



  
route=[route,r];



  
route(temp+1:1:end)=[];



end



neighborNodes1=find(distMatrix(r,:)<=radius);%查找在作用范围内的邻节点,选取目标节点与所有区域的距离且小于规定范围的节点



neighborNodes1=intersect(neighborNodes1,
find(visited(:) == 0));%找到可访问的 neighborNodes是列向量



%所有邻居节点

if(num==0)

neighborNodes=neighborNodes1;

end



%5个邻居节点,从所有邻居节点中选取5个

if(num==5)

   
neighborNodes=zeros(num,1); 

for i=1:num

neighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));


end 

end



%3个邻居节点,从所有邻居节点中选取5个

if(num==3)

   
neighborNodes=zeros(num,1); 

for i=1:num

neighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));


end 

end



if(ismember(destx,neighborNodes))%如果邻节点中含有目的节点



  
success=1;



  
route=[route destx];

   

    


str=sprintf('%2.0f',ttl);   % 2位小数的浮点型text

 
text(xLocation(destx),yLocation(destx),str);



  
return;



end



%% 递归程序的出口



if (isempty(neighborNodes))%邻节点为空



  
route(end)=[];%删除当前源节点,返回上一层



 %画出寻找过的邻居节点,并显示是在第几跳查找到的

     
plot(xLocation(neighborNodes(k)),yLocation(neighborNodes(k)),'ro-','Markerfacecolor','y','MarkerSize',3)

str=sprintf('%2.0f',ttl);   % 2位小数的浮点型text

 
text(xLocation(neighborNodes(k)),yLocation(neighborNodes(k)),str);



  
return;



end



%% 递归--当前节点的邻节点中不含有目的节点,从其邻节点开始查找



ttl=ttl-1;



for k = 1:length(neighborNodes)



  %
if (visited(neighborNodes(k)) == 0) 



  
if(neighborNodes(k)==destx)%当传给中心点时结束



      
success=1;

      


      
%画出寻找过的邻居节点,并显示是在第几跳查找到的

plot(xLocation(neighborNodes(k)),yLocation(neighborNodes(k)),'ro-','Markerfacecolor','y','MarkerSize',3)

str=sprintf('%2.0f',ttl+1);   % 2位小数的浮点型text

 
text(xLocation(neighborNodes(k)),yLocation(neighborNodes(k)),str);

      
break;



  
end;

   

  %画出寻找过的邻居节点,并显示是在第几跳查找到的

 
plot(xLocation(neighborNodes(k)),yLocation(neighborNodes(k)),'ro-','Markerfacecolor','y','MarkerSize',3)

str=sprintf('%2.0f',ttl+1);   % 2位小数的浮点型text

 
text(xLocation(neighborNodes(k)),yLocation(neighborNodes(k)),str);



     
  DFS_num(neighborNodes(k),ttl,num);   






  
%end;



end;






distance.m

这是一个函数文件,建立脚本是选择函数脚本



%% 求两个节点之间的距离

 

function dis = distance(A,B)

 

dis = sqrt((A(1)-B(1))^2+(A(2)-B(2))^2);

 

end


四、效果展示

在这里插入图片描述

在这里插入图片描述

五、代码讲解

1.操作说明:

1.首先点击开始绘图按钮,创建图像;

2.点击所有邻居节点的Flooding按钮,绘制路线,线段颜色为红色;

3.点击5个邻居节点的Flooding按钮,绘制路线,线段颜色为绿色;

4.点击3个邻居节点的Flooding按钮,绘制路线,线段颜色为蓝色;

5.经过以上的步骤,我们已经得到了三个算法的一条路线及一个查找路线节点的时间,后即可关闭绘制的窗口,重新绘制新的路线、计算新的查找路线节点的时间,重复1、2、3、4步骤10次,获取每个算法10个不同的查找路线节点的时间

(注:因为在运行效率对比按钮那我用了10个数据点去绘制对比曲线,所以,当某一个算法的数据点不足10个或大于10个时,都无法绘制曲线成功

(注:命令行窗口会有节点序号、查找路线节点的时间的记录反馈);

(注:当数据点不足10个时,接着画;大于10个时,只能关闭程序,重新画了(因为我没有提供删除时间的功能));

6.当集满三个算法的时间后,即可点击运行效率对比按钮,查看三个算法的查找路线节点时间曲线对比图。

(注:有时候没有返回值,是因为没有找到路线,关掉窗口,重新绘制个图,重新找)

2.关于邻居节点的选取

flooding.m相关的代码



function flooding



%用于标记邻居节点数,0代表所有个,5代表5个,3代表3个



num1=0;

num2=5;

num3=3;



%所有制邻居节点的Flooding按钮

btn1 = uibutton(fig,'push',...

               'Position',[120, 330, 200,
34],...

                'Text', '所有制邻居节点的Flooding',...

               'ButtonPushedFcn', @(btn1,event)
plotButtonPushed1(btn1,num1));

%5个邻居节点的Flooding按钮           

btn2 = uibutton(fig,'push',...

               'Position',[120, 230, 200,
34],...

                'Text', '5个邻居节点的Flooding',...

               'ButtonPushedFcn', @(btn2,event)
plotButtonPushed2(btn2,num2));

 %5个邻居节点的Flooding按钮                   

btn3 = uibutton(fig,'push',...

               'Position',[120, 130, 200,
34],...

                'Text', '3个限制邻居节点的Flooding',...

               'ButtonPushedFcn', @(btn3,event)
plotButtonPushed3(btn3,num3));

end

 

function plotButtonPushed1(btn1,num1)

%% 开始查找

DFS_num(srcx,ttl,num1);

End

 

function plotButtonPushed2(btn2,num2)

%% 开始查找

DFS_num(srcx,ttl,num2);

 

end

 

function plotButtonPushed3(btn3,num3)

%% 开始查找

DFS_num(srcx,ttl,num3);

 

end




DFS_num



function [] = DFS_num(r,ttl,num)% r:源节点 
TTL:生存周期 num:邻居节点数

global neighborNodes1;%记录所有邻居节点数

 

global neighborNodes;%记录所需邻居节点数

 

neighborNodes1=find(distMatrix(r,:)<=radius);%查找在作用范围内的邻节点,选取目标节点与所有区域的距离且小于规定范围的节点

 

neighborNodes1=intersect(neighborNodes1,
find(visited(:) == 0));%找到可访问的 neighborNodes是列向量

 

%所有邻居节点

if(num==0)

neighborNodes=neighborNodes1;

end

 

%5个邻居节点,从所有邻居节点中选取5个

if(num==5)

    
neighborNodes=zeros(num,1); 

for i=1:num

neighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));


end 

end

 

%3个邻居节点,从所有邻居节点中选取5个

if(num==3)

    
neighborNodes=zeros(num,1); 

for i=1:num

neighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));


end 

end

end


标签:10,global,MATLAB,邻居,按钮,泛洪,Flooding,节点
来源: https://blog.csdn.net/qq_43662263/article/details/106562327