2020年MathorCup高校数学建模挑战赛—大数据竞赛A题移动通信基站流量预测求解全过程文档及程序

news2024/9/25 21:22:58

2020年MathorCup高校数学建模挑战赛—大数据竞赛

A题 移动通信基站流量预测

原题再现:

  随着移动通信技术的发展,4G、5G 给人们带来了极大便利。移动互联网的飞速发展,使得移动流量呈现爆炸式增长,从而基站的流量负荷问题变得越来越重要。一方面,在流量高峰期,大量基站呈现出负荷超过容量的问题,使得即使信号条件很好,网络速度也非常的慢,给用户带来非常差的体验。为了改善这个问题,需要给基站增加载频的数量来扩容,使基站可以承载更多的流量;另一方面,由于基站潮汐现象,使得在某些时段,用户数量会大幅降低。如图 1 所示,是某基站下行流量随时间变化的曲线。
在这里插入图片描述
  在基站低流量时段,如果仍然按照高容量时段的载频数量来运行基站配置,会极大的浪费资源和能量。特别是现在每个城市的基站数量巨大,而且随着 5G 的不断部署,基站数量还会大幅增加。同时,每个基站的流量高峰和低谷的时段各不相同。如果所有基站都按照高容量时段来配置运行载频,则网络的能量消耗是非常巨大的。因此,需要根据流量的变化,计算需要的载频数量,从而可以在不同时段打开或者关闭部分载频使得基站既可以满足对用户的服务,又可以尽可能低的消耗能量和资源。
  由于基站数量巨大,无法通过人工实时关注每个基站的流量变化,需要给每个基站设置根据时段自动开关载频的程序。这样就需要知道一段时间内基站流量关于时段的变化值,特别是基站在每个小时的上下行流量值。从而可以知道基站在每个时段需要的载频的数量,进而设置一定时间内基站载频自动开关的程序。
  另外,无论基站流量随时段怎么波动,从长期来看,大部分基站的整体流量是呈逐渐增加趋势的。当整体流量增加到一定程度时,这种动态开关载频的方式已经无法满足基站在流量峰值时候的需求了,因此需要做物理扩容,新建扇区或者新建基站。由于物理扩容需要涉及采购、费用、总体布局等问题,因此规划需要的时间非常长,所以需要提早预估出基站需要物理扩容的时间,从而可以更早的进行规划和设计。
  基于以上背景,请你们的团队根据附件给出的数据,通过数据分析与建模的方法帮助移动通信运营商解决下面的问题:
  问题 1:对小区(基站的每个扇区)的上行和下行流量随时间的变化进行建模,并用附件 1 中的“训练数据”(部分小区 2018 年 3 月 1 日至 4 月19 日的小时级流量数据)训练模型,给出各个小区小时级上行和下行流量的预测模型,预测这些小区后面一周(4 月 20 日至 4 月 26 日)的小时级流量变化,并将附件 2“短期验证选择的小区数据集”中涉及的小区数据填充完成,填充结果提交到竞赛网站平台,请勿改变附件 2 中数据的格式及小区 ID 编号顺序。
  问题 2:预测小区上下行流量的长期变化趋势,给出每个小区长期流量预测模型,并对附件 3“长期验证选择的小区数据集”中涉及的小区,预测其在 2020 年 11 月 1 日至 11 月 25 日每天的总的上行和下行流量,填充该数据表,并提交到竞赛网站平台,请勿改变附件 3 中数据的格式及小区 ID编号顺序。
  问题 3:依据给出的样本数据集,你们觉得还有哪些问题值得研究,并给出你们的思路?

