目录
一、理论基础
(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]作为对发包间隔进行限制,如式所示:
整个算法的整体流程图如下所示:
二、核心程序
-
clc;
-
clear;
-
close all;
-
warning off;
-
-
%一次待发送总数据包大小为
25kB
-
Pg_Size_all =
25;
-
Pg_Size_sub =
4;
-
Time =
100;
-
%仿真时间为
4000ms
-
Times =
8000;
-
-
%注入背景流量,使得网络进入拥塞状态,即网络时延明显变大,时延抖动加剧,
-
%空闲状态下时延值要求在
30~
60ms,拥塞状态下要求在
120~
180ms,我们要对比的区间就是在拥塞状态下。
-
MTKL =
100;%蒙特卡洛循环次数
-
DBL1 = cell(
1,MTKL);
-
for jj =
1:MTKL
-
jj
-
RandStream.setDefaultStream(RandStream(
'mt19937ar',
'seed',jj));
-
DBL2 = [];
-
%即能够存放
1000kB数据量
-
ability =
4.4;%网络(FIFO)
1ms内传输能力
-
FIFO_Depth =
200;
-
bg_Size = zeros(
1,Times);
-
pg_Size = zeros(
1,Times);
-
FIFO_Size = FIFO_Depth*ones(
1,Times);
-
DB =
0;%定义丢包次数
-
ALL =
0;%总发送次数
-
for i =
1:Times
-
%发送数据包,原始传输方法,每
100ms发送一次
-
if
mod(i,
100) ==
1
-
pg_Size(i) = Pg_Size_sub;
-
ALL = ALL +
1;
-
else
-
pg_Size(i) =
0;
-
end
-
%建立一个虚拟的FIFO,当网络空闲的时候,数据包通过这个FIFO需要
-
%产生随机大小的背景流量填充到FIFO中
-
bg_Size(i) =
floor(
8*rand(
1,
1))+
1;
-
%计算当前时刻网络中的剩余符合流量
-
if i ==
1
-
FIFO_Size(i)=
max(FIFO_Depth - bg_Size(i) - pg_Size(i) + ability,
0);
-
else
-
FIFO_Size(i)=
max(FIFO_Size(i
-1) - bg_Size(i) - pg_Size(i) + ability,
0);
-
end
-
%判断是否丢包
-
if
mod(i,
100) ==
1
-
if FIFO_Size(i) < Pg_Size_sub%丢包
-
DB = DB +
1;
-
else
-
%在等候时间内,以一个小概率事件丢包
-
P = rand();
-
if P <
0.01
-
DB = DB +
1;
-
else
-
DB = DB;
-
end
-
end
-
end
-
%计算当前环境下的丢包变换曲线并显示最后的丢包率值
-
DBL2(ALL) = DB/ALL;
-
end
-
DBL1{jj} = DBL2;
-
Lens(jj) = ALL;
-
end
-
-
%计算均值
-
DBLavg = zeros(
1,
min(Lens));
-
for i =
1:
min(Lens)
-
tmps =
0;
-
for jj =
1:MTKL
-
tmps = tmps + DBL1{jj}(i);
-
end
-
DBLavg(i) = tmps/MTKL;
-
end
-
figure;
-
subplot(
211);
-
plot(FIFO_Size);
-
xlabel(
'时间');
-
ylabel(
'网络流量承载能力变换情况');
-
grid on
-
subplot(
212)
-
plot(
100*DBLavg,
'b-*');
-
xlabel(
'传输次数');
-
ylabel(
'丢包率');
-
grid on
-
STR = [
'最终丢包率:',num2str(
100*DBL2(
end)),
'%'];
-
text(length(DBL2)/
2,
70,STR);
-
axis([
0,length(DBL2),
0,
100]);
三、测试结果
A12-12
转载:https://blog.csdn.net/ccsss22/article/details/127705289