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

  • 总结
    • 一.界面介绍
  • 二、 Flooding算法工作流程图
  • 三、 .m文件
    • flooding.m
    • DFS_num.m(DFS数据传输阶段)
    • distance.m
  • 四、效果展示
  • 五、代码讲解
    • 1.操作说明:
    • 2.关于邻居节点的选取
      • flooding.m相关的代码
      • DFS_num

总结

  • 我选取所需邻居节点的思想是从所有邻居节点中随机选取所需的节点数,在一定方面上,这种选取的方法是有一定不足的,性能也没有很好。应该要经过运用某种距离算法,在已知所有邻居节点中择优选取最佳的邻居节点。在我目前能力不足,只能实现这种方法:在已知的所有邻居节点中随机选取5个邻居节点。
  • 在运行时间对比上,我只选取了10个点,其实这种做法也是不足的,应该选取至少100多个点去比较性能,才能有更大的说服力。
  • 代码还有很多地方想要改进,如果你有更好的想法与实现方案,欢迎来交流啊!分享一下自己的经验与心得。

参考文档链接
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)); endfunction 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:numOfNodesfor j=i+1:numOfNodesdistMatrix(i,j)=distance([xLocation(i),yLocation(i)],[xLocation(j),yLocation(j)]);enddistMatrix(i,i)=10;%排除自身节点enddistMatrix = distMatrix+distMatrix';%% 开始查找% clock用于计算查找节点的时间,ttl是条数ttl=7;t1=clock;DFS_num(srcx,ttl,num1);t2=clock;%将记录下来的时间放入flooding1i=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-1if(distMatrix(route(i),route(j))<=radius&&i~=j-1)route(i+1:1:j-1)=[];break;endendj=i;endelseroute=[];disp('传输失败');end%绘制路线plot(xLocation(route),yLocation(route),'o-r','Markerfacecolor','r','MarkerSize',3);disp('所有邻居节点路线上的节点序号为:');disp(route)end% Create the function for the
ButtonPushedFcn callbackfunction 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:numOfNodesfor j=i+1:numOfNodesdistMatrix(i,j)=distance([xLocation(i),yLocation(i)],[xLocation(j),yLocation(j)]);enddistMatrix(i,i)=10;%排除自身节点enddistMatrix = distMatrix+distMatrix';%% 开始查找% clock用于计算查找节点的时间,ttl是条数t11=clock;num=5;ttl=7;DFS_num(srcx,ttl,num2);%将记录下来的时间放入flooding5t22=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-1if(distMatrix(route(i),route(j))<=radius&&i~=j-1)route(i+1:1:j-1)=[];break;endendj=i;endelseroute=[];disp('传输失败');end%绘制路线图plot(xLocation(route),yLocation(route),'.-g','Markerfacecolor','r','MarkerSize',3);disp('5个邻居节点路线上的节点序号为:');disp(route)endfunction 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:numOfNodesfor j=i+1:numOfNodesdistMatrix(i,j)=distance([xLocation(i),yLocation(i)],[xLocation(j),yLocation(j)]);enddistMatrix(i,i)=10;%排除自身节点enddistMatrix = distMatrix+distMatrix';%% 开始查找% clock用于计算查找节点的时间,ttl是条数t111=clock;num=3;ttl=7;DFS_num(srcx,ttl,num3);%将记录下来的时间放入flooding3t222=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-1if(distMatrix(route(i),route(j))<=radius&&i~=j-1)route(i+1:1:j-1)=[];break;endendj=i;endelseroute=[];disp('传输失败');end%绘制路线图plot(xLocation(route),yLocation(route),'>-b','Markerfacecolor','r','MarkerSize',3);disp('3个邻居节点路线上的节点序号为:');disp(route)endfunction 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:10str1=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);enddisp('所有邻居节点查找路线节点所需的时间为:');disp(Ay);disp('5个邻居节点查找路线节点所需的时间为:');disp(By);disp('3个邻居节点查找路线节点所需的时间为:');disp(Cy);endfunction plotButtonPushed5(btn5)% Create a figure windowglobal 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;endif(~ismember(r,route))route=[route,r];elsetemp=find(route==r);route=[route,r];route(temp+1:1:end)=[];endneighborNodes1=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:numneighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));end end%3个邻居节点,从所有邻居节点中选取5个if(num==3)neighborNodes=zeros(num,1); for i=1:numneighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));end endif(ismember(destx,neighborNodes))%如果邻节点中含有目的节点success=1;route=[route destx];str=sprintf('%2.0f',ttl);   % 2位小数的浮点型texttext(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位小数的浮点型texttext(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位小数的浮点型texttext(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位小数的浮点型texttext(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

四、效果展示

  • 运行flooding.m
  • 主窗口效果

  • 绘图窗口效果
  • 绘制路线效果
  • 查找路线节点运行时间对比曲线图

五、代码讲解

1.操作说明:

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

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

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

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

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

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

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

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

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

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

2.关于邻居节点的选取

  • 选取的方法:在所有邻居节点中随机选取自己想要的个数,用num这个全局变量里设置。
  • num变量在flooding.m中的function flooding定义,在按钮启动事件函数plotButtonPushed(btn,num)中调用给DFS_num.m进行选取。

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));endfunction plotButtonPushed1(btn1,num1)%% 开始查找DFS_num(srcx,ttl,num1);Endfunction plotButtonPushed2(btn2,num2)%% 开始查找DFS_num(srcx,ttl,num2);endfunction 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:numneighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));end end%3个邻居节点,从所有邻居节点中选取5个if(num==3)neighborNodes=zeros(num,1); for i=1:numneighborNodes(i)=neighborNodes1(int32(1+(length(neighborNodes1)-1)*rand));end endend

