m基于基站休眠的LTE-A异构网络中节能算法matlab仿真

news2025/1/19 8:24:14

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

要求
1.开发一个软件工具,可以直观地演示如何在LTE-A异构网络中通过基站的睡眠模式节约能源
2.需要演示基于用户的移动性如何设置基站的开关(睡眠模式)
3.自己设计基站睡眠模式的直观展示原则
4.在模拟异构网络时展示系统的能量消耗

成果
1.一个软件工具可以直观展示LTE-A异构网中基站的睡眠模式
2.在特定的异构网络布局和特定的时间框架下演示基站的开启和关闭
3.直观展示能源效率基站睡眠模式的性能指标

这里,我们主要设置一个19个基站构造的规则六边形小区,具体的仿真效果如下所示:

        这里,我们模拟了19个基站构成的小区,每个小区中间位置有一个基站,上图中红色区域部分。然后紫色的带内表示用户,这些点是在随机的运动的。蓝色方框是在每个小区内随机分布的PICO微微网络基站。

        另外,这里我们模拟的是一个城市的中心区域的模型,即中间小区用户数量较多,基站基本上处于满负荷状态,而周边几个小区用户数量较少。

        用户在实际中做的运动方程为随机方向的变速运动,因此这里设备的运动方程用如下的式子表示:

这里,假设设备是平面运动的,所以Z一直为0.

       其中速度因子,我考虑是模拟设备的变加速运动,即一个固定的速度V0和每个时刻不同的加速度的情况。角度为一个恒定的值与随机变量的叠加。即:

        这样的情况,可以更加符合实际的设备运动的复杂情况。当a(t)为0的时候,设备做匀速运动。当a(t)为常数的时候,为匀加速运动,当a(t)为变化的值得时候,那么系统就为变加速运动。

          然后这里我简单的接收一下我们这个异构网络的休眠切换算法:

        在异构网络中,由于PICO网络的能耗远远小于MICRO基站的能耗,因此,在实际中,我们需要尽可能多的将设备与PICO基站建立连接,并同时通过系统对没有用户参与连接的MICRO基站进行关闭。

        节点休眠算法的主要含义为:

        当基站关闭以后,可以大大降低能耗,此时的基站失去了发送的能力,被称为休眠基站。而在一个大型的网络中,由于每个单一的基站并不会在每时每刻都处于工作之中,那么会对整个网络产生一定的冗余,在这样一个环境中,完全可以让一部分基站休眠,而让另一部分基站工作。另外,在基站密度较高的区域,此时,在不影响整个小区性能的前提下,通过关闭一部分基站的方法,可以有效降低整个小区的功耗。

        下面讨论在引入基站休眠算法之后,整个小区的功耗。

        假设在某一时刻,整个小区有k0个基站关闭,k-k0个基站在正常工作,那么整个小区的总的功耗为:

 

 先对一个普通的能耗问题进行仿真,即如果检测到对应小区的用户数量为0,则基站自动进入休眠状态,如果出现用户,则基站开始工作。

 

第二,对比用户和宏基站距离以及和微微基站的距离;

第三,开关判决:

         如果均不在两种基站的有效覆盖范围之内,那么保持原来的状态,

        如果用户在邻近的宏基站的覆盖范围之内,那么当前用户和宏基站建立连接,而关闭对应的微微基站,如果用户在微微基站的覆盖范围之内,那么用户和微微基站建立连接,并关闭宏基站。

        如果用户同时在微微基站和宏基站的有效覆盖范围内,那么选择实际功耗小的基站进行连接,通常情况下,如果微微基站没有饱和,则用户直接和微微基站建立连接。

第四,功耗的计算,即计算处于工作状态的基站,然后计算对应每个基站的用户数量,然后计算总的功耗:

2.仿真效果预览

matlab2022a仿真结果如下:

 

3.MATLAB核心程序

