zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【MORE协议】基于MORE的改进协议设计的MATLAB仿真

MATLAB协议 基于 设计 仿真 改进 more
2023-09-11 14:15:33 时间

0.完整源码获得方式

方式1:微信或者QQ联系博主

方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码

1.软件版本

MATLAB2021a

2.本算法理论知识

       随着无线通信和移动计算技术的飞速发展,人们对无线宽带接入提出了更高的要求。作为一种可以解决“最后一公里”瓶颈问题的新型网络结构,无线网状网(wireless mesh network, WMN)正受到普遍的关注。无线网状网络也称为“多跳(multi-hop)”网络,它是一种与传统无线网络完全不同的新型无线网络技术。在传统的无线局域网(WLAN)中,每个客户端均通过一条与固定接入点(access point, AP)相连的无线链路来访问网络,用户之间如果要进行相互通信,必须首先访问一个AP,这种网络结构被称为单跳网络。而在无线网状网络中,任何无线设备节点都可以同时作为AP和路由器,网络中的每个节点都可以发送和接受信号,每个节点都可以与一个或者多个对等节点进行直接通信。这种结构的最大好处在于如果最近的AP由于流量过大而导致拥塞的话,那么数据可以自动重新路由到一个通信流量较小的邻近节点进行传输。依此类推,数据包还可以根据网络的情况,继续路由到与之最近的下一个节点进行传输,直到到达最终目的地为止。这样的访问方式就是多跳访问。

       但是这种通过路由策略来解决拥塞,并不能真正有效的提高整个网络的吞吐量。因为在传统的网络中,端到端信息采用存储转发机制来传送数据。当若干个独立的数据包同时到达某个中转节点时,该节点在一个时间单元内仅能转发其中一个数据包,而其余的数据包将被送至节点的输出队列中。当网络负载增大时,由于输出队列长度的限制会出现节点转发的数据丢失和重传的情况。这种现象会造成网络拥塞,降低网络的吞吐量。可见,通过路由策略只能缓解网络拥塞对端到端通信的影响,但是无助于提高整个网络的吞吐量。如何提高整个网络的吞吐量以及有效解决网络拥塞问题,已成为无线网状网络的研究热点。随着网络信息论的引入,机会路由和网络编码技术受到越来越多的关注。因此,本文将基于网络编码的机会路由协议作为研究内容进行研究。

3.核心代码

clc;
clear;
close all;
warning off;


%%
%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境
%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境
%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境%模拟产生网络环境
%每次产生的随机数固定
s = RandStream.create('mt19937ar','seed',1);
RandStream.setDefaultStream(s);
%首先顶一个无线传感器网络环境
noOfNodes     = 30;%网络节点个数,仿真的时候,网络节点不易过多,会out of memory
L             = 50;
R             = 20; %相邻规则,小于R,表示相邻
MAX_INTER     = 50;%最大迭代次数
rand('state', 3); %节点状态初始化


figure;
clf;grid on;
hold on;
netXloc = rand(1,noOfNodes)*L;
netYloc = rand(1,noOfNodes)*L;
for i = 1:noOfNodes
    plot(netXloc(i), netYloc(i), 'r.');
    text(netXloc(i)+3, netYloc(i)+3, num2str(i));
    for j = 1:noOfNodes
        distance = sqrt((netXloc(i) - netXloc(j))^2 + (netYloc(i) - netYloc(j))^2);
        %标志相邻节点,使用1表示
        if distance <= R
            matrix(i, j) = 1; % there is a link;
            line([netXloc(i) netXloc(j)], [netYloc(i) netYloc(j)], 'LineStyle', ':');
            else
            matrix(i, j) = 0;
        end
    end
end
%matrix为节点连接图,如果matrix(i,j)=1,说明节点i和节点j相邻,否则不相邻

%%
%基于传统MORE协议进行传输%基于传统MORE协议进行传输%基于传统MORE协议进行传输%基于传统MORE协议进行传输
%基于传统MORE协议进行传输%基于传统MORE协议进行传输%基于传统MORE协议进行传输%基于传统MORE协议进行传输
%基于传统MORE协议进行传输%基于传统MORE协议进行传输%基于传统MORE协议进行传输%基于传统MORE协议进行传输
%每包大小
dd  = 0;

for K = 80:5:160;
 
%每个组的数据段的比特数
N_byte        = floor(5000/K);
 

%定义编码矩阵
% c  = [1 1 1 1;
%      1 2 3 4;
%      1 0 0 0;
%      0 1 0 0];
c                = round(10*rand(K,K));
c(1+K/2:K,:)     = 0;
c(1+K/2:K,1:K/2) = eye(K/2);
%成功发送概率
df = 0.95;
%成功到达概率
dr = 0.95;
%定义一个计数器,统计接收包计数器
Count = 0;
%定义应答信号
ACK   = 0;
%设置固定的探测包大小S
S     = 32;%设置探测包的大小为32
%定时间隔
T     = 0.15; 
T_sub = 10/512;%定义每次传输时延
NN    = 0; 
 
alpha = 0.5;

