小言_互联网的博客

基于matlab的网络通信系统自适应传输模糊控制器的实现

222人阅读  评论(0)

目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

(1) 输入输出变量模糊划分

      本小节将依照FFSI推理方法建立自适应传输模糊控制器,首先对输入、输出变量进行模糊划分,以往返时延的差值和当前时刻的发包时间间隔Tc作为模糊控制器的输入,模糊控制器的输出是下一次发包时间间隔的调整,通过与当前时刻发包时间间隔Tc累加作为下一时刻的发包间隔Tn。

  • 往返时延差模糊划分

      根据第四章网络时延的测量可知,端到端网络时延整体上随时间变化幅度较大,不适合直接用RTT值作为模糊控制器的输入变量。本文采用当前时刻预测时延与当前时刻的往返时延值RTTc的差值作为ATFC的一个输入变量。的隶属度函数如图5.9所示,论域为[-15ms,15ms],共分为7个模糊等级,分别为:负大(NB)、负中(NM)、负小(NS)、零(ZE)、正小(PS)、正中(PM)、正大(PB)。

 ②当前发包间隔Tc模糊划分

      当前发包间隔Tc的隶属度函数如图5.10所示,Tc的论域为[100ms,500ms],共分为5模糊个等级,分别为:很短(S)、较短(SM)、中等(M)、较长(ML)、很长(L)。

 ③发包间隔的调整模糊划分

       图为发包间隔的调整的隶属度函数,的论域为[-200ms,200ms],共分为5个模糊等级,分别为较大减小(LD)、较小减小(SD)、不变(NC)、较小增大(SI)、较大增大(LI)。

       ATFC应用在网络拥塞场景下,当拥塞恶化时应增大发包间隔,减少网络拥塞对能耗数据包的影响,降低传输丢包率;当拥塞减缓时应减小发包间隔的原则,提高能耗数据包的传输效率。结合先验经验制定ATFC模糊控制规则如表所示。

Tc

NB

NM

NS

ZE

PS

PM

PB

S

NC

NC

NC

NC

SI

LI

LI

SM

SD

SD

SD

NC

SI

LI

LI

M

LD

SD

SD

NC

SI

SI

LI

ML

LD

LD

SD

NC

SI

SI

SI

L

LD

LD

LD

NC

NC

NC

NC

(3) 反模糊化

       通过式进行反模糊化求解,进一步将发包间隔调整与当前的发包间隔Tc累加计算下一次的的发包时间间隔Tn,同时为了避免累加之后Tn出现过大或者过小的情况,利用Tc的论域为[100ms,500ms]作为对发包间隔进行限制,如式所示:

整个算法的整体流程图如下所示:

 

二、核心程序


  
  1. clc;
  2. clear;
  3. close all;
  4. warning off;
  5. %一次待发送总数据包大小为 25kB
  6. Pg_Size_all = 25;
  7. Pg_Size_sub = 4;
  8. Time = 100;
  9. %仿真时间为 4000ms
  10. Times = 8000;
  11. %注入背景流量,使得网络进入拥塞状态,即网络时延明显变大,时延抖动加剧,
  12. %空闲状态下时延值要求在 30~ 60ms,拥塞状态下要求在 120~ 180ms,我们要对比的区间就是在拥塞状态下。
  13. MTKL = 100;%蒙特卡洛循环次数
  14. DBL1 = cell( 1,MTKL);
  15. for jj = 1:MTKL
  16. jj
  17. RandStream.setDefaultStream(RandStream( 'mt19937ar', 'seed',jj));
  18. DBL2 = [];
  19. %即能够存放 1000kB数据量
  20. ability = 4.4;%网络(FIFO) 1ms内传输能力
  21. FIFO_Depth = 200;
  22. bg_Size = zeros( 1,Times);
  23. pg_Size = zeros( 1,Times);
  24. FIFO_Size = FIFO_Depth*ones( 1,Times);
  25. DB = 0;%定义丢包次数
  26. ALL = 0;%总发送次数
  27. for i = 1:Times
  28. %发送数据包,原始传输方法,每 100ms发送一次
  29. if mod(i, 100) == 1
  30. pg_Size(i) = Pg_Size_sub;
  31. ALL = ALL + 1;
  32. else
  33. pg_Size(i) = 0;
  34. end
  35. %建立一个虚拟的FIFO,当网络空闲的时候,数据包通过这个FIFO需要
  36. %产生随机大小的背景流量填充到FIFO中
  37. bg_Size(i) = floor( 8*rand( 1, 1))+ 1;
  38. %计算当前时刻网络中的剩余符合流量
  39. if i == 1
  40. FIFO_Size(i)= max(FIFO_Depth - bg_Size(i) - pg_Size(i) + ability, 0);
  41. else
  42. FIFO_Size(i)= max(FIFO_Size(i -1) - bg_Size(i) - pg_Size(i) + ability, 0);
  43. end
  44. %判断是否丢包
  45. if mod(i, 100) == 1
  46. if FIFO_Size(i) < Pg_Size_sub%丢包
  47. DB = DB + 1;
  48. else
  49. %在等候时间内,以一个小概率事件丢包
  50. P = rand();
  51. if P < 0.01
  52. DB = DB + 1;
  53. else
  54. DB = DB;
  55. end
  56. end
  57. end
  58. %计算当前环境下的丢包变换曲线并显示最后的丢包率值
  59. DBL2(ALL) = DB/ALL;
  60. end
  61. DBL1{jj} = DBL2;
  62. Lens(jj) = ALL;
  63. end
  64. %计算均值
  65. DBLavg = zeros( 1, min(Lens));
  66. for i = 1: min(Lens)
  67. tmps = 0;
  68. for jj = 1:MTKL
  69. tmps = tmps + DBL1{jj}(i);
  70. end
  71. DBLavg(i) = tmps/MTKL;
  72. end
  73. figure;
  74. subplot( 211);
  75. plot(FIFO_Size);
  76. xlabel( '时间');
  77. ylabel( '网络流量承载能力变换情况');
  78. grid on
  79. subplot( 212)
  80. plot( 100*DBLavg, 'b-*');
  81. xlabel( '传输次数');
  82. ylabel( '丢包率');
  83. grid on
  84. STR = [ '最终丢包率:',num2str( 100*DBL2( end)), '%'];
  85. text(length(DBL2)/ 2, 70,STR);
  86. axis([ 0,length(DBL2), 0, 100]);

三、测试结果

 

 

 

 A12-12


转载:https://blog.csdn.net/ccsss22/article/details/127705289
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场