..............................................             
%基站坐标
%macrocell
XMBS   = [];
YMBS   = [];
 
%=============用户运动=====================================================
PX  = zeros(NU,TIME);
PY  = zeros(NU,TIME);
figure(1);
ind = 0;
for i=(-1*p):p 
    for j=(-1*q):q 
        %先确定macrocell的拓扑结构
        Xcen = i*1.5*R; 
        Ycen = (j+mod(i,2)/2)*sqrt(3)*R; 
        if sqrt(Xcen^2 + Ycen^2) <= 4*R   
           x = x0 + Xcen; 
           y = y0 + Ycen; 
           XMBS = [XMBS,Xcen];
           YMBS = [YMBS,Ycen];
           plot(x,y,'b');
           hold on;
           plot(Xcen,Ycen,'r*');
           hold on 
        end
    end 
end 
 
 
%然后产生picocell位置
NP    = 2;
XPBS0 = zeros(19,NP);
YPBS0 = zeros(19,NP);
XPBS  = zeros(19*NP,1);
YPBS  = zeros(19*NP,1);
II    = zeros(1,19);
for i=1:19 
    j=1;
    while j<=NP     
          %随机生成横坐标
          XPBS0(i,j) = (1000/sqrt(3)*rand()-500/sqrt(3))+XMBS(i);
          %随机生成纵坐标
          YPBS0(i,j) = (500*rand()-250)+YMBS(i);
          %算pico距离macro的距离
          distance  = sqrt((XPBS0(i,j)-XMBS(i))^2+(YPBS0(i,j)-YMBS(i))^2);
          h         = 1;
          judge     = 0;
          picodis   = 50;
          while h<=i
                l=1;
                while l<j
                      %遍历已经生成的pico,确认pico之间的距离
                      picodis=sqrt((XPBS0(i,j)-XPBS0(h,l))^2+(YPBS0(i,j)-YPBS0(h,l))^2);
                      if picodis<40%如果有距离小于40的,则不满足条件,跳出循环,重新生成pico              
                         judge=1;
                         break;
                      end;
                      l=l+1;
                end;
                if judge==1
                    break;
                end
                h=h+1;
          end;
          if abs(XPBS0(i,j)-XMBS(i)) + abs(YPBS0(i,j)-YMBS(i))/sqrt(3)<= 500/sqrt(3)&&distance>75&&picodis>40 
             j = j+1;
          end
    end 
    II(i)=i;
end
 
for i=1:19 
    for j = 1:NP
        plot(XPBS0(i,j),YPBS0(i,j),'b-s'); 
        hold on;
    end
end
%PICO坐标值的转换
XPBS = reshape(XPBS0,[19*NP,1]);
YPBS = reshape(YPBS0,[19*NP,1]);
 
axis equal; 
hold on;
plot(Xu,Yu,'m.');
hold on;
legend('小区边界','基站BS');
axis([-world-5,world+5,-world-5,world+5]); 
title('模拟场景(红色BS:ON,黑色BS:OFF)');
hold on;
 
 
 
 
 
 
 
 
%假设最匀速运动
for t = 1:TIME
    t
    for i = 1:NU
        if t == 1
           PX(i,t) = Xu(i);
           PY(i,t) = Yu(i);
        else
           V(i)    = 23*(0.5+randn);
           Theta(i)= pi*randn;%确定一个随机的运动方向 
           PX(i,t) = PX(i,t-1) + V(i)*cos(Theta(i));
           PY(i,t) = PY(i,t-1) + V(i)*sin(Theta(i));
        end
    end
end
 
 
%%
%=============智能节点休眠算法==============================================
%基站坐标
XMBS;
YMBS;
%用户移动路线的坐标变化情况
PX;
PY;
 
Power1 = zeros(1,TIME);
Power2 = zeros(1,TIME);
 
