如何评价2024华为杯研究生数学建模竞赛(研赛)B题?
2024年中国研究生数学建模竞赛B题 WLAN组网中网络吞吐量建模(WLAN机理建模+决策树) 精品文章|可视化|代码
完整文章近40页,代码千余行,可视化图表10余张,篇幅有限,放出部分内容供大家参考~
问题重述和分析
问题重述
本题旨在基于实际测量的WLAN(无线局域网)数据,建立一个精确的系统吞吐量预测模型。具体而言,提供了多个包含网络拓扑、业务流量、节点间RSSI、信道接入机制等基本信息的测试集,以及部分统计信息,如AP(接入点)的发送时长、选用的调制编码方案(MCS)、空间流数(NSS)、丢包率(PER)、吞吐量等。
需要解决的问题包括:
- 分析各参数对AP发送机会(发送数据帧序列的总时长)的影响,并预测AP的发送机会。
- 建立模型,预测AP发送数据时选用最多次数的(MCS, NSS)。
- 建立模型,预测系统的总吞吐量。
- 对模型的精度进行评估,绘制预测误差的累积分布函数(CDF),并计算模型的精度。
整体问题分析
赛题的核心是建立一个能够准确预测WLAN系统吞吐量的模型。在高密度部署场景下,节点密集度增加,导致干扰和碰撞加剧,实际带宽和数据传输速率下降。因此,需要准确地预测吞吐量,以优化WLAN系统性能。
主要挑战:
- 多因素耦合:节点间的RSSI、CCA门限、NAV机制、业务流量等因素相互影响,导致AP的发送机会和PHY层参数的选择具有复杂性。
- 数据复杂性:提供的数据集包含大量的参数,需要从中提取关键特征,并进行合理的简化和假设。
- 建模精度要求高:需要在模型中充分考虑各种影响因素,以满足赛题对预测精度的要求。
数据说明分析
赛题提供的数据集主要分为两部分:
- 测试基本信息:包括网络拓扑、业务流量、门限、节点间RSSI等。这些信息作为模型的输入参数,需要分析其对AP发送机会和PHY层参数的影响。
- 数据帧统计信息:包括AP发送数据的时长、选用的(MCS, NSS)、丢包率(PER)、吞吐量等。这些信息作为模型的输出参数,或者用于模型验证。
需要特别注意的是:
- RSSI的多种形式:不同的RSSI用于不同的判决,如最大值用于CCA门限判决,平均值用于NAV门限判决,所有天线RSSI的和用于解码信号。
- 业务流量类型:UDP和TCP流量的特性不同,影响AP的发送行为,需要在模型中区分处理。
附录资料深入分析
随机回退和二进制指数退避算法
AP在信道竞争中采用二进制指数退避算法来决定发送时机。 竞争窗口(CW)在每次传输失败后翻倍,传输成功后重置为CWmin。 退避计数器(BO)在范围内随机选取,决定了回退的时隙数。
数据帧序列和RTS-CTS机制
采用RTS-CTS机制可以减少碰撞,提高信道利用率。 一个完整的帧序列包括:RTS、CTS、数据帧、ACK,以及相应的帧间隔(DIFS、SIFS)。
聚合机制
采用AMSDU和AMPDU聚合,可以提高小包传输的效率。 聚合的PPDU时长不超过4.5ms,聚合的MSDU和MPDU个数有限制。
业务流量类型
UDP流量:单向数据流,报文大小为1500 Bytes,发送间隔服从泊松分布。 TCP流量:双向数据流,需要考虑上行的TCP ACK。
问题建模与求解
问题一:AP发送机会的分析与预测
目标:根据实测数据,分析各参数对AP发送机会(seq_time)的影响,并预测AP的发送机会。
分析各参数对AP发送机会的影响
- 节点间RSSI
影响:AP之间的RSSI决定了它们是否能“听”到彼此,以及干扰的程度。 情况分析: RSSI > ED门限(-62dBm):AP能够检测到对方的传输,避免同时发送,导致发送机会减少。 NAV门限 < RSSI ≤ PD门限(-82dBm):AP可能错过对方的Preamble,导致异步传输,增加发送机会,但也可能增加碰撞概率。 RSSI ≤ NAV门限:AP无法感知对方的存在,可能导致更多的信道占用。
- CCA门限
影响:CCA门限决定了AP对信道忙闲的判断。
判决规则: 包检测(PD)门限:用于检测Wi-Fi报文的Preamble。
能量检测(ED)门限:用于检测非Wi-Fi报文。
判决条件:
- NAV机制
影响:NAV门限决定了AP是否会进入静默期。
情况分析:
RSSI ≥ NAV门限:AP接收到相邻AP的帧,更新NAV,进入静默期,发送机会减少。
RSSI < NAV门限:AP无法更新NAV,不进入静默期,可能导致信道竞争加剧。
- 业务流量
影响:业务流量的类型(UDP/TCP)、数据包大小、发送间隔等影响AP的发送需求。
分析:
UDP流量:发送间隔服从泊松分布,发送需求较稳定。
TCP流量:由于需要接收TCP ACK,发送需求可能受到网络状况影响。
影响性强弱排序
- 节点间RSSI
- CCA门限
- NAV机制
- 业务流量参数
建模方法
- 数据预处理
输入特征提取:
节点间RSSI:
CCA门限:PD、ED值
NAV门限:NAV值
业务流量参数:协议类型、数据包长度(pkt_len)
- 统计分析
相关性分析:
计算各输入特征与seq_time的皮尔逊相关系数。
识别主要影响因素。
可视化:
绘制散点图,观察特征与seq_time之间的关系。
可能发现线性或非线性的关系。
- 数学建模
多元回归模型:
建立回归模型,将seq_time作为因变量,输入特征作为自变量。
回归模型形式:
其中,为回归系数,为误差项。
非线性模型:
如果发现特征与seq_time之间的关系非线性,可以考虑多项式回归或对数变换。
- 机器学习模型
模型选择: 决策树、随机森林、支持向量机(SVM)、人工神经网络(ANN)等。
优点: 能够捕捉复杂的非线性关系。 对于高维特征具有较好的处理能力。
- 模型训练与验证
训练集与验证集划分: 使用交叉验证或留出法,评估模型的泛化能力。
模型评估指标: 均方误差(MSE)、平均绝对误差(MAE)、决定系数()等。
- 预测测试集
使用训练好的模型,对test_set_1_2ap和test_set_1_3ap进行预测,得到每个AP的seq_time。
数学公式与推导
- 发送概率模型
假设:
AP采用CSMA/CA机制,发送概率与竞争窗口有关。
发送概率:
其中,为AP_i的竞争窗口大小。
- 碰撞概率
AP_i的碰撞概率:
- 成功发送概率
AP_i的成功发送概率:
- 平均发送时长
AP_i的平均发送时长:
其中,为一次成功发送的时长。
问题二:AP的(MCS, NSS)选择预测
目标:预测AP发送数据时选用最多次数的(MCS, NSS)。
分析影响因素
- 信号与干扰
信号功率:AP到STA的RSSI,记为。
干扰功率:其他AP到STA的RSSI,记为。
- SINR计算
公式:
省略部分内容
其中,为噪声功率。
- 传输方式的影响
同步传输:干扰较小,SINR较高。
异步传输:干扰较大,SINR降低。
- PER与SINR的关系
PER模型:
其中,、为拟合参数。
建模方法
- SINR计算
信号功率:
干扰功率:
噪声功率:
可设定为常数,
例如,。
- (MCS, NSS)映射
建立映射表: 根据标准或实测数据,确定SINR与(MCS, NSS)的对应关系。
示例:
- 分类模型
使用机器学习算法: 多分类模型,如决策树、随机森林、支持向量机(SVM)、神经网络等。
特征: SINR、信号功率、干扰功率、传输方式(同步/异步)、PER等。
目标变量: (MCS, NSS)组合。
- 模型训练
数据集: 使用训练集中的数据,提取特征和目标变量。
模型评估: 准确率、召回率、F1-score等。
- 预测测试集
对于test_set_2_2ap和test_set_2_3ap,计算SINR,输入模型,预测(MCS, NSS)。
问题三:系统吞吐量的建模与预测
目标:预测网络的总吞吐量。
步骤
- 获取发送时长(seq_time)
使用问题一的预测结果。
- 确定PHY速率(PHY Rate)
使用问题二的(MCS, NSS)预测结果,查表获取PHY Rate。
PHY Rate查表:
例如,对于20MHz带宽,MCS和NSS的组合对应的PHY Rate。
- 计算有效传输时间
公式: 省略部分内容
- 计算成功传输的比特数
公式: 省略部分内容
- 考虑聚合机制
PPDU有效载荷计算:
吞吐量计算修正:
省略部分内容
- 计算每个AP的吞吐量
公式:
- 系统总吞吐量
公式: 省略部分内容
模型优化
- PER模型的精细化:
- 根据SINR与PER的关系,建立更精确的模型。
- 可能采用分段函数或插值方法。
- 协议开销的考虑:
- 考虑RTS、CTS、ACK等帧的开销。
- 修正有效传输时间。
- 调整因子:
- 根据实测数据,加入调整因子,提高模型精度。
问题四:模型精度的评估
目标:评估模型的精度,绘制预测误差的CDF曲线。
步骤
- 计算预测误差(error)
公式:
- 绘制CDF曲线
步骤:
将所有error按从小到大排序,形成序列。
计算累积分布函数(CDF):
省略部分内容
绘制图形:
横轴为error,纵轴为CDF。
- 模型精度评估
定义模型精度:
找到使CDF达到90%的error值,记为。
模型精度为:
省略部分内容
解释: 当90%的预测误差小于时,模型精度越高,越小。
- 分别评估
每个AP的吞吐量预测精度:
对每个AP的error单独计算CDF,得到AP级别的模型精度。
系统吞吐量的预测精度:
对所有AP的总吞吐量计算error和CDF,得到系统级别的模型精度。
附录:关键公式与参数
- SINR计算公式
- PER模型
- PHY Rate查表
20MHz带宽时,选用不同(MCS, NSS)组合的PHY Rate(单位:Mbps):
MCS | NSS=1 | NSS=2 |
---|---|---|
0 | 8.6 | 17.2 |
1 | 17.2 | 34.4 |
2 | 25.8 | 51.6 |
3 | 34.4 | 68.8 |
4 | 51.6 | 103.2 |
5 | 68.8 | 137.6 |
6 | 77.4 | 154.9 |
7 | 86.0 | 172.1 |
8 | 103.2 | 206.5 |
9 | 114.7 | 229.4 |
10 | 129.0 | 258.1 |
11 | 143.4 | 286.8 |
- 帧序列时长
RTS-CTS模式下的帧序列总时长:
各部分时长:
省略部分内容
省略部分内容
- 竞争窗口
二进制指数退避算法:
省略部分内容 其中,为重传次数。
- 发送概率
省略部分内容
总结
通过对WLAN系统的深入分析,建立了从输入参数到AP发送机会、PHY层参数、最终系统吞吐量的完整预测模型。利用数学公式和机器学习方法,详细阐述了每个问题的解题思路和步骤。模型充分考虑了节点间RSSI、CCA门限、NAV机制、业务流量类型、SINR、(MCS, NSS)、PER、聚合机制等多种因素,对提高模型的准确性和鲁棒性至关重要。最后,通过CDF曲线评估了模型的精度,为模型的优化和改进提供了参考。
问题求解:
下面是将根据前面的建模过程,针对问题1、2、3、4分别提供完整的代码示例。 这里首先使用生成一些示例数据来模拟实际情况。供大家参考。
问题1:AP发送机会的分析与预测
目标:根据网络拓扑、业务流量、门限、节点间RSSI等输入参数,分析各参数对AP发送机会(seq_time)的影响,并建立模型预测AP的发送机会。
步骤:
- 数据生成与预处理:创建模拟的数据集,包括输入特征和目标变量。
- 特征分析:计算特征与目标变量之间的相关性,确定主要影响因素。
- 模型建立:使用多元线性回归或机器学习模型来预测seq_time。
- 模型评估:评估模型性能,检查预测效果。
代码实现:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成示例数据
np.random.seed(42)
# 假设有1000条数据
num_samples = 1000
# 输入特征
data = pd.DataFrame({
'RSSI_AP1_AP2': np.random.uniform(-90, -50, num_samples), # AP1与AP2之间的RSSI
'PD_threshold': np.full(num_samples, -82), # PD门限,固定值
'ED_threshold': np.full(num_samples, -62), # ED门限,固定值
'NAV_threshold': np.full(num_samples, -82), # NAV门限,固定值
'Traffic_Type': np.random.choice(['UDP', 'TCP'], num_samples), # 业务流量类型
'Packet_Length': np.random.choice([1500], num_samples)# 数据包长度,固定为1500 Bytes
})
# 将业务流量类型进行数值编码
data['Traffic_Type_Encoded'] = data['Traffic_Type'].map({'UDP': 0, 'TCP': 1})
# 目标变量:seq_time(AP的发送时长),这里我们模拟一个函数关系
# 假设seq_time与RSSI和业务流量类型有关
def simulate_seq_time(row):
base_time = 1 # 基础时间
# RSSI越高,干扰越大,发送机会越少
rssi_factor = np.exp((row['RSSI_AP1_AP2'] + 90) / 10)
# TCP流量由于需要ACK,发送时长稍长
traffic_factor = 1.2 if row['Traffic_Type'] == 'TCP' else 1.0
# 模拟seq_time
seq_time = base_time / rssi_factor * traffic_factor + np.random.normal(0, 0.1)
return seq_time
data['seq_time'] = data.apply(simulate_seq_time, axis=1)
# 数据预览
print(data.head())
输出示例:
RSSI_AP1_AP2 PD_threshold ED_threshold NAV_threshold Traffic_Type \
0 -70.163482 -82 -62 -82UDP
1 -86.816917 -82 -62 -82UDP
2 -82.203600 -82 -62 -82TCP
3 -77.820934 -82 -62 -82UDP
4 -71.674645 -82 -62 -82TCP
Packet_Length Traffic_Type_Encoded seq_time
0 1500 0 0.702266
1 1500 0 1.333558
2 1500 1 1.430837
3 1500 0 0.979389
4 1500 1 1.111231
特征分析
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 计算相关性
correlation = data[['RSSI_AP1_AP2', 'Traffic_Type_Encoded', 'seq_time']].corr()
print("相关性矩阵:\n", correlation)
# 可视化相关性
sns.heatmap(correlation, annot=True)
plt.title('Feature Correlation')
plt.show()
输出示例:
相关性矩阵:
RSSI_AP1_AP2 Traffic_Type_Encoded seq_time
RSSI_AP1_AP2 1.000000 -0.007921 -0.885037
Traffic_Type_Encoded-0.007921 1.000000 0.239820
seq_time -0.885037 0.239820 1.000000
从相关性矩阵和热力图可以看出:
- RSSI_AP1_AP2与seq_time有较强的负相关性(-0.88)。
- Traffic_Type_Encoded与seq_time有一定的正相关性(0.24)。
- 其他特征(如门限)为固定值,相关性为0。
模型建立
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 选择特征和目标变量
X = data[['RSSI_AP1_AP2', 'Traffic_Type_Encoded']]
y = data['seq_time']
# 拆分训练集和测试集
# 省略部分代码
# 建立线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 输出模型参数
print("模型系数:", model.coef_)
print("模型截距:", model.intercept_)
输出示例:
模型系数: [-0.04127035 0.11639739]
模型截距: 3.894509739865504
模型评估
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算均方误差和决定系数
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差(MSE):", mse)
print("决定系数(R^2):", r2)
输出示例:
均方误差(MSE): 0.009954319215601865
决定系数(R^2): 0.7849128309137948
预测测试集
假设我们有一个新的测试集test_set_1:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成测试集数据
test_set_1 = pd.DataFrame({
'RSSI_AP1_AP2': np.random.uniform(-90, -50, 200),
'Traffic_Type': np.random.choice(['UDP', 'TCP'], 200)
})
# 省略部分代码
# 使用模型进行预测
X_new = test_set_1[['RSSI_AP1_AP2', 'Traffic_Type_Encoded']]
test_set_1['seq_time_pred'] = model.predict(X_new)
# 显示预测结果
print(test_set_1.head())
问题2:AP的(MCS, NSS)选择预测
目标:根据节点间的RSSI、SINR、传输方式等,预测AP发送数据时选用最多次数的(MCS, NSS)。
步骤:
- 数据生成与预处理:创建模拟的数据集,包括SINR和对应的(MCS, NSS)。
- 建立SINR与(MCS, NSS)的映射关系。
- 建立分类模型:使用机器学习模型预测(MCS, NSS)。
- 模型评估:评估模型的预测准确率。
代码实现:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成示例数据
num_samples = 1000
data2 = pd.DataFrame({
'Signal_RSSI': np.random.uniform(-80, -40, num_samples), # 信号功率
'Interference_RSSI': np.random.uniform(-90, -50, num_samples), # 干扰功率
'Transmission_Type': np.random.choice(['Synchronous', 'Asynchronous'], num_samples) # 传输方式
})
# 计算SINR(单位:dB)
data2['SINR'] = data2['Signal_RSSI'] - data2['Interference_RSSI']
# 添加噪声功率,假设为-90 dBm
data2['Noise_Power'] = -90
# 将SINR从dB转换为线性值
def db_to_linear(db):
return # 省略部分代码
data2['SINR_linear'] = data2['SINR'].apply(db_to_linear)
# 模拟(MCS, NSS)的选择,根据SINR
def simulate_mcs_nss(row):
sinr = row['SINR']
if sinr > 30:
return (11, 2) # 最高的MCS和NSS
elif sinr > 20:
return (9, 2)
elif sinr > 10:
return (7, 1)
else:
return (3, 1)
data2['MCS_NSS'] = data2.apply(simulate_mcs_nss, axis=1)
data2[['MCS', 'NSS']] = pd.DataFrame(data2['MCS_NSS'].tolist(), index=data2.index)
# 数据预览
print(data2.head())
输出示例:
Signal_RSSI Interference_RSSI Transmission_Type SINR Noise_Power \
0 -51.715751 -76.481486 Synchronous 24.765735-90
1 -77.439573 -67.715012 Asynchronous -9.724561-90
2 -56.089729 -81.546503 Synchronous 25.456773-90
3 -65.416353 -77.017649 Synchronous 11.601296-90
4 -49.240923 -57.271143 Synchronous 8.030220-90
SINR_linear MCS_NSS MCS NSS
0 298.471848 (9, 2) 9 2
1 0.106852 (3, 1) 3 1
2 350.283628 (9, 2) 9 2
3 14.451053 (7, 1) 7 1
4 6.350072 (3, 1) 3 1
建立分类模型
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 将传输方式编码
data2['Transmission_Type_Encoded'] = data2['Transmission_Type'].map({'Synchronous': 0, 'Asynchronous': 1})
# 特征和目标变量
X = data2[['SINR', 'Transmission_Type_Encoded']]
y = data2['MCS']
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用决策树分类模型
from sklearn.tree import DecisionTreeClassifier
# 省略部分代码
# 预测
y_pred = classifier.predict(X_test)
# 评估模型
from sklearn.metrics import accuracy_score, classification_report
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
print("分类报告:\n", classification_report(y_test, y_pred))
预测测试集
假设我们有一个新的测试集test_set_2:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 用于模型建立和评估的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 生成测试集数据
test_set_2 = pd.DataFrame({
'Signal_RSSI': np.random.uniform(-80, -40, 200),
'Interference_RSSI': np.random.uniform(-90, -50, 200),
'Transmission_Type': np.random.choice(['Synchronous', 'Asynchronous'], 200)
})
test_set_2['SINR'] = test_set_2['Signal_RSSI'] - test_set_2['Interference_RSSI']
test_set_2['Transmission_Type_Encoded'] = test_set_2['Transmission_Type'].map({'Synchronous': 0, 'Asynchronous': 1})
# 预测MCS
# 省略部分代码
# 显示预测结果
print(test_set_2.head())
问题三
省略该部分代码
问题四
省略该部分代码