拿求解流量矩阵的方程来讲:
Y = A X Y = AX Y=AX
原因:OD对的数目是远比实际链路的数目要多,未知数的个数远比方程组的个数要多。
对线性方程组,其解的数量可以根据A的秩来讨论。A ∈ R (m × n) 。
A X = Y AX=Y AX=Y
对于 Abilene,simpleGravity 和 generalGravity 给出了相似的结果。但在其他网络中,generalTomogravity 往往表现得非常好。
知识补充:累积分布函数CDF
累积分布函数 (CDF) 计算给定 x 值的累积概率。可使用 CDF 确定取自总体的随机观测值将小于或等于特定值的概率。还可以使用此信息来确定观测值将大于特定值或介于两个值之间的概率。
关键代码如下:
# =============绘制simpleGravity-cdf图===============
ecdf = sm.distributions.ECDF(pccs_sG)
# 等差数列,用于绘制X轴数据
x1 = np.linspace(min(pccs_sG), max(pccs_sG))
# x轴数据上值对应的累计密度概率
y1 = ecdf(x1)
可以看出通用重力模型效果优于简单重力模型,相关系数更接近1。
寻找SG与GG相关系数的上下限(X02文件):
通过计算144个OD对在一周时间内的总流量值(每5分钟采样)可以看出,SG与GG的上限值对应的OD流为大流量OD,下限值对应的OD为小流量OD。可以得出结论:当OD流较大时,generalizedgravi与simplegravi模型估计较为准确。
首先分析links文件:
有30条链路为内部链路,12条为入站,12条为出站。
有12个节点。
图片来自:https://blog.csdn.net/canhui_wang/article/details/51322916
分析A文件:
link(x,y):链路对应links文件中的编号(1-54)
dmd(s,d):为OD对的路由路径,编号1-144(因为有12个节点,12✖12=144)
综上两个文件,可以得出路由矩阵为54✖144=7776。
由路由矩阵A(54✖144)和真实OD_1(144✖1)做矩阵乘法可以解出链路流量Y(54✖1)。
我们选择一个边缘节点:ATLA-M5进行分析(入站出站为同一节点)。
在links文件中找到对应编号:
有30条链路为内部链路,12条为入站,12条为出站。入站总流量与出站总流量应该是相等:
经验证计算正确:
T_ATLAM5=(Y[30]*Y[31])/Y_inbound # 与Y_outbound完全等价
五个流量矩阵的排列顺序依次为:
寻找规律,可以看出数组下标对应关系如下:
# Y[30] * Y[31]--simpleGravity_OD[0]
# Y[30] * Y[33]--simpleGravity_OD[1]
# Y[30] * Y[35]--simpleGravity_OD[2]
# Y[30] * Y[37]--simpleGravity_OD[3]
# Y[30] * Y[39]--simpleGravity_OD[4]
# Y[30] * Y[41]--simpleGravity_OD[5]
# Y[30] * Y[43]--simpleGravity_OD[6]
# Y[30] * Y[45]--simpleGravity_OD[7]
# Y[30] * Y[47]--simpleGravity_OD[8]
# Y[30] * Y[49]--simpleGravity_OD[9]
# Y[30] * Y[51]--simpleGravity_OD[10]
# Y[30] * Y[53]--simpleGravity_OD[11]
# Y[32] * Y[31]--simpleGravity_OD[12]
# Y[32] * Y[33]--simpleGravity_OD[13]
# Y[32] * Y[35]--simpleGravity_OD[14]
# Y[32] * Y[37]--simpleGravity_OD[15]
# Y[32] * Y[39]--simpleGravity_OD[16]
# Y[32] * Y[41]--simpleGravity_OD[17]
# Y[32] * Y[43]--simpleGravity_OD[18]
# Y[32] * Y[45]--simpleGravity_OD[19]
# Y[32] * Y[47]--simpleGravity_OD[20]
# Y[32] * Y[49]--simpleGravity_OD[21]
# Y[32] * Y[51]--simpleGravity_OD[22]
# Y[32] * Y[53]--simpleGravity_OD[23]
核心算法如下:
# 计算simplegravity模型估计出的流量矩阵:T_sG (时间为一周)
T_sG = np.zeros((2016,144), dtype=float)
S= (Y[0][30] * Y[0][31]) / Y_inbound[0]
for p in range(0,2016):
k = 31
t = 30
j = 0
for count in range(0, 12):
for i in range(0, 12):
T_sG[p][j] = (Y[p][t] * Y[p][k]) / Y_inbound[p] # 与Y_outbound完全等价
j = j + 1
if k < 54:
k = k + 2
if t < 54:
t = t + 2
k = 31
通过计算得出T_sG并重新作图:
将realOD换位数据给出的SG结果作图:
通过作图可以看出小流量OD的误差很大,离开了+/-20%的区域。
使用sklearn库中的mean_squared_error求出mse再开方,最后换算单位为Mbps(兆比特每秒)
通过求解24周所有OD的rmse来判断最好OD与最差OD:
rmse是一个1×144的数组:
通过求解可知,最好OD为第10条,最差OD为第32条。
分别画出他们一周流量图:
真实OD作图:
simplegravity模型数据作图:
在通信系统中“潮汐效应”是指工作时间人们在CBD区域大量聚集,下班后又向居民区大量迁徙的现象。这种现象引发了移动通信系统中话务量的流动,使得热点区域在特定时刻出现突发大话务量,导致网络拥塞、无法接入;对于建网初期的容量规划也带来一定的困难。而在应对该类型区域内大话务量流动的同时,实现降低建网成本,提升运营核心竞争力,成为摆在运营商面前的一道棘手难题。
从上图看,上面两条OD在周末时流量几乎为0,存在潮汐效应,下面我们找出144条OD中存在潮汐效应的OD。
144条OD流量的表格:
我们选取的日期段为 2004-03-08 (X02):
一周内流量之和最大的OD为第144条,流量最小OD为第109条:
寻找存在潮汐效应的OD:
我们通过观察每个OD周六日两天的流量的情况来判断OD是否存在潮汐效应,选取real_OD数组中第1440-2016行,有很多存在流量为0的OD则认为其存在潮汐效应。(我们假设出现流量为0的次数大于100的OD为存在潮汐效应)
画出部分OD的一周流量图可以发现确实存在潮汐效应。
模型估计结果最好的OD为第10个OD,最差为第32个OD,从文件A中找到:
link(x,y) dmd(s,d) link_index dmd_index frac
*,ATLA-M5 ATLA-M5,SNVAng 31 10 1 #最好OD
*,CHINng CHINng,LOSAng 35 32 1 #最差OD
算法好的时候,数据应该是附和万有引力模型的,从论文中的图6的累计分布函数中simplegravity对应的上下限可以得出结论:当OD流较大时,简单重力模型估计效果较好。
github仓库链接