%各个小区的用户连接数
USERS1 = zeros(19,TIME);
USERS2 = zeros(19,TIME);
USERS1p= zeros(19*NP,TIME);
USERS2p= zeros(19*NP,TIME);
 
 
for times = 1:TIME
    disp(times);
    for j = 1:NU
        UX(j) = PX(j,times);
        UY(j) = PY(j,times);
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %PART I 计算基站全部正常工作的时候的网络的能耗
    %PART I 计算基站全部正常工作的时候的网络的能耗
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %计算每个小区内对应的人数
    %用户所在小区的编号
    %先计算MICRO
    UE_BSid1 = zeros(1,NU);
    BS_UEn1  = zeros(1,19);
    Pow_bs1  = zeros(1,19);
    for j1 = 1:NU
        for j2 = 1:19
            dist(j2) = sqrt((UX(j1) - XMBS(j2))^2 + (UY(j1) - YMBS(j2))^2);
        end
        %计算最近的,即其对应的小区位置
        [V,I] = min(dist);
        UE_BSid1(j1) = I;
    end
 
    %再计算PICRO
    UE_BSid1p = zeros(1,NU);
    BS_UEn1p  = zeros(1,19*NP);
    Pow_bs1p  = zeros(1,19*NP);
    for j1 = 1:NU
        for j2 = 1:19*NP
            distP(j2) = sqrt((UX(j1) - XPBS(j2))^2 + (UY(j1) - YPBS(j2))^2);
        end
        %计算最近的,即其对应的小区位置
        [V,I] = min(distP);
        UE_BSid1p(j1) = I;
    end
    
    %根据每个用户和宏小区和微小区之间的距离,判断当然用户和虹小区建立连接,还是和微小区建立连接
    %统计每个用户,其连入情况
    %再计算PICRO
    UE_BSid1P2 = zeros(2,NU);
    for j = 1:NU
        Mind = UE_BSid1(j);
        Pind = UE_BSid1p(j);
        %判断该用户具体连接到哪个基站
        Mdist= sqrt((UX(j) - XMBS(Mind))^2 + (UY(j) - YMBS(Mind))^2);
        Pdist= sqrt((UX(j) - XPBS(Pind))^2 + (UY(j) - YPBS(Pind))^2);
        if Mdist >= 2*Pdist
           UE_BSid1P2(:,j) = [0,Pind];
        else
           UE_BSid1P2(:,j) = [1,Mind];  
        end
    end
    %根据实际情况,计算宏基站功率和微基站功率
    MM = find(UE_BSid1P2(1,:)==1);
    PP = find(UE_BSid1P2(1,:)==0);
    
    %统计每个小区的用户个数
    for j1 = 1:19
        e=find(UE_BSid1P2(2,MM)==j1);  
        BS_UEn1(j1) = length(e);
    end
    for j1 = 1:19
        if BS_UEn1(j1) <= SNU
           Pow_bs1(j1) = 137+57*BS_UEn1(j1)/SNU;
        else
           Pow_bs1(j1) = 137+57; 
        end
    end
    
    for j1 = 1:19*NP
        e=find(UE_BSid1P2(2,PP)==j1);  
        BS_UEn1p(j1) = length(e);
    end
    for j1 = 1:19*NP
        if BS_UEn1p(j1) <= SNUP
           Pow_bs1p(j1) = 12+8*BS_UEn1p(j1)/SNU;
        else
           Pow_bs1p(j1) = 12+8; 
        end
    end
    
    
    
 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %PART II 基站休眠算法 
    %PART II 基站休眠算法 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
    %先计算MICRO
    UE_BSid2 = zeros(1,NU);
    BS_UEn2  = zeros(1,19);
    Pow_bs2  = zeros(1,19);
    for j1 = 1:NU
        for j2 = 1:19
            dist2(j2) = sqrt((UX(j1) - XMBS(j2))^2 + (UY(j1) - YMBS(j2))^2);
        end
        %计算最近的,即其对应的小区位置
        [V,I] = min(dist2);
        UE_BSid2(j1) = I;
    end
 
    %再计算PICRO
    UE_BSid2p = zeros(1,NU);
    BS_UEn2p  = zeros(1,19*NP);
    Pow_bs2p  = zeros(1,19*NP);
    for j1 = 1:NU
        for j2 = 1:19*NP
            distP(j2) = sqrt((UX(j1) - XPBS(j2))^2 + (UY(j1) - YPBS(j2))^2);
        end
        %计算最近的,即其对应的小区位置
        [V,I] = min(distP);
        UE_BSid2p(j1) = I;
    end
    
    %根据每个用户和宏小区和微小区之间的距离,判断当然用户和虹小区建立连接,还是和微小区建立连接
    %统计每个用户,其连入情况
    %再计算PICRO
    UE_BSid2P2 = zeros(2,NU);
    for j = 1:NU
        Mind2 = UE_BSid2(j);
        Pind2 = UE_BSid2p(j);
        %判断该用户具体连接到哪个基站
        Mdist2= sqrt((UX(j) - XMBS(Mind2))^2 + (UY(j) - YMBS(Mind2))^2);
        Pdist2= sqrt((UX(j) - XPBS(Pind2))^2 + (UY(j) - YPBS(Pind2))^2);
        if Mdist2 >= 2*Pdist2
           UE_BSid2P2(:,j) = [0,Pind2];
        else
           UE_BSid2P2(:,j) = [1,Mind2];  
        end
    end
    %根据实际情况,计算宏基站功率和微基站功率
    MM2 = find(UE_BSid2P2(1,:)==1);
    PP2 = find(UE_BSid2P2(1,:)==0);
    
    %统计每个小区的用户个数
    for j1 = 1:19
        e2=find(UE_BSid2P2(2,MM2)==j1);  
        BS_UEn2(j1) = length(e2);
    end
 
    [ON_OFF2m,Power2m] = func_sleep(SNU,BS_UEn2,19,NP);
 
    for j1 = 1:19*NP
        e2=find(UE_BSid2P2(2,PP)==j1);  
        BS_UEn2p(j1) = length(e2);
    end
    [ON_OFF2p,Power2p] = func_sleep(SNUP,BS_UEn2p,19*NP,NP);
    
 
    
    %记录能耗_全部打开的能耗
    Power1(times) = sum(Pow_bs1) + sum(Pow_bs1p);
    %普通休眠下的能耗
    Power2(times) = sum(Power2m) + sum(Power2p);
    
    USERS1(:,times)  = BS_UEn1;
    USERS1p(:,times) = BS_UEn1p;
    
    USERS2(:,times)  = BS_UEn2';
    USERS2p(:,times) = BS_UEn2p';
