GPSR路由算法的MATLAB实现

这篇具有很好参考价值的文章主要介绍了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

程序结果: 

GPSR路由算法的MATLAB实现,算法,matlab

GPSR路由算法的MATLAB实现,算法,matlab

参考文献:

1.改进的GPSR模型及其仿真分析,吴三斌,王小明,杨 涛,付 红文章来源地址https://www.toymoban.com/news/detail-821400.html

到了这里,关于GPSR路由算法的MATLAB实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab实现PSO算法

    PSO(Particle Swarm Optimization)是一种优化算法,它模拟了鸟群或鱼群等动物的集体行为,通过群体智能的方式来解决优化问题。PSO算法最初由Kennedy和Eberhart在1995年提出,近年来得到了广泛的应用。 本文将介绍如何使用Matlab实现PSO算法来解决一个简单的优化问题。 我们将使用

    2024年02月09日
    浏览(31)
  • 大津算法的matlab实现

    一、算法功能 ​ 图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。 ​ 大津算法也称最大类间差法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮

    2024年02月08日
    浏览(33)
  • 贪心算法-MATLAB实现

    贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生出一个全局最优解。 贪心选择 :在做贪心选择时,应满足可行性,即必须满足问题的约束条件。 局部最优 :通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一

    2024年02月16日
    浏览(28)
  • Matlab迭代算法实现

    牛顿迭代法 雅可比迭代法 高斯赛德迭代法 超松弛迭代法(SOR) 共轭迭代法 代码实现案例: 代码实现案例: 代码实现案例: 代码实现案例: 代码实现案例:

    2024年02月14日
    浏览(35)
  • 智能优化算法——哈里鹰算法(Matlab实现)

    目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图  4 matlab代码及结果 4.1 代码 4.2 结果  哈里斯鹰算法(Harris Hawks Optimization,HHO),是由Ali Asghar Heidari和Seyedali Mrjaili于2019年提出的一种新型仿生智能优化算

    2024年02月13日
    浏览(45)
  • MATLAB算法实战应用案例精讲-【智能优化算法】哈里斯鹰(HHO)(附matlab代码实现)

    目录 前言 算法原理 算法思想 1. 探索阶段 2.探索到开发的转换 3

    2024年02月16日
    浏览(45)
  • 秦九昭算法——MATLAB实现

            对于多项式 而言,要计算时的函数值时,需要进行 次乘法和n次加法,其时间复杂度为.         那我们该用一个什么用的方式来降低其时间复杂度呢? (1条消息) 一套图 搞懂“时间复杂度”_12 26 25的博客-CSDN博客 https://blog.csdn.net/qq_41523096/article/details/82142747?ops_

    2024年02月07日
    浏览(27)
  • 【Matlab系列】基于DCT和置乱算法的视频水印Matlab实现

    Date: 2022.4.5     数字水印技术一般用于版权认证。在实际使用中,嵌入水印的鲁棒性就显得非常重要。通常会采用各种方式进行攻击测试,比如加噪滤波,缩放、旋转、剪切、JPEG压缩等。本文讲述了采用置乱技术进行嵌入水印和提取水印,并加入滤波、剪切、椒盐噪声、

    2024年02月01日
    浏览(46)
  • 聚类算法综述及Matlab实现

    聚类算法是一种无监督学习方法,它将数据集中的对象分组成不同的簇(cluster),使得同一簇内的对象相似度高,而不同簇之间的相似度低。聚类算法在数据挖掘、图像处理、模式识别等领域都有广泛应用。 常用的聚类算法包括K-Means、层次聚类(Hierarchical Clustering)、DBSCAN、Mea

    2024年02月11日
    浏览(39)
  • DBSCAN聚类算法——MATLAB实现

        声明:本文修改自《 数学建模清风 》老师的代码    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包