您现在的位置:首页 >> 网络协议 >> 内容

m基于DCAR编码感知的网络路由发现算法matlab仿真

时间:2022/12/20 19:08:01 点击:

  核心提示:01_178m,包括程序操作录像+参考文献...

1.完整项目描述和程序获取

>面包多安全交易平台:https://mbd.pub/o/bread/Y5qZl59v

>如果链接失效,可以直接打开本站店铺搜索相关店铺:

点击店铺

>如果链接失效,程序调试报错或者项目合作可以加微信或者QQ联系。

2.部分仿真图预览





3.算法概述

1.路由请求过程

       当一个源节点有数据要向目的节点发送且在当前路由缓存中未发现可用路径时,则启动路由请求过程,下面分步对该过程进行说明:

步骤1:路由建立初期,源节点需要向所有邻居节点发送路由请求信息REQ,转向步骤2;

步骤2:中间节点收到REQ后将依次进行如下处理:

(1)检查本节点的地址是否出现在REQ所保存的路由记录中,如果是,为避免出现环路,则丢弃该RREQ不再处理;

(2)检查本节点地址是否与RREQ中记录的目的地址吻合,如果是,那么此时该节点为目的节点,将进入路由反馈阶段;否则临时存储该RREQ,然后把当前节点信息及其邻居节点信息分别添加到REQ的NodeID和Neighbors中,广播更新后的REQ。重复步骤2直至其到达目的节点。

2.路由反馈过程

目的节点按照如下步骤进行路由反馈:

       步骤1:目的节点为其所收到若干路由请求信息生成对应的路由反馈信息REP,此时每个REP包含从源节点到目的节点的路径信息以及这条路径上的所有节点的相关信息。目的节点将根据此信息,沿REQ的反向路径单播传输REP。

       步骤2:中间节点收到该REP后将依次执行以下操作:

(1)检查本节点地址是否与REP中记录的目的地址吻合,如果是,那么此时当前节点为源节点,转向步骤3;

(2)计算获取当前节点的缓存队列长度并将其写入REP中;

(3)检查是否有其他数据流的流经信息及相应节点的监听信息存储在该节点的流表中,如果节点流表不为空,则进入编码感知阶段。编码感知阶段主要是根据编码条件获得可与REP中的路由在当前节点处进行编码的数据流集合,并利用此结果对REP中的编码相关信息进行更新,然后按照REP中记录的路径将其传送至下一跳节点。重复步骤2直至其到达源节点。

     步骤3:源节点接收到REPs后,分别计算每个路由反馈信息所记录路径的CARM值,选择CARM值最小的路径进行数据传输并将该条路径的信息记录到其路由表中,完成路由表的更新。至此完成整个编码感知路由发现过程。

4.部分源码

%数据流个数

data_num    = [4:4:40];

%初始化卫星网络模型

Throughput  = zeros(size(data_num));%延迟变量

times       = 400;%模拟卫星运行的时间

Ndata       = 8;%数据流数量

%产生格子矩阵坐标数据点

STEP        = 10;

X0          = 0:STEP:100;

Y0          = 0:STEP:100;

Xset        = [];

Yset        = [];

for i = 1:length(X0)

    for j=1:length(Y0)

        Xset = [Xset,X0(i)];

        Yset = [Yset,Y0(j)];       

    end

end

figure;

plot(Xset,Yset,'b.');

REPs=[];

for iii = 1:length(data_num);

    iii

    Throughput0 = [];

    for jjj = 1:times

        rng(jjj);

        %初始位置

        %定义格子网格

        Nnode = 25;

        SCALE = 100;

        %初始节点能量

        E0    = 1;

        %通信半径

        Radius= 20;%

        %发送率

        Trans = 15e6;%15Mbps

        packet= 512; %512byte

        Slen  = 3e4;

        %在格子网里面随时分布

        sels  = randperm(Nnode);

        X  = Xset(sels);  

        Y  = Yset(sels);      