end
 
 
%%
%=============根据基站休眠算法的优化结果,动态的显示基站开关状态===============
%动态显示不同时期的开关状态和对应的能耗对比效果
figure;
plot(1:TIME,Power1,'b','linewidth',2);
hold on
plot(1:TIME,Power2,'g','linewidth',2);
xlabel('仿真时间');
ylabel('小区总功耗');
grid on
legend('未进行基站休眠的网络功耗','进行基站休眠的网络功耗');
 
 
 
 
%动画演示
figure;
for t = 1:TIME
    
    if mod(t,5)==1
    
       subplot(221);
       tmps1 = USERS1(:,t);
       stem(1:19,tmps1);
       title('没有sleep mode的情况下每一个小区连接用户的数目');
       axis([0,20,0,40]);
       
       subplot(222);
       tmps2 = USERS2(:,t);
       IND1  = find(tmps2==0);
       IND2  = find(tmps2>0);
       stem(IND2,tmps2(IND2),'b');
       hold on;
       stem(IND1,tmps2(IND1),'r');
       hold off;
       legend('基站打开','基站关闭');
       title('有sleep mode下各个小区连接用户的数目的动态图');
       axis([0,20,0,40]);
 
       subplot(2,2,[3,4]);
       plot(1:t,Power1(1:t),'b','linewidth',2);
       hold on
       plot(1:t,Power2(1:t),'r','linewidth',2);
       xlabel('仿真时间');
       ylabel('小区总功耗');
       grid on
       legend('未进行基站休眠的网络功耗','进行基站休眠的网络功耗');
       axis([1,TIME,2500,3800]);
    end
    pause(0.0005);