整体求解过程概述(摘要)

  随着移动通信技术的发展,基站作为移动通信的基础设施,其承载网络流量持续增加.本文建立基于流量时间序列特征的聚类模型对小区进行分类,基于基站智能开关载频算法对基站载频的流量阈值进行研究.该问题的研究能智能调节基站载频数,降低基站节能减排效率,符合中国能源结构的发展趋势.
  针对问题一,主要需要对小区进行分类.本文建立了二级聚类模型,首先我们对各小区流量的消耗量进行分析,利用消耗量的评级对小区进行第一级聚类划分.对附件一中的数据预处理,选取 6 个与小区流量消耗有关的特征:“小区日均上行业务量GB”、“小区上行业务量大于 1GB 的天数”、“小区上行业务量小于 0.2GB”、“小区日均值下行业务量”、“小区下行业务量大于 1GB 的天数”、“小区下行业务量小于 0.2GB的天数”.基于流量消耗特征对小区进行一级聚类,将小区划分为“活跃类”、“较活跃类”、“较平淡类”、“平淡类”.接着,选取 12 个有关流量时间序列的特征:“上行昼夜差均值”、“上行周差均值”、“上行近似熵”、“上行样本熵”、“上行白天消耗流量序列方差”以及对应的下行流量数据特征.基于时间序列特征对小区进行二级聚类,最终得到 16 个小区类型,并对每一类小区特点进行说明.
  针对问题二,需要给出基站载频的流量阈值的设置策略和具体结果.我们对基站能耗和用户服务这两个指标进行研究,基站能耗主要从基站业务负载和基站静态能耗上考虑,基站业务负载为小区用户使用的流量总和,基站静态能耗为维持基站运行的最小功耗.根据小区的业务量与基站分配的载频容量差值,确立了一种基站的动态分配载频机制,使基站分配给小区的载频数既能满足用户流量需求,也使基站能耗最低.基于基站能耗和服务质量这两个指标,采用线性加权法,对蜂窝网络整体综合评价,选择适当的权重,使得达到基站能耗和用户服务质量两者达到最优值.由于数据的限制,我们仿真计算时将模型简化为单基站多小区型.提取 186,221,546 等小区一周的数据,通过仿真得到载频阈值,最终确定了该基站开关流量阈值 2.485GB.
  最后,本文对第二问的模型进行稳定性检验,对不减函数进行多种函数的取样测试.结果得到在选取不同函数时,网络整体的评价趋势与得分都较为相似,由此可以得出该模型具有一定的稳定性.另外,我们对模型进行了优、缺点评价.最后经过分析检验,本文的模型具有合理性和一定的现实意义.

模型假设:

  1、假设所调查的有关基站的数据都比较准确;
  2、假设基站使用宏基站能耗模型;
  3、假设小区所属基站不会因为人工或自然原因突然损坏;
  4、假设附件中所给小区覆盖地区的流量使用不考虑新建基站的影响;
  5、假设网络模型为蜂窝网络模型.

问题分析:

问题一的分析

  问题一主要需要我们提取附件 1 中小区上行和下行流量的时间序列数据的特征,对小区进行分类.在小区的分类中并不依赖于其本身的特征属性,而是主要参考覆盖范围内的主导场景.不同基站由于其覆盖范围内用户、使用业务的差异性,其流量模式也存在极大的差异.比如,在工作区域,小区流量高峰一般出现在早上 7-11 点和下午 13-17 点处于上班时间;在餐饮区域,基站流量高峰一般出现在中午和晚上吃饭时间.但是,由于小区覆盖范围内场景的混合性以及不同场景的相似性,这种划分并不具备代表性.
  对于第一问,我们提出了一种基于时间序列特征的聚类方式,从时间序列的分布、熵、稳定性、尺度变化提取时间序列的特征形成时间序列特征向量.
  为了对小区进行更细一步的划分,我们先基于能量消耗模型对小区进行第一层聚类,选取“小区日均上行业务量 GB”、“小区上行业务量大于 1GB 的天数”、“小区上行业务量小于 0.2GB”、“小区日均值下行业务量”、“小区下行业务量大于 1GB 的天数”、“小区下行业务量小于 0.2GB 的天数”作为一级聚类特征.根据流量使用量,利用聚类算法,将小区流量使用划分活跃类、较活跃类、较平淡类、平淡类.基于第一层聚类后的小区,我们再使用时间序列特征的聚类方式对小区进行第二层聚类,选取“上行昼夜差均值”、“上行周差均值”、“上行近似熵”、“上行样本熵”、“上行白天消耗流量序列方差”、“下行夜晚消耗 1 流量序列方差”、“下行昼夜差均值”、“下行周差均值”、“下行近似熵”、“下行样本熵”、“下行白天消耗流量序列方差”、“下行夜晚消耗流量序列方差”作为二级聚类特征向量,利用聚类算法,对小区进行更细一步的划分.并将每一类的小区绘制出一周的流量趋势图,说明该类小区的流量趋势特点.
  关于问题一的具体思路图如下:
