• m半分布式JAC联合接纳控制与用户位置信息的垂直切换matlab仿真


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB核心程序

    4.完整MATLAB


    1.算法描述

           随着无线通信技术的飞速发展,为支持多种不同无线接入技术、不同系统间协作、不同业务类型及终端差异性等需求,未来的无线网络将是一种协作式的异构网络融合架构,这将给系统的无线资源管理带来新的变化与挑战。传统的无线资源管理技术,已不能很好地满足多制式异构蜂窝网络环境下的不同需求。为了解决异构网络间无线资源的协作管理与调度问题,联合接纳控制与垂直切换等技术引起了广泛研究与讨论。

          联合接纳控制是一种集中式的接纳控制,多种RAT在相同的区域进行覆盖,形成了多RAT的网络结构。每一种无线接入技术RAT(Radio Access Technology)由若干个基站BS(Base Station)组成,每个BS根据需要,管理相应的多个小区,每个BS对所属的多个小区进行接纳控制,将网络信息上报到JAC实体,由JAC做出接纳判决。具体系统模型,如下图1所示:

           上图1可知,由于各网络将业务请求转发到JAC控制实体中进行处理,同时JAC需要综合各网络的状况,来决定对该业务请求进行判决,是否能被接纳以及接纳到哪个网络,这种方法虽然能够实现多网络之间的资源优化合理使用,但该方法中每个业务请求向JAC实体进行转发,增加了业务请求的响应和处理时间,降低了用户体验。

           根据终端位置信息,基站向终端提供网络带宽、时延等参数。以QoS最优化为目标确定能代表网络性能的属性量决策,通过选择几个比较重要的属性参数,属性层为影响网络选择的决定性因素:信号强度P、服务速率S、网络延迟D、网络的使用费用C,如图4.2所示,为各网络属性加权示意图:

        垂直切换,主要是针对UE连接态时,经过切换测量,切换策略,对UE进行切换执行,切换到目标网络;如果超出则仿真结束,进行UE及小区更新,主要是周期性更新小区负载和UE位置方向、速度等信息;

          仿真流程;如下图3所示:

    垂直切换仿真流程说明:

    • 垂直切换:分类统计切换失败次数、乒乓切换和short-stay切换次数,切换完成(切换接入成功)时,判断并统计乒乓。Short-stay切换次数;

    2.仿真效果预览

    matlab2022a仿真结果如下:

     

     

     

     

    3.MATLAB核心程序

    1. %移动设备必须经过的关键点
    2. VP_ms = [-1000,500; %A
    3. -290,105; %B
    4. -20, 40; %C
    5. 0, 40; %D
    6. 20, 40; %E
    7. 250,120; %F
    8. 1200,800] ;%G
    9. type = 1;%业务类型:1:语音业务,2:数据业务,3:视频模型
    10. %各个网络的接入,断开功率门限值
    11. Rss_gsm_in = -50;%dbm
    12. Rss_gsm_out = -65;%dbm
    13. Rss_tds_in = -55;%dbm
    14. Rss_tds_out = -70;%dbm
    15. Rss_lte_in = -50;%dbm
    16. Rss_lte_out = -65;%dbm
    17. %定义用户运动的距离
    18. Xp = 0;
    19. Yp = 0;
    20. %定义仿真时间参数
    21. delta = 0.01;
    22. Time = 3;
    23. t = 0;
    24. %数组计数器
    25. Ind = 0;
    26. Ind2 = 0;
    27. %接收功率、最大的传输速率、时延、费用价格
    28. %其中接收功率为实测
    29. POW_gsm = 0;
    30. Rb_gsm = 8;
    31. DLY_gsm = 40;
    32. MNY_gsm = 0.2;
    33. POW_tds = 0;
    34. Rb_tds = 1.28;
    35. DLY_tds = 20;
    36. MNY_tds = 0.3;
    37. POW_lte = 0;
    38. Rb_lte = 8;
    39. DLY_lte = 45;
    40. MNY_lte = 0.1;
    41. %接收功率、最大的传输速率、时延、费用价格
    42. ViewS = 20;%减小消耗内存,采样显示结果
    43. %定义分层矩阵
    44. C = zeros(4,4);
    45. %%
    46. %场景的初始化
    47. %X,Y为MB移动的路径,随着时间的变化而X,Y的变化值,用于循环仿真使用
    48. [X,Y] = func_Simu_Scene(P_tds,P_lte,P_gsm,VP_ms,R_tds,R_lte,R_gsm,NUE);
    49. save My_Result\Simu_Scene.mat
    50. %%
    51. %主循环
    52. %定义变量
    53. Len = min(Time/delta,floor((length(X{UE_Spec})-Sp_ms)/Sp_ms));
    54. %定义网络ID变量
    55. ClK = zeros(Len,1);
    56. IDs = zeros(Len,3);
    57. RSS_tdss = zeros(Len,1);
    58. RSS_gsms = zeros(Len,1);
    59. RSS_ltes = zeros(Len,1);
    60. Networkcontribution_tdss = zeros(Len,1);
    61. Networkcontribution_gsms = zeros(Len,1);
    62. Networkcontribution_ltes = zeros(Len,1);
    63. IDs2 = zeros(Len,1);
    64. USER_SPACE = zeros(Len,NUE);
    65. %记录指定用户的切换情况
    66. UE_Spec_NET = zeros(Len,1);
    67. STime = 1000;%蒙特卡洛循环次数
    68. %主循环
    69. %定义变量
    70. for iii = 1:length(Sp_ms)
    71. Len = (Time/delta);
    72. %定义网络ID变量
    73. tmp1 = 0;
    74. tmp2 = 0;
    75. for iii2 = 1:STime%各种速度仿真STime次,计算平均
    76. iii
    77. iii2
    78. t = 0;
    79. %数组计数器
    80. Ind = 0;
    81. Ind2 = 0;
    82. RandStream.setDefaultStream(RandStream('mt19937ar','seed',iii2));
    83. while (t < Time-delta )
    84. t
    85. %计算时间
    86. t = t + delta*Sp_ms(iii);
    87. Ind = Ind + Sp_ms(iii);
    88. Ind2 = Ind2 + 1;
    89. for Nj = 1:NUE
    90. %根据坐标位置,得到MB的当前区域,在一个小范围内,进行仿真,
    91. %根据坐标位置,得到MB的当前区域,在一个小范围内,进行仿真,
    92. if Ind2 == 1
    93. Xp = 100*randn(1,1)-900;
    94. Yp = 0;
    95. else
    96. Xp = Xp + Sp_ms(iii);
    97. Yp = 0;
    98. end
    99. ddd = sqrt((Xp - P_tds(1))^2 + (Yp - P_tds(2))^2);
    100. if ddd >= 800
    101. Xp = 100*randn(1,1)-900;
    102. Yp = 0;
    103. else
    104. Xp = Xp;
    105. Yp = 0;
    106. end
    107. %根据不同的区域,确定有几个网络
    108. ID(:,Nj) = func_NET_ID(Xp,Yp,P_tds,P_lte,P_gsm,R_tds,R_lte,R_gsm);
    109. %计算RSS值
    110. RSS_tds(Nj) = func_Rss_cal(Xp,Yp,Sp_ms(iii),P_tds,F_tds,t,Pow_tds,ISFAST);
    111. RSS_lte(Nj) = func_Rss_cal(Xp,Yp,Sp_ms(iii),P_lte,F_lte,t,Pow_lte,ISFAST);
    112. RSS_gsm(Nj) = func_Rss_cal(Xp,Yp,Sp_ms(iii),P_gsm,F_gsm,t,Pow_gsm,ISFAST);
    113. end
    114. %===========================================================================
    115. %判断每一时刻的备选网络
    116. %进行分层计算,这个根据业务模型的不同,而不同
    117. %接收功率、最大的传输速率、时延、费用价格
    118. %正常情况下,我们假设接收功率时变,而其他三个参数固定,从而进行实时计算网络贡献值
    119. %这里,分层法的解W,我参考了另外一篇的做法,比较方便
    120. if type == 1%语音业务,我们认为时延最重要
    121. %接收功率、最大的传输速率、时延、费用价格
    122. C=[1 5 1/7 3;
    123. 1/5 1 1/3 1/2;
    124. 7 3 1 2;
    125. 1/3 2 1/2 1];
    126. end
    127. %计算权值W
    128. for i = 1:4
    129. w2(i) = (C(i,1)*C(i,2)* C(i,3)* C(i,4))^0.25;
    130. end
    131. for i = 1:4
    132. w(i) = w2(i)/sum(w2);
    133. end
    134. w1 = w(1);
    135. w2 = w(2);
    136. w3 = w(3);
    137. w4 = w(4);
    138. %注意,这里矩阵C的建立,具有一定的主观性,所以我就不设置了,你改下,就可以换别的业务模型进行仿真了
    139. %注意,这里矩阵C的建立,具有一定的主观性,所以我就不设置了,你改下,就可以换别的业务模型进行仿真了
    140. %计算网络贡献权值由上面的分层法计算得到
    141. %接收功率、最大的传输速率、时延、费用价格
    142. for Nj = 1:NUE
    143. %将功率dbm转换为标准功率w
    144. PP_tds(Nj) = 10^(RSS_tds(Nj)/20);
    145. PP_lte(Nj) = 10^(RSS_lte(Nj)/20);
    146. PP_gsm(Nj) = 10^(RSS_gsm(Nj)/20);
    147. %构成矩阵,并规划化
    148. Rs = [PP_tds(Nj),Rb_tds,DLY_tds,MNY_tds;
    149. PP_lte(Nj),Rb_lte,DLY_lte,MNY_lte;
    150. PP_gsm(Nj),Rb_gsm,DLY_gsm,MNY_gsm];
    151. [r,c] = size(Rs);
    152. for j = 1:c
    153. Mins = min(Rs(:,j));
    154. Maxs = max(Rs(:,j));
    155. for i = 1:r
    156. R(i,j) = (Rs(i,j)-Mins)/(Maxs);
    157. end
    158. end
    159. if ID(:,Nj) == [1,0,0]'
    160. Networkcontribution_tds(Nj) = w1*R(1,1) + w2*R(1,2) + w3*R(1,3) + w4*R(1,4);
    161. Networkcontribution_lte(Nj) = 0;
    162. Networkcontribution_gsm(Nj) = 0;
    163. elseif ID(:,Nj) == [0,2,0]'
    164. Networkcontribution_tds(Nj) = 0;
    165. Networkcontribution_lte(Nj) = w1*R(2,1) + w2*R(2,2) + w3*R(2,3) + w4*R(2,4);
    166. Networkcontribution_gsm(Nj) = 0;
    167. elseif ID(:,Nj) == [0,0,3]'
    168. Networkcontribution_tds(Nj) = 0;
    169. Networkcontribution_lte(Nj) = 0;
    170. Networkcontribution_gsm(Nj) = w1*R(3,1) + w2*R(3,2) + w3*R(3,3) + w4*R(3,4);
    171. elseif ID(:,Nj) == [1,2,0]'
    172. Networkcontribution_tds(Nj) = w1*R(1,1) + w2*R(1,2) + w3*R(1,3) + w4*R(1,4);
    173. Networkcontribution_lte(Nj) = w1*R(2,1) + w2*R(2,2) + w3*R(2,3) + w4*R(2,4);
    174. Networkcontribution_gsm(Nj) = 0;
    175. elseif ID(:,Nj) == [1,0,3]'
    176. Networkcontribution_tds(Nj) = w1*R(1,1) + w2*R(1,2) + w3*R(1,3) + w4*R(1,4);
    177. Networkcontribution_lte(Nj) = 0;
    178. Networkcontribution_gsm(Nj) = w1*R(3,1) + w2*R(3,2) + w3*R(3,3) + w4*R(3,4);
    179. elseif ID(:,Nj) == [0,2,3]'
    180. Networkcontribution_tds(Nj) = 0;
    181. Networkcontribution_lte(Nj) = w1*R(2,1) + w2*R(2,2) + w3*R(2,3) + w4*R(2,4);
    182. Networkcontribution_gsm(Nj) = w1*R(3,1) + w2*R(3,2) + w3*R(3,3) + w4*R(3,4);
    183. elseif ID(:,Nj) == [1,2,3]'
    184. Networkcontribution_tds(Nj) = w1*R(1,1) + w2*R(1,2) + w3*R(1,3) + w4*R(1,4);
    185. Networkcontribution_lte(Nj) = w1*R(2,1) + w2*R(2,2) + w3*R(2,3) + w4*R(2,4);
    186. Networkcontribution_gsm(Nj) = w1*R(3,1) + w2*R(3,2) + w3*R(3,3) + w4*R(3,4);
    187. else
    188. Networkcontribution_tds(Nj) = 0;
    189. Networkcontribution_lte(Nj) = 0;
    190. Networkcontribution_gsm(Nj) = 0;
    191. end
    192. end
    193. %初始化UE驻留网络,根据RSS值,来初始化驻留小区网络
    194. if Ind2 <= 1
    195. for Nj = 1:NUE
    196. [V,I] = max([Networkcontribution_tds(Nj),Networkcontribution_lte(Nj),Networkcontribution_gsm(Nj)]);
    197. USER_SPACE(Ind2,Nj) = I;
    198. end
    199. UE_Spec_NET(Ind2) = USER_SPACE(Ind2,UE_Spec);
    200. else
    201. %===========================================================================
    202. %接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制
    203. %接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制%接纳控制
    204. %STEP1:检查当前网络是否处于重负载状态
    205. %计算各个网络中用户个数
    206. tmps = USER_SPACE(Ind2-1,:);
    207. Num_tds = length(find(tmps == 1));
    208. Num_lte = length(find(tmps == 2));
    209. Num_gsm = length(find(tmps == 3));
    210. %指定分析用户将要切入的网络
    211. UE_Spec_ID = USER_SPACE(Ind2,UE_Spec);
    212. isfull = 0;%初始,小区没有饱和
    213. %判断该小区是否满负荷
    214. if UE_Spec_ID == 1
    215. if Num_tds >= Nfull_tds;isfull = 1;else;isfull = 0; end;
    216. end
    217. if UE_Spec_ID == 2
    218. if Num_lte >= Nfull_lte;isfull = 1;else;isfull = 0; end;
    219. end
    220. if UE_Spec_ID == 3
    221. if Num_gsm >= Nfull_gsm;isfull = 1;else;isfull = 0; end;
    222. end
    223. %如果否,则接纳该用户,即可以进行接纳其接入,即可以垂直切换
    224. if isfull == 0
    225. [V2,I2] = max([Networkcontribution_tds(UE_Spec),Networkcontribution_lte(UE_Spec),Networkcontribution_gsm(UE_Spec)]);
    226. UE_Spec_NET(Ind2) = I2;
    227. else
    228. %如果是,系统检查当前网络是否有可用容量
    229. UE_Spec_ID = USER_SPACE(Ind2-1,UE_Spec);
    230. isfull2 = 0;%初始,小区没有饱和
    231. %判断该小区是否满负荷
    232. if UE_Spec_ID == 1
    233. if Num_tds >= Nfull_tds;isfull2 = 1;else;isfull2 = 0; end;
    234. end
    235. if UE_Spec_ID == 2
    236. if Num_lte >= Nfull_lte;isfull2 = 1;else;isfull2 = 0; end;
    237. end
    238. if UE_Spec_ID == 3
    239. if Num_gsm >= Nfull_gsm;isfull2 = 1;else;isfull2 = 0; end;
    240. end
    241. if isfull2 == 1%如果没有,则拒绝该用户的接入请求
    242. UE_Spec_NET(Ind2) = -inf;%负无穷,表示拒绝接入
    243. else
    244. UE_Spec_NET(Ind2) = UE_Spec_NET(Ind2-1);
    245. end
    246. end
    247. end
    248. %将每次循环的结果进行保存
    249. ClK(Ind2) = t-delta;
    250. IDs(Ind2,1) = ID(1,UE_Spec);
    251. IDs(Ind2,2) = ID(2,UE_Spec);
    252. IDs(Ind2,3) = ID(3,UE_Spec);
    253. RSS_tdss(Ind2) = RSS_tds(UE_Spec);
    254. RSS_ltes(Ind2) = RSS_lte(UE_Spec);
    255. RSS_gsms(Ind2) = RSS_gsm(UE_Spec);
    256. Networkcontribution_tdss(Ind2) = Networkcontribution_tds(UE_Spec);
    257. Networkcontribution_ltes(Ind2) = Networkcontribution_lte(UE_Spec);
    258. Networkcontribution_gsms(Ind2) = Networkcontribution_gsm(UE_Spec);
    259. IDs2(Ind2) = UE_Spec_NET(Ind2);
    260. %统计直接RSS方法的切换次数
    261. [Vss,Iss] = max([RSS_tds(UE_Spec),RSS_lte(UE_Spec),RSS_gsm(UE_Spec)]);
    262. IDs3(Ind2) = Iss;
    263. if Ind2 > 2 & abs(IDs3(Ind2) - IDs3(Ind2-1)) > 0
    264. tmp1 = tmp1 + 1;
    265. end
    266. %统计垂直切换策略的切换次数
    267. if Ind2 > 2 & abs(IDs2(Ind2) - IDs2(Ind2-1)) > 0
    268. tmp2 = tmp2 + 1;
    269. end
    270. end
    271. end
    272. N1(iii) = tmp1/STime;
    273. N2(iii) = tmp2/STime;
    274. end
    275. figure;
    276. plot(Sp_ms,N1,'k-o');
    277. xlabel('Speed');
    278. ylabel('切换次数');
    279. grid on;
    280. hold on
    281. plot(Sp_ms,N2,'k-s');
    282. xlabel('Speed');
    283. ylabel('切换次数');
    284. grid on;
    285. hold on
    286. legend('多属性策略JAC算法','半分布式JAC算法');
    287. 01_091_

    4.完整MATLAB

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    ES6中的常用数组方法总结
    hadoop基础
    WPF绘制圆形调色盘
    OKHttp
    Flutter常用命令,持续更新
    LeetCode算法二叉树—116. 填充每个节点的下一个右侧节点指针
    java中Date类之GMT、UTC
    渗透测试--JWT攻防(一)
    Linux云服务环境安装-JDK篇
    数据结构|栈和队列以及实现
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128083080