GPSR路由算法的MATLAB实现

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模型及其仿真分析,吴三斌,王小明,杨 涛,付 红

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE进阶】 MyBatis使用注解实现增删改查

文章目录 &#x1f343;前言&#x1f334;传递参数&#x1f38b;增(Insert)&#x1f6a9;返回主键 &#x1f384;删(Delete)&#x1f332;改(Update)&#x1f333;查(Select)&#x1f6a9;起别名&#x1f6a9;结果映射&#x1f6a9;开启驼峰命名(推荐使用) ⭕总结 &#x1f343…

电源模块测试项目:输入低压点循环测试及测试方法

输入低压点循环测试是什么? 电源输入低压点循环测试是检测电源在低压条件下的性能和稳定性&#xff0c;它是一次电源模块的输入欠压点保护的设置回差测试。当输入电压较低&#xff0c;接近一次电源模块欠压点关断时&#xff0c;带载时欠压; 断后由于电源内阻原因&#xff0c;负…

初识Docker(架构、安装Docker)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中。这些容器可以在不同的计算平台上运行&#xff0c;如Linux和Windows&#xff0c;并且可以实现虚拟化。Docker 的设计目标是提供一种快速且轻量…

智能机器人与旋量代数(12)

Chapt 4. 旋量代数在机器人学中的应用 4.1 串联机器人正运动学的指数积(PoE, Product of Exponetial)公式 4.1.1 回顾&#xff1a;机器人正运动学的Denavit-Hartenberg (D-H)参数公式 D-H 建模法: D-H 建模方法是由 Denavit 和 Hartenberg (ASME, 1955) 提出的一种建模方法&…

谷歌浏览器新增3个重磅生成式AI!自动生成文本、壁纸等

1月24日&#xff0c;谷歌在官网宣布&#xff0c;在谷歌浏览器&#xff08;Chrome最新版本M121&#xff09;中新增自动生成文本、壁纸以及自动管理标签3个全新生成式AI功能&#xff0c; 这也是为数不多支持生成式AI的浏览器。需要注意的是&#xff0c;由于这三项功能处于预览测…

33、WEB攻防——通用漏洞文件上传中间件解析漏洞编辑器安全

文章目录 一、中间件文件解析——IIS&Apache&Nginx1、IIS2、Apache3、Nginx 二、web编辑器 一、中间件文件解析——IIS&Apache&Nginx 1、IIS IIS爆过漏洞的版本&#xff1a;IIS6.0&#xff08;windows server 2003&#xff09;、IIS7.0和IIS7.5&#xff08;w…

如何在CentOS使用docker-compose部署Apache Superset并实现公网访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

【云原生】Docker的安装和镜像操作

目录 什么是Docker&#xff1f; 容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; Docker与虚拟机的区别&#xff1a; 容器在内核中支持2种重要技术&#xff1a; Docker核心概念&#xff1a; 安装Docker 安装依赖包 设置阿里云镜像源 安装 Docker-CE并设置为开机…

简单Web UI 自动化测试框架 seldom

pyse 更名为 seldom WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动化测试框架。 特点 提供更加简单API编写自动化测试。提供脚手架&#xff0c;快速生成自动化测试项目。自动生成HTML测试报告生成。自带断言方…

vue3+ts+element-plus集成bpmn.js

Bpmn.js集成文档 说明&#xff1a; 本文档主要是作为集成&#xff0c;不是原创&#xff08;主要是填写转载他又让我写原文链接&#xff0c;但是我又没有原文链接哈哈哈&#xff09;&#xff0c;感谢以下参考博文。 本项目页面模板使用Geeker-Admin作为前端模板Geeker-Admin&a…

数据链路层——笔记·续

使用集线器的星形拓扑 传统以太网传输媒体&#xff1a;粗同轴电缆 -> 细同轴电缆 -> 双绞线。 采用双绞线的以太网采用星形拓扑。 在星形的中心则增加了一种可靠性非常高的设备&#xff0c;叫做集线器 (hub)。 传统以太网使用同轴电缆&#xff0c;采用总线形拓扑结构&am…

php no input file specified

一、修改 .user.ini 文件 内容 open_basedir/wab/led-sht.com/:/tmp/ led-sportslight.com是项目根目录位置 改好后保存并清空缓存硬刷新网站就行了 二、mkdir(): Permission denied /core/library/think/cache/driver/File.php 第 84 行左右 mkdir(): Permission denied 这个…

Windows AD 组策略 通过脚本修改管理员密码:以安全方式

因为本文主要讲的是通过脚本如何以安全方式设置密码&#xff0c;所以关于组策略如何设置请参考这里&#xff1a; WinServer 2019 AD 组策略 启用本地管理员账号&#xff0c;重置密码_ad域命令启用administrator账户-CSDN博客 我们首先要讲一下&#xff0c;以一般方法创建的脚…

FineReport链接本地DBeaver

finereport链接本地DBeaver fanruan.com/finereport/doc-view-101.html help.fanruan.com/finereport/doc-view-2583.html

PMP证书要怎么考,含金量怎么样?

PMP含金量更多的是“敲门砖”作用&#xff0c;公司招聘的门槛&#xff0c;现在坐项目的大部分都需要PMP/NPDP证书。 当然现在PMP管理模式也很热门&#xff0c;对企业发展很有利&#xff0c;各大企业都有引进改良应用在公司的项目上&#xff0c;之前在校友群里面大家在讨论PMP …

【MySQL源码】Seconds_Behind_Master是如何计算的

作为MySQL DBA&#xff0c;相信大家对参数 Seconds_Behind_Master 并不陌生&#xff0c;该字段的值可以通过 show slave status\G的输出&#xff0c;表示主从延迟的时间&#xff0c;单位为秒。监控主从延迟一般取这个值就足够了。0 表示无延迟&#xff0c;理想状态该值不要超…

selenium执行出现异常,SessionNotCreatedException ChromeDriver only supports

问题现状&#xff1a; 运行程序报错&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 121.0.6167.85 with binary path /App…

GraphicsMagick 的 OpenCL 开发记录(二十一)

文章目录 支持windows平台windows平台不能生成内核的.bin文件_aligned_free()和free()不匹配的问题 <2022-04-13 Wed> 支持windows平台 支持windows平台需要做的&#xff1a; 为GraphicsMagick/VisualMagick/configure/configure.exe增加“Enable OpenCL”多选框。 从…

【jQuery入门】链式编程、修改css、类操作和className的区别

文章目录 前言一、链式编程二、修改css2.1 获取css的值2.2 设置单个css属性2.3 设置类样式添加类移除类切换类 三、类操作与className的区别总结 前言 jQuery是一个流行的JavaScript库&#xff0c;广泛用于简化DOM操作和处理事件。在jQuery中&#xff0c;链式编程是一种强大的…

Tree-Shaking 作用和实现原理

一、什么是Tree-shaking Tree-shaking 它的名字来源于通过摇晃&#xff08;shake&#xff09;JavaScript代码的抽象语法树&#xff08;AST&#xff09;&#xff0c;是一种用于优化JavaScript代码的技术&#xff0c;主要用于移除未被使用的代码&#xff0c;使得最终生成的代码包…