在这里插入图片描述

问题二的分析

  问题二主要需要我们对基站阈值的设置进行研究,基站的能源消耗主要来着小区的流量使用.而流量本身存在“潮汐现象”,如果基站以高容量的载频来运行,则对基站能耗是一个很大问题;如果基站关闭一些载频数来降低能耗,在一定程度上,使得用户的服务质量下降.基站智能开关载频算法是我们解决问题的关键,寻找既能使用户达到满足状态,确保用户的服务质量,又能使基站开启较低的载频数,使基站的能耗消耗较低.
  通过蜂窝网络结构模型,建立小区覆盖下的用户与基站的联系.基站能耗从基站业务负载和基站静态能耗上考虑,基站的业务负载为该基站下所有小区用户所需要满足的流量总和,基站静态能耗是指基站没有传输数据时,维持基站运行的最小功耗.小区的流量使用一般会有时间性,不同的时间下用户使用流量的需求不同.对此,我们确立了基站的动态分配载频机制.如果某一时刻小区的业务量高于基站分配小区的载频容量,那么说明基站需要分配格外的载频以满足需求;如果小区的业务量等于基站分配小区的载频容量,那么说明基站与小区业务量之间达到了平衡,无需额外的操作;如果小区的业务量小于基站分配的载频容量,说明基站可以关闭一部分的载频数.一方面除了考虑基站能耗,另一方面还要考虑用户的服务质量,指需要为用户提供更好的服务能力.
  基于基站能耗和用户服务这两个指标,对蜂窝网络整体综合评价,采用线性加权法,作为目标函数.基于需求,改变权重系数来改变模型的适应性.基站根据小区业务量的变化,分配小区最合适的载频数,使得既能满足用户的流量需求,也能使基站能耗达到最低,使整个蜂窝网络能耗达到最低.

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

部分Python程序如下:

used_feat = ['HOUR','DAY','NAME','MON']
train_x = train[used_feat]
train_y = train['LABEL1']
test_x = test1[used_feat]
print(train_x.shape, test_x.shape)

# -----------------------------------------------
scores = []

params = {'learning_rate': 0.1, 
        'boosting_type': 'gbdt', 
        'objective': 'regression',
        'metric': 'rmse',
        'min_child_samples': 46, 
        'min_child_weight': 0.01,
        'feature_fraction': 0.8, 
        'bagging_fraction': 0.8, 
        'bagging_freq': 2, 
        'num_leaves': 16, 
        'max_depth': 5, 
        'n_jobs': -1, 
        'seed': 2019, 
        'verbosity': -1, 
       }



oof_train = np.zeros(len(train_x))
preds = np.zeros(len(test_x))
folds = 5
seeds = [2048, 1997]
for seed in seeds: 
    kfold = KFold(n_splits=folds, shuffle=True, random_state=seed)
    for fold, (trn_idx, val_idx) in enumerate(kfold.split(train_x, train_y)):
        print('fold ', fold + 1)
        x_trn, y_trn, x_val, y_val = train_x.iloc[trn_idx], train_y.iloc[trn_idx], train_x.iloc[val_idx], train_y.iloc[val_idx]
        train_set = lgb.Dataset(x_trn, y_trn)
        val_set = lgb.Dataset(x_val, y_val)

        model = lgb.train(params, train_set, num_boost_round=5000,
                          valid_sets=(train_set, val_set), early_stopping_rounds=25,
                          verbose_eval=50)
        oof_train[val_idx] += model.predict(x_val) / len(seeds)
        preds += model.predict(test_x) / folds / len(seeds)
        del x_trn, y_trn, x_val, y_val, model, train_set, val_set
        gc.collect()
    
    mse = (mean_squared_error(oof_train, train['LABEL1']))
    
    print('-'*120)
    print('rmse ', round(mse, 5))


