2024年华为杯研赛B题解题思路
B题 WLAN组网中网络吞吐量建模
问题1
请根据附件WLAN网络实测训练集中所提供的网络拓扑、业务流量、门限、节点间RSSI的测试基本信息,分析其中各参数对AP发送机会的影响,并给出影响性强弱的顺序。通过训练的模型,预测每个AP的发送机会,即发送数据帧序列的总时长(seq_time),并通过测试集 test_set_1_2ap和test_set_1_3ap(仅提供模型输入信息)预测AP发送数据帧序列的总时长。可按照同频AP个数分类分析和分别建模,也可统一分析和建模。
除了发送机会外,WLAN网络吞吐量还取决于发送时所选用的PHY Rate以及数据帧的比特数。AP给不同STA发送数据所选用的(MCS, NSS),即PHY Rate,受传输方式和干扰情况影响。以两个AP传输一段时间为例,有以下三种情形:
a)仅有同步传输时,两个AP交替抢到信道,偶然同时发送。因此,STA接收数据时的干扰主要来自环境底噪,因而SINR高,AP选用的(MCS, NSS)较高,PHY Rate高。
b)当两个AP总是不互听时,STA接收数据时可能受到较小的邻区干扰和环境底噪。分析时,假设环境底噪可忽略,则STA的SINR为关联AP到该STA的RSSI与邻区AP到该STA的RSSI之差。以图3.1中AP1与AP2为例,AP1发送数据给STA1-2,AP2发送数据给STA2-1,那么STA1-2在接收来自AP1的信号时,受到来自AP2的干扰,其SINR为AP1到STA1-2的RSSI与AP2到STA1-2的RSSI之差,STA2-1同理。AP发送数据选用的(MCS, NSS)与SINR相关。
c)当两个AP的RSSI处于[PD, ED]或[NAV, PD]时,传输中出现由于错过Preamble而导致的异步传输,与同步传输混合。那么在同步传输阶段,STA接收数据时受到的干扰只有环境底噪,在异步传输阶段,干扰来自邻区AP和环境底噪。
可见,AP的AMC所选用的(MCS, NSS)不仅与SINR相关,同时也与AP的传输方式相关。
1.1题目分析
问题 1:分析并预测AP发送机会(发送时长)
分析:
本题要求根据实测数据中的网络拓扑、业务流量、节点间的RSSI信息等,分析哪些因素对AP发送机会的影响,并通过训练模型预测AP发送数据的帧序列总时长(seq_time)。这里的“发送机会”可以通过AP发送数据时长来表征。由于WLAN中AP竞争信道资源,随机回退机制和信道条件(RSSI、CCA门限)对AP的发送机会影响很大。
初步思路:
- 数据预处理:提取影响发送机会的关键参数,如RSSI、信道门限、流量类型等。需要处理并清洗数据,尤其是RSSI信息。
- 特征分析:利用相关分析或统计方法,分析不同特征(RSSI、业务流量、信道门限等)对发送时长的影响,得出特征的重要性排序。
- 模型构建:可以选择机器学习算法(如随机森林、XGBoost)进行建模,训练模型预测AP的发送时长。由于AP数量不同,可能需要对同频AP数量进行分类建模。
- 模型验证:通过测试集对模型进行验证,评估预测精度。
1.2解题思路
1. 问题分析与特征选择
我们要根据WLAN的实际测量数据,分析影响AP发送机会的因素,并建立模型来预测AP的发送时长。首先,从数据集可以获得的主要特征包括:
- RSSI (Received Signal Strength Indication):表示接收信号强度,是影响信道质量的重要因素。
- 协议类型 (TCP/UDP):不同的协议可能影响数据包的发送时机和丢包率。
- 包长度 (Packet Length):数据包的大小可能影响传输时长。
- 竞争窗口 (Contention Window):AP竞争信道的时间与AP的发送机会直接相关。
- NAV(Network Allocator Vector)门限:表示静默时长,可能对AP的信道使用机会产生影响。
- 干扰情况 (Interference):AP之间的相互干扰影响各自的发送机会。
2. 发送机会的数学描述
AP的发送时长可以通过多个因素的函数来描述。假设AP的发送时长与信道空闲时间、AP间的干扰、竞争窗口、RSSI等因素相关,我们可以将AP发送时长建模为这些变量的函数。
令:
3. 竞争窗口的建模
AP 发送数据之前,需要通过竞争窗口机制进行信道争夺。竞争窗口的大小 CWi 是由AP 的竞争机制决定的,若碰撞发生,则CWi 逐渐增大。
竞争窗口可以描述为:
其中, k 是连续碰撞的次数, CWmin为竞争窗口的最小值。
AP 发送机会与竞争窗口大小成反比:
即,竞争窗口越大,发送机会越小。
4. 干扰的建模
AP 之间的干扰直接影响发送成功率。
假设AP 之间的干扰强度由AP i 和 AP j 的RSSI 之差决定。
干扰强度可以表示为:
当干扰强度较大时,AP 的发送时长将减少,因此:
5. 信道竞争时间的建模
信道竞争时间 Ti 是AP 为争夺信道所用的时间。这个时间由信道的空闲状态决定。当信道空闲时,AP 可以直接发送数据帧。
信道空闲的概率可以通过Poisson 分布建模:
其中,λ是信道繁忙的到达率, t 是时间。
信道空闲时间与AP 发送时长正相关:
6. 模型的构建
综合上述因素,AP i 的发送时长模型可以写为:
其中,α是一个待定系数,结合实际数据进行回归分析确定。
7. 数据处理与建模步骤
数据预处理:
-
- 处理缺失值,去除异常值。
- 对连续型变量进行标准化处理(如RSSI、竞争窗口、干扰强度等)。
- 对分类变量(如协议类型、包长度)进行one-hot编码。
特征选择:
-
- 使用相关性分析或特征重要性评估,确定对发送时长影响较大的特征。
模型训练:
-
- 使用多元线性回归、随机森林、XGBoost等机器学习算法对发送时长进行建模。
- 使用训练数据集进行模型训练,调整参数使得模型预测效果最佳。
模型验证:
-
- 使用测试集对模型进行验证,评估模型的预测效果,常用指标包括均方误差 (MSE)、R平方等。
结果分析:
-
- 通过模型得到AP的发送机会(即发送时长),并通过特征重要性分析,得出影响发送时长的主要因素。
8. 模型评估方法
使用累积分布函数 (CDF) 来评估模型精度。计算预测误差,并绘制误差的CDF曲线,取误差为90%时的值作为模型的误差评估值。
1.3参考代码
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler# 读取数据(替换为你的文件路径)
data = pd.read_csv('/mnt/data/training_set_2ap_loc0_nav82.csv')# 展示数据基本信息
print(data.info())
print(data.head())# 选择相关的特征,去掉不必要的列
features = ['test_dur', 'pkt_len', 'pd', 'ed', 'nav', 'ap_from_ap_x_sum_ant_rssi', 'sta_from_ap_x_sum_ant_rssi', 'num_ampdu', 'mcs', 'nss', 'per']
target = 'seq_time'# 去除空值
data = data[features + [target]].dropna()# 进行特征标准化
scaler = StandardScaler()
X = data[features]
y = data[target]
X_scaled = scaler.fit_transform(X)# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)# 使用随机森林模型
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)# 预测
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)# 模型评估
train_mse = mean_squared_error(y_train, y_pred_train)
test_mse = mean_squared_error(y_test, y_pred_test)
train_r2 = r2_score(y_train, y_pred_train)
test_r2 = r2_score(y_test, y_pred_test)print(f"训练集均方误差: {train_mse:.4f}, R2: {train_r2:.4f}")
print(f"测试集均方误差: {test_mse:.4f}, R2: {test_r2:.4f}")# 可视化真实值与预测值的对比
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred_test, alpha=0.6, color='b')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=3)
plt.xlabel('真实发送时长')
plt.ylabel('预测发送时长')
plt.title('真实值与预测值对比')
plt.grid(True)
plt.show()# 特征重要性
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
feature_names = np.array(features)# 可视化特征重要性
plt.figure(figsize=(10, 6))
sns.barplot(x=importances[indices], y=feature_names[indices], palette="coolwarm")
plt.title('特征重要性')
plt.xlabel('重要性得分')
plt.ylabel('特征')
plt.grid(True)
plt.show()# 信道空闲时间分析 (假设到达率 lambda)
lambda_rate = 0.5
t = np.linspace(0, 10, 100)
P_idle = np.exp(-lambda_rate * t)# 可视化信道空闲概率
plt.figure(figsize=(8, 5))
plt.plot(t, P_idle, 'b-', label=f'Poisson分布 $\lambda={lambda_rate}$')
plt.fill_between(t, P_idle, alpha=0.3, color='blue')
plt.xlabel('时间')
plt.ylabel('空闲概率')
plt.title('信道空闲概率')
plt.grid(True)
plt.legend()
plt.show()
问题2
请根据附件提供的实测训练集中的测试基本信息,特别是节点间RSSI信息和门限信息,结合问题1中对AP发送机会的分析,对测试中AP发送数据选用最多次数的(MCS, NSS)进行建模,并通过测试集 test_set_2_2ap和test_set_2_3ap(仅提供模型输入信息)预测(MCS, NSS)。(AP在AMC算法下自适应调节发送速率,过程中可能采用多个(MCS, NSS),AMC算法收敛速度快,故其中选用最多次数的(MCS, NSS)反映了SINR水平)。
2.1题目分析
问题 2:预测发送速率使用最多的PHY Rate (MCS NSS)
分析:
本题要求根据节点间的RSSI、信道信息和发送机会分析,预测AP在传输数据时选择的PHY速率(MCS NSS)。WLAN采用自适应调制编码(AMC)算法,根据SINR动态调整PHY速率,影响发送速率的主要因素是RSSI和干扰情况。
初步思路:
- 特征提取:重点关注RSSI、信道条件、AP之间的干扰等影响SINR的参数。基于问题1中的发送时长结果,进一步挖掘影响PHY速率的特征。
- 模型选择:利用机器学习或回归模型,基于RSSI和干扰情况,预测AP选择的(MCS NSS)。
结果分析:通过对测试集进行预测,验证模型的准确性,评估模型对不同AP之间干扰的适应性。
2.2解题思路
1. 问题分析与特征选择
PHY速率的选择与多个因素相关,尤其是RSSI(接收信号强度)、信道门限、干扰强度等。在WLAN环境中,AP的PHY速率取决于信道质量和干扰条件。因此,主要特征包括:
- RSSI:接收信号强度指示,是一个关键因素。较高的RSSI通常意味着可以使用更高的PHY速率。
- 信道门限:包括包检测门限(PD)、能量检测门限(ED)和NAV门限,这些门限会影响信道的可用性和干扰情况。
- 干扰强度:表示AP之间的相互干扰。较高的干扰会降低AP的PHY速率。
2. 调制编码方案 MCS 与 SINR 关系建模
PHY速率受信干噪比(SINR, Signal to Interference plus Noise Ratio)的影响,SINR反映了信号与干扰加噪声的比率。PHY速率通常随着SINR的增加而提升。
3. PHY速率的建模
PHY速率由MCS(调制和编码方案)和NSS(空间流数量)共同决定。我们需要分别建立MCS和NSS的预测模型,基于RSSI、SINR、干扰等特征预测它们的值。
MCS选择模型
- MCS反映了调制方案和编码率,决定了PHY速率的精细程度。可以将MCS建模为RSSI和SINR的函数:
- 假设MCS随SINR线性增长,MCS阶数与SINR成正比:
其中, k 和 b 是待定的回归系数。
此公式表明,随着SINR 的增加,AP 可以选择更高的MCS 阶数。
NSS 选择模型
NSS表示空间流的数量。NSS的选择受RSSI和干扰情况影响。
NSS与RSSI和干扰强度的非线性关系可以用Sigmoid函数建模:
这个公式表明,当RSSI较高且干扰较小时,AP可以使用更多的空间流。
4. 信道干扰与PHY 速率的关系
AP 之间的干扰会直接影响PHY 速率。
假设AP 之间的干扰强度与RSSI 的差值成正比:
5. PHY 速率的整体建模
综合以上分析,PHY 速率与RSSI、SINR 和干扰强度的关系可以总结为:
6. 模型验证
通过对模型的回归分析,可以验证预测MCS 和NSS 的效果。
利用均方误差(MSE)和R^2 系数对模型进行评估:
2.3参考代码
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler# 读取数据(请替换为你的数据路径)
data = pd.read_csv('/mnt/data/training_set_2ap_loc0_nav82.csv')# 展示数据基本信息
print(data.info())
print(data.head())# 选择相关的特征
features = ['rssi', 'pd', 'ed', 'nav', 'interference', 'protocol'] # 假设数据集中有这些特征
target_mcs = 'mcs' # MCS作为目标变量
target_nss = 'nss' # NSS作为目标变量# 去除空值
data = data[features + [target_mcs, target_nss]].dropna()# 进行特征标准化
scaler = StandardScaler()
X = data[features]
y_mcs = data[target_mcs]
y_nss = data[target_nss]
X_scaled = scaler.fit_transform(X)# 分割训练集和测试集
X_train, X_test, y_train_mcs, y_test_mcs = train_test_split(X_scaled, y_mcs, test_size=0.3, random_state=42)
X_train_nss, X_test_nss, y_train_nss, y_test_nss = train_test_split(X_scaled, y_nss, test_size=0.3, random_state=42)# 使用随机森林回归模型预测MCS
model_mcs = RandomForestRegressor(n_estimators=100, random_state=42)
model_mcs.fit(X_train, y_train_mcs)# 预测MCS
y_pred_mcs_train = model_mcs.predict(X_train)
y_pred_mcs_test = model_mcs.predict(X_test)# 使用随机森林回归模型预测NSS
model_nss = RandomForestRegressor(n_estimators=100, random_state=42)
model_nss.fit(X_train_nss, y_train_nss)# 预测NSS
y_pred_nss_train = model_nss.predict(X_train_nss)
y_pred_nss_test = model_nss.predict(X_test_nss)# 评估MCS模型
train_mse_mcs = mean_squared_error(y_train_mcs, y_pred_mcs_train)
test_mse_mcs = mean_squared_error(y_test_mcs, y_pred_mcs_test)
train_r2_mcs = r2_score(y_train_mcs, y_pred_mcs_train)
test_r2_mcs = r2_score(y_test_mcs, y_pred_mcs_test)print(f"MCS模型 - 训练集均方误差: {train_mse_mcs:.4f}, R²: {train_r2_mcs:.4f}")
print(f"MCS模型 - 测试集均方误差: {test_mse_mcs:.4f}, R²: {test_r2_mcs:.4f}")# 评估NSS模型
train_mse_nss = mean_squared_error(y_train_nss, y_pred_nss_train)
test_mse_nss = mean_squared_error(y_test_nss, y_pred_nss_test)
train_r2_nss = r2_score(y_train_nss, y_pred_nss_train)
test_r2_nss = r2_score(y_test_nss, y_pred_nss_test)print(f"NSS模型 - 训练集均方误差: {train_mse_nss:.4f}, R²: {train_r2_nss:.4f}")
print(f"NSS模型 - 测试集均方误差: {test_mse_nss:.4f}, R²: {test_r2_nss:.4f}")# MCS预测可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_test_mcs, y_pred_mcs_test, alpha=0.6, color='g')
plt.plot([y_test_mcs.min(), y_test_mcs.max()], [y_test_mcs.min(), y_test_mcs.max()], 'r--', lw=3)
plt.xlabel('真实MCS值')
plt.ylabel('预测MCS值')
plt.title('MCS真实值与预测值对比')
plt.grid(True)
plt.show()# NSS预测可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_test_nss, y_pred_nss_test, alpha=0.6, color='b')
plt.plot([y_test_nss.min(), y_test_nss.max()], [y_test_nss.min(), y_test_nss.max()], 'r--', lw=3)
plt.xlabel('真实NSS值')
plt.ylabel('预测NSS值')
plt.title('NSS真实值与预测值对比')
plt.grid(True)
plt.show()# 可视化MCS的特征重要性
importances_mcs = model_mcs.feature_importances_
indices_mcs = np.argsort(importances_mcs)[::-1]
feature_names = np.array(features)plt.figure(figsize=(10, 6))
sns.barplot(x=importances_mcs[indices_mcs], y=feature_names[indices_mcs], palette="viridis")
plt.title('MCS特征重要性')
plt.xlabel('重要性得分')
plt.ylabel('特征')
plt.grid(True)
plt.show()# 可视化NSS的特征重要性
importances_nss = model_nss.feature_importances_
indices_nss = np.argsort(importances_nss)[::-1]plt.figure(figsize=(10, 6))
sns.barplot(x=importances_nss[indices_nss], y=feature_names[indices_nss], palette="viridis")
plt.title('NSS特征重要性')
plt.xlabel('重要性得分')
plt.ylabel('特征')
plt.grid(True)
plt.show()