%本算法是基于固定报文长度的探测方法的原MORE协议设计 
%下面利用MORE协议进行网络数据包的传输
for i = 1:noOfNodes
    for j = 1:noOfNodes
        NN = NN + 1;
        NN
        
        waitbar(NN/(noOfNodes*noOfNodes));
        %******************************************************************
        if matrix(i, j) == 1%进行传输     
           %随机产生二进制比特率数据作为发送的数据
           %对多次结果求平均
           for mm = 1:1
           s = RandStream.create('mt19937ar','seed',mm);
           
           Data_source = double(rand(1,K*N_byte)>=0.5); 
           %分批次发送
           n1          = 0;
           ACK         = 1;
           times       = 0;
           PS          = 0;
           Num         = 0;
           Count       = 0;
           tmp         = T/T_sub;
           throughs    = 0;
           S           = 32;          
           while(n1 < N_byte)  
               %定义一个计数器,统计接收包计数器
               if ACK == 1%接收到应答信号,则发送下一段数据
                  %分段
                  n1               = n1 + 1;
                  Data_trans{n1}   = Data_source(K*(n1-1)+1:K*n1);
               else
                  %否则重复发送当前的信号
                  n1               = n1; 
                  Data_trans{n1}   = Data_source(K*(n1-1)+1:K*n1);
               end 
               
               
               %进行线性编码
               Data_Encode{n1}  = c*Data_trans{n1}';
               
               %向节点B发送两个
               %成功发送概率事件
               Pf = 1 - rand();
               if Pf > 1 - df
                  Data_Encode_rightB{n1} = Data_Encode{1,n1}(1:K-2);%成功发送
               else
                  Data_Encode_rightB{n1} = 0*Data_Encode{1,n1}(1:K-2);%错误发送
               end
               %向节点C发送两个
               %成功发送概率事件
               Pf = 1 - rand();
               if Pf > 1 - df
                  Data_Encode_rightC{n1} = Data_Encode{1,n1}(2:K-1);%成功发送
               else
                  Data_Encode_rightC{n1} = 0*Data_Encode{1,n1}(2:K-1);%错误发送
               end               
               %向节点D发送两个
               %成功发送概率事件
               Pf = 1 - rand();
               if Pf > 1 - df
                  Data_Encode_rightD{n1} = Data_Encode{1,n1}(3:K);%成功发送
               else
                  Data_Encode_rightD{n1} = 0*Data_Encode{1,n1}(3:K);%错误发送
               end                
               
               
               
               
               
               
               %成功接收概率事件
               Pr = 1 - rand();
               if Pr > 1 - dr
                  Data_Decode_right{1,n1} =   [(Data_Encode_rightB{1,n1}(1:K-2))',(Data_Encode_rightC{1,n1}(K-2))',(Data_Encode_rightD{1,n1}(K-2))'];%成功发送
               else
                  Data_Decode_right{1,n1} = 0*[(Data_Encode_rightB{1,n1}(1:K-2))',(Data_Encode_rightC{1,n1}(K-2))',(Data_Encode_rightD{1,n1}(K-2))'];%错误发送
               end   
               
               
               
               %进行解密
               Data_Decode{n1}  = double(inv(c)*(Data_Decode_right{n1})'>0.5);
               
               
               
               %计数器计数
               for iii = 1:K
                   tmpss(iii) = (Data_Decode{1,n1}(iii) == Data_trans{1,n1}(iii));
               end
               
               
               
               if  sum(tmpss) == K
                  ACK   = 1;%成功接收了ACK=1;
               else
                  ACK   = 0;%不成功接收了ACK=0;
               end
               
 
               %对于传统MORE,S值不改变
               if times > T
                  S     = alpha * PS/Num + (1-alpha)*S;
                  PS    = 0;
                  Num   = 0;
                  times = 0;
                  Count = Count;
               else
                  S     = S;
                  PS    = PS  + 1;%假设发送数据包大小psi为1
                  Num   = Num + 1;  
                  times = times + T_sub;
                  Count = Count + 1;  
               end
               
               
               %计算每次发送成功需要的次数
               if n1 == 1
                  EXT(n1) = 1/(Pf*Pr);
               else
                  EXT(n1) = EXT(n1-1) + 1/(Pf*Pr); 
               end
           end
           Throughput2(mm) = tmp*N_byte/(Count*T_sub); 
           
           end
           
           %计算吞吐量
           Throughput(NN) = mean(Throughput2);          
           end
           
 
        end
        %******************************************************************
end
 
dd = dd + 1;
Throughput_sum(dd) = sum(Throughput);
end




ind = 0;

for i = 80:5:160;
    ind     = ind + 1;
    ns(ind) = i-70;
end

figure;
plot(ns,Throughput_sum,'b-o');
xlabel('包个数/段');
ylabel('吞吐量bps');
grid on;
axis([10,90,20000,150000]);


save MORE+_fig1.mat ns Throughput_sum








4.操作步骤与仿真结论

       其中代码文件夹中,有普通MORE文件夹和改进MORE文件夹以及两个算法的对比仿真m文件。分别运行MORE,MORE+,compared.m可以对MORE算法和MORE+算法进行仿真吞吐量分析,以及最后结果的对比。

       随每段中数据包个数的变化,MORE与MORE+(此时MORE+的值固定,分别取0.1和0.5,也就是两条𝛂值不同的MORE+曲线)的吞吐量对比,例如:传输500个数据包,让每段中数据包的个数(即K值)从10到100变化,绘制K与吞吐量的关系曲线;

      这里取K=0.5.两个算法的仿真对比效果如下所示:

      随着传输数据包个数的变化,MORE与MORE+(此时MORE+的值固定,分别取0.1和0.5)的吞吐量对比,此时每段中数据包的个数K固定,如50.改变传输数据包的个数,如从50到500,绘制传输数据包个数与吞吐量的关系曲线。

      这里取K=0.5.两个算法的仿真对比效果如下所示:

5.参考文献

[1]王晓燕. 无线传感器网络机会路由协议—MORE的优化[J]. 电脑开发与应用, 2012, 25(2):4.

A-12-06