%         end

        %模拟发送数据

        data_frame = 2*(rand(1,1024)>=0)-1;

        Qmatrix = zeros(Nnode,Nnode);%平均包长矩阵

        gmatrix = zeros(Nnode,Nnode);%增益矩阵

        rmatrix = zeros(Nnode,Nnode);%丢包率矩阵

        dmatrix = zeros(Nnode,Nnode);

        ETX     = zeros(Nnode,Nnode);

        for i = 1:Nnode 

            for j = 1:Nnode 

                Dist = sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2); 

                %a link; 

                if Dist <= Radius & Dist > 0  

                   %距离因素

                   dmatrix(i,j) = Dist; 

                   ETX(i,j)     = 1/Dist;    

                   gmatrix(i,j) = 1/Dist; 

                   rmatrix(i,j) = Dist/2/SCALE/10;

                   Qmatrix(i,j) = length(data_frame)*rand;

                else 

                   %距离因素

                   dmatrix(i,j) = inf; 

                   ETX(i,j)     = 0;    

                   gmatrix(i,j) = 0; 

                   rmatrix(i,j) = inf;

                   Qmatrix(i,j) = inf;

                end; 

            end; 

        end; 

        %归一化处理

        dmatrix = dmatrix;

        %路由优化算法的改进

        Tmatrix = dmatrix;

 

        for i = 1:Nnode

            distA(i) = sqrt((X(i)+SCALE)^2 + (Y(i)+SCALE)^2);

            distB(i) = sqrt((X(i)-SCALE)^2 + (Y(i)+SCALE)^2);

        end

        [Va,Ia] = sort(distA,'descend');

        [Vb,Ib] = sort(distB,'descend');

        %DCAR-DCAR-DCAR-DCAR-DCAR-DCAR  

        

        

        NX=0;

        Sn1 = Ia(1);

        En1 = Ib(1);

 

        %备选转发节点集合的选择

        flag = 0;

        while flag == 0%重复步骤2直至其到达目的节点。

            %源节点需要向所有邻居节点发送路由请求信息REQ

            sendreq = zeros(1,Nnode);

            for i = 1:Nnode

                sendreq(i)=1;

            end

 

            %中间节点收到REQ后将依次进行如下处理:

            for i = 1:Nnode

                p = rand;

                if p>=0.5%假设50%概率进行丢弃

                   sendreq(i) = 0;%丢弃该RREQ不再处理

                end

            end

            %检查本节点地址是否与RREQ中记录的目的地址吻合

            idx1 = find(sendreq==1);

            idx2 = find(idx1==En1);%检测是否和目标节点吻合

 

            if isempty(idx2) == 0%该节点为目的节点,将进入路由反馈阶段

               flag = 1;

            else

               flag = 0;

            end

        end

        %注意,这个地方并不是用dijkstra这个算法,而是模拟出我们发送的路径,你也可以自己设置这个路径

        [r_path, r_cost] = func_dijkstra(Sn1, En1, dmatrix); 

        startnew         = r_path(1);

        if flag == 1%路由反馈

           %产生REP

           REP = [r_path];

           %吻合概率

           p = rand;

           if  p>=0.75

               %CARM值最小的路径进行数据传输并将该条路径的信息记录到其路由表中,完成路由表的更新

               [pathss,LQMsum] = func_CARMnew(Sn1,En1,gmatrix,rmatrix,Qmatrix); 

               LL = length(pathss);

               path_distance = 0; 

               ds            = 0;

               for d=2:length(pathss) 

                   path_distance= path_distance + (Slen/(Trans/packet))*dmatrix(pathss(d-1),pathss(d)); 

                   ds(d)=dmatrix(pathss(d-1),pathss(d)); 

               end 

               LQMsum_=LQMsum/1e3;

           else

               %计算获取当前节点的缓存队列长度并将其写入REP中;

               L    = length(REP);

               REPs = [REPs,r_path];%获取当前节点的缓存队列长度并将其写入REP中

               idxs = find(REPs == startnew);%找到原节点

               if isempty(idxs) == 0;

                  flag = 1;

               end

               NX     = 1;

               LQMsum_= 1;

               path_distance=10;

           end

        end

      

        if NX == 0;

           Kreduce = 1/LQMsum_;

        else    

           Kreduce = 1;

        end

        %吞吐量

        r       = randperm(Nnode);%定义一个随机因子,模拟随机某一个卫星发送

        %总包数量

        packet_size  = 1e5*512*8/1024;%bit

        total_packet = data_num(iii);

        total_time   = Kreduce*times; 

        totaldata    = length(data_frame);%数据流总数

        th          = func_throughput(total_packet,total_time,path_distance,r,Nnode,packet_size,totaldata);  

        Throughput0 = [Throughput0,mean(th)];

    end

    Throughput(iii) = mean(Throughput0);

end

01_178m

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168