m基于自适应修复算法的AODV-SAR路由协议matlab性能仿真

138 阅读6分钟

1.算法仿真效果

matlab2022a仿真结果如下:

1.png

2.png

3.png

4.png  

2.算法涉及理论知识概要

AODV-SAR,Self-Adaptive Repair

 

         定义1自修复节点:任意选取路径S→A→B→C→D为MANET中一条业务传输路径,其中节点S为该传输路径的源节点,节点D为该传输路径的目的节点。如果在某一时间,节点B和节点C之间的路径发生故障,导致链路失效,靠近节点S即路径源节点的节点B称为自修复节点。

 

       结合移动Ad Hoc 网络在军事场景、抢险救灾以及野外科考等环境中的应用背景,网络中的各个节点可能运动速度并不低,但是却服从统一的部署和调度。因此,本文将主要考虑目标节点做确定性运动情况下的搜索方程。假设发生在不同时刻的搜索过程相互独立,这意味着自愈节点无法从过去失败中得到如何更好进行搜索的经验:

afd50a38f2485910dda1085f12c3677e_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

        由于移动Ad Hoc 网络中节点间的通信均建立在无线链路的基础上,因此链路质量变差或失效将对业务分组传输带来不利的影响。目前,移动Ad Hoc 网络中的路由协议普遍采用在确定传输路径中断后才发起修复请求的机制。由于在判定路由失效时需要进行多次重传,比如,标准的 IEEE 802.11中规定MAC层需要满足四次传输定时器超时后才能判定链路失效,因此,从当前链路失效到开始寻找替代路由需要经历很长的时间。这种时延将对移动Ad Hoc 网络的业务传输造成严重的影响。尽管许多抢先式路由协议在提前预测方面取得了良好的效果,但是由于这类协议往往需要采用节点运动速度、地理位置、业务分组传输跳数以及节点寿命等多种因素作为抢先量度,用于判断链路质量以提前进行路由发现过程,因此,算法过程通常较为复杂而且还会引起较大的控制开销。此外,为了能够准确的对链路进行预测,往往需要节点具备额外的设备,如GPS等。

 

        针对上述问题,本节将主要关注如何以较低的代价进行本地节点的路由质量检测问题,并建立网络环境的映射关系作为发起路由修复的判据。

 

        路由质量检测的目的在于能够更早、更快的检测出即将发生失效的链路连接,以帮助本地节点在链路失效前找到替代路径,减少链路中断后多次进行重传确认所引起大量不必要的开销,从而实现对当前路由的快速修复。这种思想与蜂窝网络中的软切换技术十分相似,因此,路由质量检测算法的设计关键在于如何确定路由质量已经变“差”,需要重新选择传输路径。对路由质量的判定可以采取很多方式,比如信号强度、路由存活时间、业务分组传输跳数以及发生冲突的频率等。为了能够快速、准确的判定是否需要发起本地路由的修复过程,本文根据业务分组接收功率来建立路由质量判定函数以避免引入额外的控制开销。在移动Ad Hoc网络中,链路的失效大多是由于节点间相对运动所造成的,因此信号强度作为最直接的衡量标准可以用来判断业务分组在节点间传输的能力,而衰落等原因引起的信号功率短暂的抖动将不会影响对路由质量的判定结果。

 

3.MATLAB核心程序 `global SCALE;

global Number;

global Energy0;

global Radius;

global Vmax;

global Vavg;

global Smax;

global Savg;

global Len;

global Rpow;

global Rfail;

global Rmax;

global alpha0;

global REG;

global ETX;

global ERX;

global Efs;

global Emp;

global EDA;

global Nnode;

global Psent;

global X;

global Y;

Delays  = [];

Change  = [];

Power   = [];

MTKL    = 500;

 

Sset    = [5:5:50];%不同的节点数据包发送速率

for ii = 1:length(Sset)

    ii

    tmps1 = 0;

    tmps2 = 0;

    tmps3 = 0;

    for jj = 1:MTKL

 

        rng((ii-1)*jj+jj);

        SCALE   = 1000;%节点分布范围

        Number  = 100;%节点总个数

        Energy0 = 1;%节点初始能量

        Radius  = 240;%节点通信半径

        Vmax    = 10;%节点移动速度

        Vavg    = Vmax*randn(2,Number);

        Smax    = 10;%数据包发送速率

        Savg    = Sset(ii)*rand;

        Len     = 1024;%数据包长度

        Rpow    = 250;%功率覆盖半径

        Rfail   = 1;

        Rmax    = 2e6;%最大传输速率

        alpha0  = pi/3;

        REG     = 0.2;%缓存大小    

        %能量消耗

        ETX     = 50*1e-9;

        ERX     = 50*1e-9;

        %Transmit Amplifier types

        Efs    = 10    *1e-12;

        Emp    = 0.0013*1e-12;

        %Data Aggregation Energy

        EDA    = 5*1e-9;

        Nnode   = Number;

        Psent   = 0.1;

        

        if jj == 1

           X = SCALE*rand(1,Number);

           Y = SCALE*rand(1,Number);

        else

           X = X+Vavg(1,:);%移动

           Y = Y+Vavg(2,:);

        end

 

        dmatrix = 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;

                else

                   %距离因素

                   dmatrix(i,j) = inf;  

                end;

            end;

        end;

        distmatrix = zeros(Nnode,Nnode);

        for i = 1:Nnode

            for j = 1:Nnode

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

                distmatrix(i,j) = Dist;

            end;

        end;

        

        

        Pmatrix = 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 <= Rpow & Dist > 0

                   %距离因素

                   Pmatrix(i,j) = ETX;

                else

                   %距离因素

                   Pmatrix(i,j) = 0;  

                end;

            end;

        end;

 

        tmps= randperm(Number);

        if tmps(1)>tmps(2)

           Sn1 = tmps(2);

           En1 = tmps(1);

        else

           Sn1 = tmps(1);

           En1 = tmps(2);

        end

        [paths1,costs1] = func_aodvsar(Sn1,En1,dmatrix,Pmatrix,distmatrix);     

...................................................................................

 

        else

            if jj == 1

               Ec3(jj,1:Nnode) = Energy0;

               Ec30(1:Nnode)   = Energy0;

            else

               Ec3(jj,1:Nnode) = Ec3(jj-1,1:Nnode);  

            end

            succes = 0;

            Ecums  = 0.1;

        end

 

        tmps1 = tmps1+Savg/((length(paths1)+1)*REG)+path_distance/Savg/1000;%缓存延迟+传输延迟

        

        tmps2 = tmps2+succes;

        tmps3 = tmps3+Ecums;

    end

    %对节点之间平均端到端的时延

    Delays(ii) = tmps1/MTKL;

    %数据包分组交付率

    Change(ii) = 100*tmps2/MTKL;

    %路由拓扑控制开销

    Power(ii)  = tmps3/MTKL;

end

 

figure;

plot(Sset,Delays,'b-o');

grid on

xlabel('不同的节点数据包发送速率');

ylabel('平均端到端的时延');

 

figure;

plot(Sset,Change,'b-o');

grid on

xlabel('不同的节点数据包发送速率');

ylabel('数据包分组交付率%');

ylim([0,100]);

figure;

plot(Sset,Power,'b-o');

grid on

xlabel('不同的节点数据包发送速率');

ylabel('路由拓扑控制开销');

 

save R1.mat Sset Delays Change Power`