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

news2025/2/1 10:01:54

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

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值最小的路径进行数据传输并将该条路径的信息记录到其路由表中,完成路由表的更新。至此完成整个编码感知路由发现过程。

算法的基本流程如下所示:

2.仿真效果预览

matlab2022a仿真结果如下:

 

 

 

3.MATLAB核心程序

 
 
%数据流个数
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

4.完整MATLAB

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI行动,解放做表打工人

1. atomecho 插件介绍 如果你是个—— 需要做财报、数据新闻的冤种&#xff1b; 或者是“网上有的我都想要”的囤积狂魔&#xff1b; 或是沉迷“CtrlC、CtrlV”的做表工具人。 那你一定不陌生—— 对不上的格式、找不到的数据、删不完的无效内容、按烂了的“CtrlC”和“CtrlV…

在Qt creator中查看Qt源码

Qt 是开源语言&#xff0c;阅读其实现的源代码可以帮助我们更好的了解Qt&#xff0c;解决开发中遇到的问题&#xff0c;能帮助我们更快的成长&#xff0c;本文介绍了Qt官方原代码的两种查看方法。 在Qt creator中查看Qt源码在线查看本地查看配置版本一、下载源码1、运行Mainten…

阿里云崩“出圈”了!保护业务还得加一道同云跨可用区容灾!

2022年12月18日&#xff0c;上午10点47分&#xff0c;阿里云的香港部分服务出现故障&#xff0c;导致多个香港及澳门站点受到影响。 随后阿里云方面发布公告表示&#xff0c;阿里云官网 12 月 18 日下午更新处理进展称&#xff0c;经排查&#xff0c;阿里云香港地域故障确认为…

嵌入式Linux驱动开发之点灯

使用驱动开发的方式点亮一个LED灯。看看两者有啥区别不&#xff1f; 一、先看原理图 首先查看原理图&#xff0c;看看我们的板子上的LED等接在哪一个IO口上面。 好了&#xff0c;看原理图我们知道LED灯接在芯片的GPIO1的第三个引脚上面&#xff0c;也就是GPIO1_IO03。 二、I…

优化稠密点之尝试通过 Balance 来分摊访问压力

回忆之前的官方架构图&#xff0c;数据在 storaged 中是分片的&#xff0c;且 raft 协议中只有 leader 才会处理请求&#xff0c;所以&#xff0c;重新进行数据平衡操作&#xff0c;是有可能将多个稠密点分摊到不同的服务上以减轻单一服务的压力。同时&#xff0c;我们对整个集…

记录C,C++关键字的位置,直接跳过注释和字符串文本。(修正)

依据第二版本&#xff0c;可以写一个跳过注释的查找函数 C_IndexOfWord Java_IndexOfWord CSharp_IndexOfWord 还有一种方法&#xff0c;可以先把所有注释用空格代替&#xff0c;查出的字符位置也不变。 以前版本&#xff1a; DList<TextColor> Syntax::GetTextColorP…

(三分钟)学会kd-tree 激光SLAM点云搜索常见

Kd-Tree&#xff1a; 今天来介绍一下有关Kdtree的相关概念&#xff0c;它是一维线段树的多维推广。Kd-tree常用在激光点云编程中使用&#xff0c;Kd-tree简称k维树&#xff0c;是一种空间划分的数据结构&#xff0c;常被用于高维空间中的搜索&#xff0c;比如范围搜索和最近邻…

动态规划问题——最长公共子序列问题

题目: 给定两个字符串 str1 和 str2 &#xff0c;返回两个字符串的最长公共子序列。 举例&#xff1a; str1 "1A2C3D4B56" str2 "B1D23CA45B6A" 最长公共子序列为&#xff1a;"123456" 或 "12C4B6" 返回哪个都行 思路&#xf…

「内核知识」Linux下的系统调用write

本文以x86_64平台为例&#xff0c;分析linux下的系统调用是如何被执行的。 假设目标系统调用是&#xff0c;其对应的内核源码为&#xff1a; // fs/read_write.c SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,size_t, count) {return ksys_write(fd, …

通过国产化低代码平台搭建设备管理系统,助力中国航天企业信息化建设

