参考文档链接 注 1.主窗口:含五个按钮:开始绘图按钮、所有邻居节点的Flooding按钮、5个邻居节点的Flooding按钮、3个邻居节点的Flooding按钮、点击运行效率对比按钮 2.绘图窗口 3.绘制路线窗口,点上标的76543210代表跳数,空心点代表寻找过的邻居节点 这是一个函数文件,建立脚本是选择函数脚本 1.首先点击开始绘图按钮,创建图像; 2.点击所有邻居节点的Flooding按钮,绘制路线,线段颜色为红色; 3.点击5个邻居节点的Flooding按钮,绘制路线,线段颜色为绿色; 4.点击3个邻居节点的Flooding按钮,绘制路线,线段颜色为蓝色; 5.经过以上的步骤,我们已经得到了三个算法的一条路线及一个查找路线节点的时间,后即可关闭绘制的窗口,重新绘制新的路线、计算新的查找路线节点的时间,重复1、2、3、4步骤10次,获取每个算法10个不同的查找路线节点的时间 (注:因为在运行效率对比按钮那我用了10个数据点去绘制对比曲线,所以,当某一个算法的数据点不足10个或大于10个时,都无法绘制曲线成功) (注:命令行窗口会有节点序号、查找路线节点的时间的记录反馈); (注:当数据点不足10个时,接着画;大于10个时,只能关闭程序,重新画了(因为我没有提供删除时间的功能)); 6.当集满三个算法的时间后,即可点击运行效率对比按钮,查看三个算法的查找路线节点时间曲线对比图。 (注:有时候没有返回值,是因为没有找到路线,关掉窗口,重新绘制个图,重新找)MATLAB-无线传感器网络泛洪(Flooding)协议仿真
总结
1.无线传感器网络flooding路由协议的MATLAB仿真论文
2.原代码出处_MATLAB实现洪泛路由的模拟
若复制的代码不能运行,联系我;
或在这个链接里自行下载
链接:https://pan.baidu.com/s/1bXKE7QWY5JNycOWpiBfa7g
提取码:zkrt一.界面介绍
所有邻居节点的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.操作说明:
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
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算