GPSR路由算法的MATLAB实现

news2024/11/16 8:24:52

GPSR基于节点地理位置路由信息,采用贪婪策略和右手准则的结合在邻居节点中选择下一跳节点进行数据转发。节点在进行路由选择时,只需知道自己、邻居和目标节点的地理位置信息,无需维护全局网络的链路状态,这在很大程度上降低了网络开销。同时,节点在数据转发时总是选择比自己近的且到目标节点距离最近的邻居节点作为下一跳。这不仅减少了所选路径的跳数,而且缩短了数据传输的路径总长度,整体降低了WSNs的能量消耗,能有效提高路径QoS时延性能和延长网络生命周期。

主程序代码如下: 
%% GPSR路由算法改进
%%所有传感器节点分配消息发送到目的地
clear all;close all ;clc;%清除变量
randn('state', sum(100*clock));
%% ------------------参数设置开始------------------------------
area_length = 100;%区域
area_wide = 100;%区域
Range = 20;%节点最大传递范围
node_energy=100;%节点能源
node_down=0.4;%节点能量衰减系数
num_node = 60;  %节点数
node_near=0.3;%节点紧致度,也即节点间距离不能小于0.3*Range
sent_number=20;
%% ------------------参数设置结束------------------------------
%% --------------------坐标设置开始----------------------------
%% 计算出目标节点坐标、源节点坐标、各路由节点几何位置
node=node_position(area_length,area_wide,num_node,node_energy,Range,node_near);

% 计算距离表
Dtable=distance_table(node);
%计算拓扑结构表
Ttable=topo_table(node,Range,Dtable);
x=1:num_node;
Ttable(x).topolopy;
RNG_Ttable=RNG_topology(node,Dtable,Ttable);
%% ----------------------坐标设置结束--------------------------
%% -------------------计算距离表和拓扑关系----------------------

%% -------------------贪婪算法开始-------------
route_length=zeros(sent_number,1);
for k1=1:sent_number
    %随机生成源节点、目标节点
    s1=randperm(num_node);
    v1=find(s1==1);%源节点
    v2=find(s1==2);%目标节点
    %确定源节点、目标节点
    for i=1:num_node
        node(i).class=0;
        if i==v1
            node(i).class=1;
            number_source=i;
        end
        if i==v2
            node(i).class=2;
            number_dem=i;
        end
    end
    %计算距离
    distance_s2d=Dtable(number_source,number_dem);%距离初始化
    route=[number_source];%路径初始化
    Ttable01=Ttable;%临时拓扑赋值,防止搞坏原始拓扑集
    iter_number=0;
    %% GPRS主函数
    while distance_s2d~=0
        %% 判断死链
        if isempty(route)
            disp('能量耗尽,无法产生路由路径');
            break;
        end
        
        curr_node=route(end);%路径当前最后一个节点
        curr_topolopy=Ttable01(curr_node).topolopy;%获取当前拓扑相邻集合
        a03=numel(find(curr_topolopy==number_dem));
        if a03>0%存在
            route=[route number_dem];
            break;
        end
        
        %% ------------------删除curr_topolopy中属于route的节点开始-----
        n=length(route);%计算route长度
        for k=1:n
            v01=find(curr_topolopy==route(k));%route(k)是不是curr_topolopy的成员
            if numel(v01)>0%是成员
                curr_topolopy(v01)=[];%删除该元素
            end
        end
        %% ------------------删除curr_topolopy中属于route的节点结束-----
        %% ------------------删除curr_topolopy中属于比route(end)离目的节点距离远的开始-----
        distance_route_end=Dtable(route(end),number_dem);
        distance_topolopy=Dtable(curr_topolopy,number_dem);
        v4=find(distance_topolopy<distance_route_end);%找出距离小于当前节点的节点
        curr_topolopy=curr_topolopy(v4);%更新拓扑相邻集合
        %% ------------------删除curr_topolopy中属于比route(end)离目的节点距离远的结束-----
        if ~isempty(curr_topolopy)%拓扑相邻集合非空就找下
            curr_distance=Dtable(curr_topolopy,number_dem);%获取当前拓扑相邻集合与目的地节点距离集合
            [dis01,index01]=min(curr_distance);%排序
            
            next_node=curr_topolopy(index01(1));
            route=[route next_node];
            distance_s2d=Dtable(number_source,route(end));%重新计算距离
            
        else%如果是空的,进入 模式
            s4=RNG_Ttable(route(end),:);
            v4=find(s4==1);
            if numel(v4)>0
                s5=randperm(numel(v4));
                v5=find(s5==1);
                next_node=v4(v5);
                route=[route next_node];
                distance_s2d=Dtable(number_source,route(end));%重新计算距离
            else
                %% 从倒数第二个路径点的拓扑相邻集合删除当前这节点
                if length(route)>=2
                    a01=Ttable01(route(end-1)).topolopy;%上一个节点
                    a01(find(a01==curr_node))=[];
                    Ttable01(route(end-1)).topolopy=a01;
                    %% 从当前路径中删除当前路径点
                    route(end)=[];%删掉最后一个
                else
                    disp('能量耗尽,无法产生路由路径');
                    break;
                end
            end
        end
        iter_number=iter_number+1;
    end
    disp('route of GPRS')
    route
    %% 更新节点能量
    [k31,k32]=size(route);
    for i=1:k32
        b01=node_down*node_energy;
        node(route(i)).energy=node(route(i)).energy-b01;
    end
    %% 更新拓扑表
    Ttable=topo_table(node,Range,Dtable);
    %% 更新RNG_topology
    % RNG_Ttable=RNG_topology(node,Dtable,Ttable);%这个太慢,因为有多层嵌套循环,计算距离,运算量太大
    RNG_Ttable=RNG_topology_opt(node,RNG_Ttable);
    %绘图
    s='route of GPRS';
    %绘制路由图
    draw_GPRS_route(node,route,Range,s);
    route_length(k1)=length(route);