end
01_090_m

4.完整MATLAB

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

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python标准库之pickle

1. pickle标准库简介 pickle&#xff0c;作为名词表示泡菜&#xff0c;作为动词表示用醋或盐水保存食物。由此不难联想到&#xff0c;用存储设备持久化保存数据。而pickle标准库恰是一个 Python 对象结构的二进制序列化和反序列化的核心库&#xff0c;专用于表示Python语言大量…

Stable Diffusion7

它也写到第七部了.. Stability AI宣布&#xff0c;Stable Diffusion 2.0版本上线&#xff01;1.0版本在今年8月出炉&#xff0c;三个月不到&#xff0c;还热乎着呢&#xff0c;新版本就来了。 深度学习文本到图像模型的最新版本——Stable Diffusion 2.0。相较于1.0&#xff…

面试必知的9个性能测试指标,你完全了解吗?

吞吐量 单位时间内&#xff0c;系统能够处理多少请求&#xff0c;吞吐量代表网络的流量&#xff0c;TPS越高&#xff0c;吞吐量越大&#xff0c;还包含了数据的吞吐量。一般单位为秒&#xff0c;每秒处理的请求量。 注意&#xff1a;我们看到的JMeter聚合报告一般如下图&…

Kotlin高仿微信-第7篇-主页-动态权限申请

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

指定牛导|肿瘤专业医生芝加哥大学博士后实现夙愿

Q医生有个愿望&#xff0c;希望拜师在牛导麾下&#xff0c;利用国家留学基金委2年博士后的机会&#xff0c;真正做出科研成果&#xff0c;发表高质量文章。为此列出了合作导师标准并指定了几位教授。经过团队努力&#xff0c;我们终于为其达成夙愿—获得指定牛导的博士后邀请函…

Redis实战之缓存:查询、添加缓存、更新缓存、缓存预热、缓存穿透、缓存雪崩、缓存击穿 解决方案及实例代码

缓存 什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 为什么要使用缓存&#xff1f; 缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器…

SpringBoot利用Spring SPI机制实现自动按顺序加载注册JavaBean到容器中

前言&#xff1a; 1、SPI机制(Service Provider Interface)&#xff0c;服务提供接口&#xff0c;主要是用来解耦&#xff0c;资源文件目录下的 \resources\META-INF\spring.factories 我们把它归纳为Spring为我们提供的SPI机制&#xff0c;通过这种机制&#xff0c;我们可以在…

docker 容器原理分析笔记(下)

目录 chroot rootfs Volume&#xff08;数据卷) 打包一个go镜像 总结 chroot 当一个容器被创建的时候&#xff0c;我们希望容器中进程看到的文件是一个独立的隔离环境&#xff0c;我们可以在容器进程重启之前挂载整个根目录 /,由于 Mount Namespace 的存在&#xff0c;这…

发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows

发布用于Windows的 .NET MAUI 应用 打开 PowerShell 终端 , 命令行进入工程目录,以我的例子工程为例, cd BlazorMaui BlazorMaui 替换为你自己工程名字 New-SelfSignedCertificate -Type Custom -Subject "CNBlazorMaui" -KeyUsage DigitalSignature -FriendlyName &…

python如何将日期字符串格式化年月日

今天用Python的DataFrame处理数据时&#xff0c;相对一波数据按日期分组处理&#xff0c;但是原始数据包含时间分秒&#xff0c;无法按日期分组&#xff0c;因此需要先将数据转成只包含年月日的数据格式。但是写代码处理过程中发现有点绕&#xff0c;不熟悉的同学容易绕晕。这种…