test1['LABEL1'] = preds
train_x = train[used_feat]
train_y = train['LABEL2']
test_x = test1[used_feat]
print(train_x.shape, test_x.shape)

# -----------------------------------------------
scores = []

params = {'learning_rate': 0.1, 
        'boosting_type': 'gbdt', 
        'objective': 'regression',
        'metric': 'rmse',
        'min_child_samples': 46, 
        'min_child_weight': 0.01,
        'feature_fraction': 0.8, 
        'bagging_fraction': 0.8, 
        'bagging_freq': 2, 
        'num_leaves': 16, 
        'max_depth': 5, 
        'n_jobs': -1, 
        'seed': 2019, 
        'verbosity': -1, 
       }



oof_train = np.zeros(len(train_x))
preds = np.zeros(len(test_x))
folds = 5
seeds = [2048, 1997]
for seed in seeds: 
    kfold = KFold(n_splits=folds, shuffle=True, random_state=seed)
    for fold, (trn_idx, val_idx) in enumerate(kfold.split(train_x, train_y)):
        print('fold ', fold + 1)
        x_trn, y_trn, x_val, y_val = train_x.iloc[trn_idx], train_y.iloc[trn_idx], train_x.iloc[val_idx], train_y.iloc[val_idx]
        train_set = lgb.Dataset(x_trn, y_trn)
        val_set = lgb.Dataset(x_val, y_val)

        model = lgb.train(params, train_set, num_boost_round=5000,
                          valid_sets=(train_set, val_set), early_stopping_rounds=25,
                          verbose_eval=50)
        oof_train[val_idx] += model.predict(x_val) / len(seeds)
        preds += model.predict(test_x) / folds / len(seeds)
        del x_trn, y_trn, x_val, y_val, model, train_set, val_set
        gc.collect()
    
    mse = (mean_squared_error(oof_train, train['LABEL2']))
    
    print('-'*120)
    print('rmse ', round(mse, 5))


test1['LABEL2'] = preds
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

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

相关文章

代码随想录第55天|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 if (s[i - 1] t[j - 1]),那么dp[i][j] dp[i - 1][j - 1] 1;,因为找到了一个相同的字符,相同子…

当没有成熟案例可参考时,企业该如何实现数字化转型?

对于企业来说,数字化转型过程中,参考成熟的案例是可以提高成功率的。但是在现实中,很多企业由于行业、领先地位、技术保密性等原因,导致没有或者找不到可参考的数字化转型案例为自身提供经验。那么这种情况下该如何做呢&#xff0…

Java中日期和时间的类

文章目录JDK8之前日期和时间的APISystem类中的Date类中的java.util.Date类中的二个构造器二个方法java.sql.Date类中的实例化将java.sql.Date类对象转化为java.util.Date类的对象将java.util.Date类对象转化为java.sql.Date类的对象每日一考JDK8之前日期和时间的API System类中…

你对Bug了解多少?如何“正确的”向开发人员提出Bug?

目录 一、Bug的级别 二、Bug的生命周期 三、如何向开发人员提出Bug(如何创建Bug)? 四、跟开发产生争执怎么办?(面试高频) 一、Bug的级别 为什么Bug也要存在级别?不同的Bug等级,惩罚机制不一…

环形缓冲区

文章目录一. 什么是环形缓冲区?二、实现环形缓冲区:三、环形缓冲区示例代码:总结一. 什么是环形缓冲区? 环形缓冲区 是一段 先进先出 的循环缓冲区,有一定的大小,我们可以把它抽象理解为一块环形的内存。 …

快速掌握web服务器相关知识

目录 1.web服务器 2.HTTP的状态码 3.web实验 4.算法介绍 1.web服务器 web服务器指网站服务器,是指驻留与因特网上某种类型计算机的程序,可以向浏览器等WEB客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置…

关于batchnormlization理解

论文一般是这两张典型图片引用wz博客辅助理解上图展示了一个batch size为2(两张图片)的Batch Normalization的计算过程,假设feature1、feature2分别是由image1、image2经过一系列卷积池化后得到的特征矩阵,feature的channel为2&am…

TCP三次握手和四次挥手