编者按&#xff1a;掌握软件自主权&#xff0c;支持信创国产化。本文分析了国产化低代码平台的意义&#xff0c;并介绍了低低代码平台是如何为航天企业提高信息化建设水平的。 关键词&#xff1a;国产化&#xff0c;第三方对接能力&#xff0c;文件管理 以容器、微服务、DevOp…

Linux内核中的open方法

在linux下&#xff0c;假设我们想打开文件/dev/tty&#xff0c;我们可以使用系统调用open&#xff0c;比如&#xff1a; int fd open("/dev/tty", O_RDWR, 0); 本文将从源码角度看下&#xff0c;在linux内核中&#xff0c;open方法是如何打开文件的。 首先看下入…

【opencv】centos下opencv的编译(带opencv_contrib扩展包)

目录1.安装cmake2.opencv安装文件准备可选安装3.进行编译4.进行安装5.使用测试编译步骤&#xff1a;1.安装cmake 安装wget: 应该已安装gcc工具套组&#xff1a; yum install sudo yum install -y gcc gcc-c make automake yum install -y wget wget https://cmake.org/files…

【树莓派不吃灰】兄弟连篇④ Shell编程

目录1、Shell基础1.1 脚本执行方式1.1.1 echo1.1.2 脚本执行1.2 Bash基本功能1.2.1 history1.2.2 命令补全1.2.3 命令别名1.2.4 常用快捷键1.2.5 输出输入重定向1.2.6 多命令顺序执行与管道符1.2.7 通配符和特殊符号1.3 Bash变量1.3.1 用户自定义变量1.3.2 环境变量1.3.3 位置变…

Hudi入门到实战

简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&#xff0c;同时保持…

用于医学诊断的菁染料ICG-Sulfo-OSu,活性基团修饰ICG

英文名&#xff1a;ICG-Sulfo-EG4-OSu 激发波长: 780nm; 发射波长: 800nm 分子量: 1777.36 溶剂:DMSO 凯新生物描述&#xff1a; (ICG)是一种用于医学诊断的菁染料。它用于测定心输出量、肝功能和肝脏血流量&#xff0c;以及用于眼科血管造影。它的峰值光谱吸收接近800纳米…

【课程整理】随机系统期末整理

文章目录1 概率论部分 (1-4)概率空间随机变量概率分布随机变量的函数仍然是随机变量条件期望2 随机过程 (5-7)随机过程Martingale停时马尔科夫链3 参数估计 (8-10)参数估计问题充分统计量贝叶斯估计非随机估计部分思维导图如下&#xff0c;私信发送html完整版 1 概率论部分 (1-…

3.path路径模块

目录 1 路径问题 2 直接给绝对路径 3 用 __dirname 表示绝对路径 4 path模块常用方法 4.1 路径拼接 path.join() 4.2 从路径字符串中解析出文件名 path.basename() 4.3 获取路径中的扩展名 path.extname() 1 路径问题 当我们使用 ./ 或是 ../ 表示相对路径的时…

小林Coding阅读笔记:操作系统篇之硬件结构,中断问题

前言 参考/导流&#xff1a; 小林coding - 2.6 什么是软中断&#xff1f;学习意义 学习CPU与外设如何去提升处理效率的设计思想&#xff0c;异步机制的理解与借鉴掌握相关的Linux命令&#xff0c;帮助问题排查 相关说明 该篇博文是个人阅读的重要梳理&#xff0c;仅做简单参…

【修饰性PEG供应商】mPEG-DBCO_DBCO mPEG_甲氧基聚乙二醇环辛炔

【产品描述】 西安凯新生物科技有限公司是国内业PEG供应商&#xff0c;可以提供不同分子量的PEG衍生物&#xff0c;小分子PEG的循环节可以做到1-36个&#xff0c;高分子PEG分子量从1000-40000不等&#xff0c;可以修饰的基团有&#xff1a;氨基类&#xff0c;NHBOC类&#xff0…

多层板PCB设计中电源平面相对地平面为什么要进行内缩

大家是否观察过&#xff0c;有一些人绘制的PCB&#xff0c;在GND层和电源层会进行一定程度的内缩设计&#xff0c;那么大家有没有想过为什么要内缩呢。需要搞清楚这个问题&#xff0c;我们需要来先了解一个知识点&#xff0c;那就是“20H”原则&#xff1a; 20H原则主要是为了减…