编程语言如何推动DeFi成为主流?

随着DeFi的快速增长&#xff0c;提供DeFi服务的平台和产品也如雨后春笋般纷纷冒头。作为衡量DeFi协议管理资金规模的标准之一&#xff0c;DeFi“总锁仓量”在过去两年一路从100亿美元增长到超400亿美元&#xff0c;期间更是一度冲上1800亿美元的巅峰。但直到今天&#xff0c;智…

Python爬虫request模块的get、post方法应用

目录 post方法使用 一、确定爬取网站的数据 二、分析数据类型和相应类型 三、使用requetst模块方法进行爬取 四、源代码分享 get的方法使用 一、分析抓取网站操作 二、参数的分析和组成 三、使用get模块方法进行爬取结果 四、源代码分享 思考和总结 参考网站 爬虫是…

MySQL---触发器详解

目录 一、触发器的介绍 二、触发器的语法 &#xff08;1&#xff09;insert触发器 &#xff08;2&#xff09;update触发器 &#xff08;3&#xff09;delete触发器 一、触发器的介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete 之前或之后&…

4-UI自动化-selenium三大等待操作

4-UI自动化-selenium三大等待方式selenium三大等待方式强制等待timd.sleep隐式等待implicitly_wait显式等待WebDriverWait显式等待和隐式等待的区别上篇介绍了3-UI自动化-八大元素定位&#xff0c;xpath定位方式和相关的常问面试题 本篇来学习三大等待方式 ♡\color{red}{\hear…

如何用蓝牙实现无线定位(一)--系统原理

1. 简介 本项目将利用多个BLE4.0蓝牙模块&#xff0c;配合主控板、OLED显示屏等&#xff0c;构建一个无线定位系统。 本项目的系统构成为&#xff1a;3个信号塔&#xff0c;1个中控台&#xff0c;2个被定位的目标。 无线定位的用途有很多。比如&#xff0c;我们可以把固定的目…

zabbix拓扑图和聚合图形

目录 一、环境准备 1、搭建zabbix基础环境 2、创建被监控主机 二、拓扑图 1、拓扑图作用 2、拓扑图绘制步骤 三、聚合图形 1、聚合图形的作用 2、创建聚合图形 一、环境准备 1、搭建zabbix基础环境 zabbix基础环境部署参照&#xff1a;zabbix基础环境部署_桂安俊kyli…

方格取数 (两条路径,使得取得的数字和为最大)

设有 NN 的方格图&#xff0c;我们在其中的某些方格中填入正整数&#xff0c;而其它的方格中则放入数字0。如下图所示&#xff1a; 某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#xff0c;直到到达右下角的 B 点。 在走过的路上&#xff0…

Vue中的组件生命周期

一个组件从创建到销毁的过程 成为生命周期。 在我们使用Vue3 组合式API 是没有 beforeCreate 和 created 这两个生命周期的 组件生命周期如下&#xff1a; onBeforeMount() 在组件DOM实际渲染安装之前调用。在这一步中&#xff0c;根元素还不存在。onMounted() 在组件的第一次…

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

1、网关流控介绍 在微服务系统中&#xff0c;网关提供了微服务系统的统一入口&#xff0c;所以在做限流的时候&#xff0c;肯定是要在网关层面做一个流量的控制&#xff0c;Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入…

R语言隐马尔可夫模型HMM识别不断变化的市场条件

了解不同的市场状况如何影响您的策略表现可能会对您的收益产生巨大的影响。最近我们被客户要求撰写关于隐马尔可夫模型的研究报告&#xff0c;包括一些图形和统计输出。 某些策略在波动剧烈的市场中表现良好&#xff0c;而其他策略则需要强劲而平稳的趋势&#xff0c;否则将面…