• 基于matlab的卫星网络DCAR编码感知路由发现仿真


    FPGA教程目录

    MATLAB教程目录

    -----------------------------------------------------------------------

    目录

    一、理论基础

    1.1 DCAR概述

    1.2 算法具体实施步骤

    二、核心程序

    三、测试结果


    一、理论基础

    1.1 DCAR概述

            卫星网络中的DCAR(Data-Centric Adaptive Routing)编码感知路由发现是一种以数据为中心的路由协议,其目的是在卫星网络中提供高效的数据传输。DCAR利用编码感知路由发现算法来确定最佳的数据传输路径,以最小化数据传输延迟和最大化网络吞吐量。

    DCAR编码感知路由发现的原理可以概括为以下几点:

    1. 以数据为中心:DCAR以数据为中心,而不是以节点为中心。它关注的是数据传输的效率和可靠性,而不是节点的连接状态。因此,DCAR可以更好地适应卫星网络中的动态变化。

    2. 路由感知:DCAR通过编码感知技术来确定最佳的路由路径。编码感知技术将数据包编码为多个副本,并将这些副本发送到网络中的不同节点。通过这种方式,DCAR可以在网络中建立多条路由路径,并从中选择最佳的路径进行数据传输。

    3. 自适应路由:DCAR采用自适应路由算法来动态地选择最佳的路由路径。这种算法可以根据网络的实时状态和数据传输的需求来选择路由路径,从而最大化网络吞吐量和最小化数据传输延迟。

    4. 邻居节点发现:DCAR通过邻居节点发现机制来发现网络中的相邻节点。这种机制允许节点在不知道网络拓扑结构的情况下,发现并建立直接的连接。通过邻居节点发现,DCAR可以在网络中形成多条路由路径。

    DCAR编码感知路由发现的算法可以表示为以下公式:

    R(n) = k + Σ[P(i, j) * R(i) * R(j)] (1)

            其中,R(n)表示节点n的路由度,即节点n到其他节点的路由路径的数量;k表示节点n的本地路由度,即节点n到其邻居节点的路由路径的数量;P(i, j)表示节点i和节点j之间的连接概率;R(i)和R(j)分别表示节点i和节点j的路由度。

           公式(1)的含义是,节点n的路由度等于其本地路由度加上其所有邻居节点的路由度与其到邻居节点的连接概率的乘积之和。这个公式可以帮助DCAR确定最佳的路由路径,从而实现高效的数据传输。

            在卫星网络中应用DCAR编码感知路由发现算法,可以有效地解决卫星网络中的数据传输问题,并提高网络性能。由于卫星网络具有空间广域、拓扑动态变化和信道可靠性低等特点,DCAR编码感知路由发现算法可以更好地适应这些特点,并实现高效的数据传输。此外,DCAR还具有简单易实现、可扩展性强等优点,因此具有广泛的应用前景。

    1.2 算法具体实施步骤

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

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

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

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

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

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

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

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

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

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

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

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

    算法流程图:

    二、核心程序

    1. %数据流个数
    2. data_num = [4:4:40];
    3. %初始化卫星网络模型
    4. Throughput = zeros(size(data_num));%延迟变量
    5. times = 400;%模拟卫星运行的时间
    6. Ndata = 8;%数据流数量
    7. %产生格子矩阵坐标数据点
    8. STEP = 10;
    9. X0 = 0:STEP:100;
    10. Y0 = 0:STEP:100;
    11. Xset = [];
    12. Yset = [];
    13. for i = 1:length(X0)
    14. for j=1:length(Y0)
    15. Xset = [Xset,X0(i)];
    16. Yset = [Yset,Y0(j)];
    17. end
    18. end
    19. figure;
    20. plot(Xset,Yset,'b.');
    21. REPs=[];
    22. for iii = 1:length(data_num);
    23. iii
    24. Throughput0 = [];
    25. for jjj = 1:times
    26. rng(jjj);
    27. %初始位置
    28. %定义格子网格
    29. Nnode = 25;
    30. SCALE = 100;
    31. %初始节点能量
    32. E0 = 1;
    33. %通信半径
    34. Radius= 20;%
    35. %发送率
    36. Trans = 15e6;%15Mbps
    37. packet= 512; %512byte
    38. Slen = 3e4;
    39. %在格子网里面随时分布
    40. sels = randperm(Nnode);
    41. X = Xset(sels);
    42. Y = Yset(sels);
    43. % end
    44. %模拟发送数据
    45. data_frame = 2*(rand(1,1024)>=0)-1;
    46. Qmatrix = zeros(Nnode,Nnode);%平均包长矩阵
    47. gmatrix = zeros(Nnode,Nnode);%增益矩阵
    48. rmatrix = zeros(Nnode,Nnode);%丢包率矩阵
    49. dmatrix = zeros(Nnode,Nnode);
    50. ETX = zeros(Nnode,Nnode);
    51. for i = 1:Nnode
    52. for j = 1:Nnode
    53. Dist = sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2);
    54. %a link;
    55. if Dist <= Radius & Dist > 0
    56. %距离因素
    57. dmatrix(i,j) = Dist;
    58. ETX(i,j) = 1/Dist;
    59. gmatrix(i,j) = 1/Dist;
    60. rmatrix(i,j) = Dist/2/SCALE/10;
    61. Qmatrix(i,j) = length(data_frame)*rand;
    62. else
    63. %距离因素
    64. dmatrix(i,j) = inf;
    65. ETX(i,j) = 0;
    66. gmatrix(i,j) = 0;
    67. rmatrix(i,j) = inf;
    68. Qmatrix(i,j) = inf;
    69. end;
    70. end;
    71. end;
    72. %归一化处理
    73. dmatrix = dmatrix;
    74. %路由优化算法的改进
    75. Tmatrix = dmatrix;
    76. for i = 1:Nnode
    77. distA(i) = sqrt((X(i)+SCALE)^2 + (Y(i)+SCALE)^2);
    78. distB(i) = sqrt((X(i)-SCALE)^2 + (Y(i)+SCALE)^2);
    79. end
    80. [Va,Ia] = sort(distA,'descend');
    81. [Vb,Ib] = sort(distB,'descend');
    82. %DCAR-DCAR-DCAR-DCAR-DCAR-DCAR
    83. NX=0;
    84. Sn1 = Ia(1);
    85. En1 = Ib(1);
    86. %备选转发节点集合的选择
    87. flag = 0;
    88. while flag == 0%重复步骤2直至其到达目的节点。
    89. %源节点需要向所有邻居节点发送路由请求信息REQ
    90. sendreq = zeros(1,Nnode);
    91. for i = 1:Nnode
    92. sendreq(i)=1;
    93. end
    94. %中间节点收到REQ后将依次进行如下处理:
    95. for i = 1:Nnode
    96. p = rand;
    97. if p>=0.5%假设50%概率进行丢弃
    98. sendreq(i) = 0;%丢弃该RREQ不再处理
    99. end
    100. end
    101. %检查本节点地址是否与RREQ中记录的目的地址吻合
    102. idx1 = find(sendreq==1);
    103. idx2 = find(idx1==En1);%检测是否和目标节点吻合
    104. if isempty(idx2) == 0%该节点为目的节点,将进入路由反馈阶段
    105. flag = 1;
    106. else
    107. flag = 0;
    108. end
    109. end
    110. %注意,这个地方并不是用dijkstra这个算法,而是模拟出我们发送的路径,你也可以自己设置这个路径
    111. [r_path, r_cost] = func_dijkstra(Sn1, En1, dmatrix);
    112. startnew = r_path(1);
    113. if flag == 1%路由反馈
    114. %产生REP
    115. REP = [r_path];
    116. %吻合概率
    117. p = rand;
    118. if p>=0.75
    119. %CARM值最小的路径进行数据传输并将该条路径的信息记录到其路由表中,完成路由表的更新
    120. [pathss,LQMsum] = func_CARMnew(Sn1,En1,gmatrix,rmatrix,Qmatrix);
    121. LL = length(pathss);
    122. path_distance = 0;
    123. ds = 0;
    124. for d=2:length(pathss)
    125. path_distance= path_distance + (Slen/(Trans/packet))*dmatrix(pathss(d-1),pathss(d));
    126. ds(d)=dmatrix(pathss(d-1),pathss(d));
    127. end
    128. LQMsum_=LQMsum/1e3;
    129. else
    130. %计算获取当前节点的缓存队列长度并将其写入REP中;
    131. L = length(REP);
    132. REPs = [REPs,r_path];%获取当前节点的缓存队列长度并将其写入REP中
    133. idxs = find(REPs == startnew);%找到原节点
    134. if isempty(idxs) == 0;
    135. flag = 1;
    136. end
    137. NX = 1;
    138. LQMsum_= 1;
    139. path_distance=10;
    140. end
    141. end
    142. if NX == 0;
    143. Kreduce = 1/LQMsum_;
    144. else
    145. Kreduce = 1;
    146. end
    147. %吞吐量
    148. r = randperm(Nnode);%定义一个随机因子,模拟随机某一个卫星发送
    149. %总包数量
    150. packet_size = 1e5*512*8/1024;%bit
    151. total_packet = data_num(iii);
    152. total_time = Kreduce*times;
    153. totaldata = length(data_frame);%数据流总数
    154. th = func_throughput(total_packet,total_time,path_distance,r,Nnode,packet_size,totaldata);
    155. Throughput0 = [Throughput0,mean(th)^2];
    156. end
    157. Throughput(iii) = mean(Throughput0);
    158. end

    三、测试结果

     

     

     A01-178

  • 相关阅读:
    Qt之设置QLineEdit只能输入浮点数
    快速学会JDBC及获取连接的五种方式
    信创需求激增,国产服务器操作系统赋能数字化转型
    【软件测试】--接口测试
    【分布式系统】面向结构化数据的分布式存储
    Redis单线程为什么这么快
    【图形学】13 UnityShader语义(一)
    Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
    基于STM32F103ZET6库函数按键输入实验
    HTTP协议
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/127837269