end

%% -------------------贪婪算法结束-------------
route_length

程序结果: 

参考文献:

1.改进的GPSR模型及其仿真分析,吴三斌,王小明,杨 涛,付 红

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

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

相关文章

VM下Unbunt虚拟机上网设置

系列文章目录 VM下Unbunt虚拟机上网设置 VM虚拟机上网设置 系列文章目录一、VM虚拟机上网设置 一、VM虚拟机上网设置 右击VM软件中你需要设置的虚拟机&#xff0c;选择设置 宿主机如果你用的是笔记本外加WIFI连接选择NAT网络模式 进入虚拟机看能否上网 不行的话&#xff0c;进…

全网最详细的Cortex-M0指令集汇总

文章目录 Thumb指令集Coretx-M0汇编语言格式寄存器访问指令&#xff1a;MOVEMOV Rd,#immed8.MOV Rd,RmMOVS Rd,#immed8MOVS Rd,RmMRS Rd,SpecialRegMSR SpecialReg,Rd 存储器访问指令&#xff1a;LOADLDR Rt,[Rn,Rm]LDRH Rt,[Rn,Rm]LDRB Rt,[Rn,Rm]LDR Rt,[Rn,#immed5]LDRH Rt,…

VsCode CMake调试QT QString等变量不显示具体值,调试中查看qt源码 (可视化调试配置Natvis)

遇到的问题 当我们在VsCode使用CMake来调试QT程序时&#xff0c;可能会出现变量是十六进制的地址&#xff0c;而看不到具体的值。例如&#xff1a; 如何解决 这时候需要手动设置一下natvis &#xff08;资源以上传&#xff0c;可以直接下载&#xff09; 在.vscode文件下找到…

Go 虚拟环境管理工具 gvm 原理介绍与使用指南

本文谈下我对 Go 版本管理的一些想法。让后&#xff0c;我将介绍一个小工具&#xff0c;gvm。这个话题说起来也很简单&#xff0c;但如果想用的爽&#xff0c;还是要稍微梳理下。 背景介绍 Go 的版本管理&#xff0c;并非包的依赖管理&#xff0c;而且关于如何在不同的 Go 版…

配置dns主从服务器,实现正反向解析

一、安装bind服务 yum install bind -y二、修改主配置文件/etc/named.conf 三、配置数据配置文件/var/named/baidu 四、重启服务&#xff0c;进行测试 systemctl restart named

【进口控制器替代】基于Zynq-7020 FPGA的NI 8槽CompactRIO控制器

667 MHz双核CPU&#xff0c;512 MB DRAM&#xff0c;1 GB存储容量&#xff0c;Zynq-7020 FPGA&#xff0c;更宽工作温度范围&#xff0c;8槽CompactRIO控制器 cRIO-9068是一款坚固耐用的无风扇嵌入式控制器&#xff0c;可用于高级控制和监测应用。这款软件设计控制器搭载FPGA、…

链表的反转方法1--迭代法

// 链表头指针结构 typedef struct header {int length; //存储链表结点个数struct linklist *next;//指针域 } Header;// 链表结点结构 typedef struct linknode {int data;//数据域struct linknode* next;//指针域 } LinkNode; 迭代法1-初级版&#xff1a; //反转链表方式1 …

Web06--JavaScript基础02