MATLAB-泛洪(Flooding)协议仿真相关推荐

  1. matlab电力电子仿真研究背景,MATLAB的电力电子技术仿真文献综述

    [1]基于MATLAB的电力电子技术仿真分析 利用SIMULINK提供的功能,建立电力电子电路仿真模型,设置.修改参数,在电子示波器上显示仿真波形,并对其进行分析.验证. [2] 但波,冯兵等.MAT ...

  2. matlab半物理仿真,一种基于Matlab的半物理仿真方法与流程

    本发明属于物理建模技术领域,具体涉及一种基于Matlab的半物理仿真方法. 背景技术: 当今汽车行业,经过多年探索,业界普遍采用基于模型的控制器开发"V"模式,如图5所示.该模式可 ...

  3. 码分复用的matlab仿真,基于matlab的多路时分复用仿真.doc

    基于matlab的多路时分复用仿真 通信系统原理综设实验报告 多路时分复用matlab仿真系统 教师评语: 引言 在实际的通信系统中,为了扩大通信链路的容量,提高通信系统的利用率,需要在一条链路上传输 ...

  4. matlab zp2,matlab用于控制系统数字仿真

    matlab用于控制系统数字仿真 传递函数 n >>num=[6 12 6 10];den=[1 2 3 1 1]; n >>printsys(num,den) n 执行结果为 ...

  5. matlab基本杆组-运动学仿真,MATLAB基本杆组-运动学仿真.pdf

    MATLAB基本杆组-运动学仿真 第5章 运动学仿真 --Simulink的使用 从基本杆组理论为基础建立模型 §5-1 曲柄的MATLAB运动学仿真模块 1.曲柄的运动学矩阵表达式 在复数坐标系中, ...

  6. matlab实现瑞利信道需要的步骤,基于Matlab的瑞利信道仿真.docx

    移动通信期中论文 论文题目:基于Matlab的瑞利信道仿真Title:Rayleigh fading simulation based on Matlab 学院:信息学院专业:通信工程姓名:888 x ...

  7. 基于matlab编译码器的设计,基于MATLAB循环码编译码仿真

    基于MATLAB循环码编译码仿真(论文11000字) 摘要:在具体了解循环码的编码理论的基础上,使用 M ATLA B 软件设计了循环码编译码器. 通过 M ATLAB 软件实现循环码的编译码 ,通过 ...

  8. 时隙aloha协议仿真程序_工控ModbusTCP/IP协议仿真环境搭建

    01 ModbusTCP/IP协议简介 Modbus TCP/IP是简单的.中立厂商的用于管理和控制自动化设备的MODBUS系列通讯协议的派生产品.它覆盖了使用TCP/IP协议的"intra ...

  9. 用matlab简单电路模型,基于MATLAB的电路模型仿真应用

    基于MATLAB的电路模型仿真应用实验指导书 一.实验目的 1.掌握采用M文件及SIMULINK对电路进行仿真的方法. 2.熟悉POWERSYSTEM BLOCKSET 模块集的调用.设置方法. 3. ...

最新文章

  1. insert事务隔离mysql_MySQL数据库详解(三)MySQL的事务隔离剖析
  2. 支付宝区块链授权专利212件 位居全球第一!
  3. Git与SVN版本控制系统
  4. Benchmark简介
  5. Kotlin 1.0 正式版发布啦
  6. 【欧洲AI复兴】马克龙:法国AI要赶美超中!
  7. web开发规范 - html书写规范
  8. 在centos下安装使用busybox工具箱
  9. 笔记本电脑连接无线网总是突然断网
  10. 神经网络建模的基本思想,建模方法神经网络设计
  11. 为什么装完计算机系统后进不去,电脑重新装完系统后开机后就这个样子,一直进不去是为什么?...
  12. 区块链开发(五)搭建以太坊区块链浏览器
  13. MATLAB R2022a 安装教程
  14. KOL投放指南(六):如何实现精准找号
  15. SpringBoot起步
  16. java学习day38(Linux)Linux、命令
  17. TCP 聊天工具[python]
  18. Talib常用函数图像形态识别
  19. UART串口协议基础1
  20. 用php的for循环实现金字塔

热门文章

  1. 怎么配置网站静态为tink php,ThinkPHP 伪静态配置
  2. java文本敏感词、关键字搜索检测
  3. 哪些手游网游最适合码农?
  4. Word 文档保护及解除
  5. 工程师的工作和工程师的未来与职业之路
  6. SQL Server工具--bcp介绍与使用
  7. [ROS](05)ROS通信 —— 节点,Nodes Master
  8. ROS基础(二):ros通讯之服务(service)机制
  9. selectedIndex
  10. jenkins 忘记密码