三次握手 先ping域名为www.baidu.com,便于DNS解析。ping走的协议就包括DNS、ARP和ICMP。 接着使用Wireshark去抓包,抓包这里导航栏直接过滤ip就可以了,输入ip.host 183.232.231.174 接着直接在浏览器输入百度域名www.baidu.com访问请求&am…

TikTok新规:严禁录播盗播,保护原创内容

让我们一起来看看今日都有哪些新鲜事吧!01 2023年,TikTok将在社交买家渗透率和用户使用时间上面成为美国第一 eMarketer最新预测显示,TikTok的社交买家渗透率和用户使用时间正在迅速攀升,预计将在2023年分别超过Facobook和Youtub…

全景剖析阿里云容器网络数据链路(一):Flannel

作者:余凯 本系列文章由余凯执笔创作,联合作者:阿里云云原生应用平台 谢石 对本文亦有贡献 前言 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的 IaaS 化到现在的微服务化,客户的颗粒度精细化…

基于单机最高能效270亿参数GPT模型的文本生成与理解

作者:李鹏,王玮,陈嘉乐,黄松芳,黄俊 单位:阿里云智能机器学习平台PAI & 达摩院自然语言基础技术 概述 GPT模型能较好的处理文本生成领域的各种任务,比如文本补全,自由问答&am…

scala 流计算之 aggregate()

函数参数详解 def aggregate[B](z: >B)(seqop: (B, A) > B, combop: (B, B) > B): BB: 函数返回结果的数据类型;z:聚类前的参数的初始化值;seqop:是用于序列运算的运算符,用于计算所述集合中每个元素的总和&a…

JAVA环境安装及配置

目录 一、前言 二、JAVA下载及安装配置 1、下载SDK开发包 2、安装SDK 3、环境变量配置 一、前言 大学毕业前系统学习过JAVA,记得当时还是1.6版本,并且特意研读了我人生中第一本最厚的图书《JAVA学习笔记》。掌握了那时比较流行的框架SSH,…

场景编程集锦 - 趣谈验证码

1. 场景描述 或许是近年来电话推销机器人太泛滥了,常常搞得正常的电话销售“灰头土脸”。有人为了验证对方究竟是人还是机器,竟想出来各种各样的奇葩手段。最近一小伙接到了一个汽车推销电话,但他听声音无法判断对方是不是人工客服人员。尽管…

大数据导论笔记

视频课林子雨老师 大数据导论 网页笔记预习大数据导论 大数据导论复习笔记 一、大数据概述 1.数据的概念、类型和组织形式 数据概念 数据类型 (1)数据基本类型 数据类型包括文本,图片,音频,视频等 数据组织形式 2…

【UE4 第一人称射击游戏】30-简单的任务提示功能

上一篇:UE4 第一人称射击游戏】29-流畅的枪械移动本篇效果:到达指定位置后,右上角会出现新的任务提示信息步骤:打开“ThirdPersonCharacter”,添加一个string类型变量默认值设为“Progress Through The Level”打开“F…

.Net Core实现健康检查

ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。运行状况检查由应用程序作为 HTTP 终结点公开。可以为各种实时监视方案配置运行状况检查终结点: 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态…

MySQL 8.0 多实例安装

规划&#xff1a;主要就是data目录和port 端口以及socket 文件路径的差异管理&#xff1a; 配置文件准备 mkdir -p /data/330{6..8}/data chown -R mysql.mysql /data/* cat > /data/3306/my.cnf <<EOF [mysqld] usermysql basedir/usr/local/mysql datadir/data/3306…

新华三命令行基础

命令使用基础命令行视图用户视图• <h3c>• 只能查看配置&#xff0c;不能修改配置只能进行查看系统视图• [h3c]• 可以查看和修改全局配置接口视图• [H3C-GigabitEthernet0/0]• 可以对接口修改配置视图的切换system-view• 从用户视图进入系统视图interface g0/0• 从…

websocket_flask

1.使用socket协议构建server client文件&#xff0c;服务端构建maskrcnn分割模型&#xff0c;客户端发送图片返回分割结果&#xff1b;使用纯socket通信&#xff0c;通信传输效率较低&#xff0c;接收数据需要1024byte连续接收代码如下#server.py import socket import torchvi…