1、JS流程控制语句 JS与Java一样&#xff0c;也有三个流程控制语句&#xff1a; 顺序结构 选择结构 循环结构 1.1 选择结构 1.1.1 if结构 <script type"text/javascript">if (条件表达式) {代码块;} else if(条件表达式){代码块;} else {代码块;} </scr…

Nas-FPN(CVPR 2019)原理与代码解析

paper&#xff1a;NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection third-party implementation&#xff1a;https://github.com/open-mmlab/mmdetection/tree/main/configs/nas_fpn 本文的创新点 本文采用神经网络结构搜索&#xff08;Neur…

bash 5.2中文修订4

Compound Commands 复合命令 复合命令是 shell 编程语言的结构。每个构造都以保留字或控制运算符开始&#xff0c;并以相应的保留字或运算符终止。与复合命令关联的任何重定向&#xff08;请参阅 Redirections &#xff09;都适用于该复合命令中的所有命令&#xff0c;除非显式…

高质量简历模板网站,免费、免费、免费

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

搜维尔科技:【简报】元宇宙数字人赛道,《莉思菱娜》

个性有些古灵精怪时儿安静时而吵闹&#xff0c;虽然以人类寿命来算已经200多岁但在 吸血鬼中还只是个小毛头&#xff0c;从中学开始喜欢打扮偏爱黑白灰色系的服装喜欢时 尚圈&#xff0c;立志想成为美妆或时尚网红不过目前还是学生&#xff0c;脸上的浅色血迹是纹身 贴纸&#…

Spark读取kafka(流式和批数据)

spark读取kafka&#xff08;批数据处理&#xff09; # 按照偏移量读取kafka数据 from pyspark.sql import SparkSessionss SparkSession.builder.getOrCreate()# spark读取kafka options {# 写kafka配置信息# 指定kafka的连接的broker服务节点信息kafka.bootstrap.servers: n…

《幻兽帕鲁》被指AI缝合,开发过程疑点重重,最后附游戏安装教程

由日本游戏工作室Pocketpair开发的《Palworld / 幻兽帕鲁》毫无疑问成为了2024年的首个巨热游戏&#xff01;上周五&#xff08;2024年1月19日&#xff09;游戏上线抢先体验&#xff0c;仅在3天内销量就已突破400万&#xff01;并于2024年1月21日创下了1291967名同时在线玩家的…

[ACM学习] 树形dp之换根

算法概述 总的来说&#xff1a; 题目描述&#xff1a;一棵树求哪一个节点为根时&#xff0c;XXX最大或最小 分为两步&#xff1a;1. 树形dp 2. 第二次dfs 问题引入 如果暴力就是 O(n^2) &#xff0c; 当从1到2的时候&#xff0c;2及其子树所有的深度都减一&#xff0c;其它…

手把手教你快速掌握连接远程git仓库or赋值远程仓库到本地并上传代码到gitee

1. 先去官网安装Git &#xff0c;这里不多赘述网上教程很多 2.1去gitee注册一个账号&#xff0c;然后去我的新建一个仓库&#xff0c;这里是演示一下新手第一次操作的流程 2.2设置仓库名称完成创建(这里的库名随便输入看自己)&#xff1a; 2.3 打开git bash 配置用户名&#x…

Kubernetes-Taint (污点)和 Toleration(容忍)

目录 一、Taint&#xff08;污点&#xff09; 1.污点的组成 2.污点的设置、查看和去除 3.污点实验&#xff1a; 二、Toleration&#xff08;容忍&#xff09; 1.容忍设置的方案 2.容忍实验&#xff1a; Taint 和 toleration 相互配合&#xff0c;可以用来避免 pod 被分配…

VUE3好看的我的家乡网站模板源码

文章目录 1.设计来源1.1 首页界面1.2 旅游导航界面1.3 上海景点界面1.4 上海美食界面1.5 上海故事界面1.6 联系我们界面1.7 在线留言界面 2.效果和结构2.1 动态效果2.2 代码结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

虹科方案丨湿热灭菌工艺验证解决方案,确保所有产品和容器达到无菌要求

来源&#xff1a;虹科环境监测技术 虹科方案丨湿热灭菌工艺验证解决方案&#xff0c;确保所有产品和容器达到无菌要求 原文链接&#xff1a;https://mp.weixin.qq.com/s/O-pKQdehB9mHSETpU8egbA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #蒸汽灭菌 #高压灭菌 …

小程序直播系统源码_报价与开发_OctShop

近几年&#xff0c;随着直播的火热&#xff0c;人们对于直播带货是相当的熟悉了&#xff0c;逐渐渗透到各行各业中&#xff0c;小程序直播可以实时的更全面的传递商品信息&#xff0c;同时还可以与主播进行互动&#xff0c;可以通过直播聚集的人气打造团购气氛&#xff0c;通过…