如何评价2024华为杯研究生数学建模竞赛(研赛)B题?

发布时间:
2024-09-24 03:43
阅读量:
7

2024年中国研究生数学建模竞赛B题 WLAN组网中网络吞吐量建模(WLAN机理建模+决策树) 精品文章|可视化|代码

完整文章近40页,代码千余行,可视化图表10余张,篇幅有限,放出部分内容供大家参考~

问题重述和分析

问题重述

本题旨在基于实际测量的WLAN(无线局域网)数据,建立一个精确的系统吞吐量预测模型。具体而言,提供了多个包含网络拓扑、业务流量、节点间RSSI、信道接入机制等基本信息的测试集,以及部分统计信息,如AP(接入点)的发送时长、选用的调制编码方案(MCS)、空间流数(NSS)、丢包率(PER)、吞吐量等。

需要解决的问题包括:

  1. 分析各参数对AP发送机会(发送数据帧序列的总时长)的影响,并预测AP的发送机会。
  2. 建立模型,预测AP发送数据时选用最多次数的(MCS, NSS)。
  3. 建立模型,预测系统的总吞吐量。
  4. 对模型的精度进行评估,绘制预测误差的累积分布函数(CDF),并计算模型的精度。

整体问题分析

赛题的核心是建立一个能够准确预测WLAN系统吞吐量的模型。在高密度部署场景下,节点密集度增加,导致干扰和碰撞加剧,实际带宽和数据传输速率下降。因此,需要准确地预测吞吐量,以优化WLAN系统性能。

主要挑战

  • 多因素耦合:节点间的RSSI、CCA门限、NAV机制、业务流量等因素相互影响,导致AP的发送机会和PHY层参数的选择具有复杂性。
  • 数据复杂性:提供的数据集包含大量的参数,需要从中提取关键特征,并进行合理的简化和假设。
  • 建模精度要求高:需要在模型中充分考虑各种影响因素,以满足赛题对预测精度的要求。

数据说明分析

赛题提供的数据集主要分为两部分:

  1. 测试基本信息:包括网络拓扑、业务流量、门限、节点间RSSI等。这些信息作为模型的输入参数,需要分析其对AP发送机会和PHY层参数的影响。
  2. 数据帧统计信息:包括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发送机会的影响

  1. 节点间RSSI

影响:AP之间的RSSI决定了它们是否能“听”到彼此,以及干扰的程度。 情况分析RSSI > ED门限(-62dBm):AP能够检测到对方的传输,避免同时发送,导致发送机会减少。 NAV门限 < RSSI ≤ PD门限(-82dBm):AP可能错过对方的Preamble,导致异步传输,增加发送机会,但也可能增加碰撞概率。 RSSI ≤ NAV门限:AP无法感知对方的存在,可能导致更多的信道占用。

  1. CCA门限

影响:CCA门限决定了AP对信道忙闲的判断。

判决规则包检测(PD)门限:用于检测Wi-Fi报文的Preamble。

能量检测(ED)门限:用于检测非Wi-Fi报文。

判决条件

   \text{PD} > \text{RSSI}_{\text{max}} \geq \text{ED} \implies \text{信道繁忙}

   \text{RSSI}_{\text{max}} < \text{ED} \implies \text{信道空闲}

  1. NAV机制

影响:NAV门限决定了AP是否会进入静默期。

情况分析

RSSI ≥ NAV门限:AP接收到相邻AP的帧,更新NAV,进入静默期,发送机会减少。

RSSI < NAV门限:AP无法更新NAV,不进入静默期,可能导致信道竞争加剧。

  1. 业务流量

影响:业务流量的类型(UDP/TCP)、数据包大小、发送间隔等影响AP的发送需求。

分析

UDP流量:发送间隔服从泊松分布,发送需求较稳定。

TCP流量:由于需要接收TCP ACK,发送需求可能受到网络状况影响。

影响性强弱排序

  1. 节点间RSSI
  2. CCA门限
  3. NAV机制
  4. 业务流量参数

建模方法

  1. 数据预处理

输入特征提取

节点间RSSI:

CCA门限:PD、ED值

NAV门限:NAV值

业务流量参数:协议类型、数据包长度(pkt_len)

  1. 统计分析

相关性分析

计算各输入特征与seq_time的皮尔逊相关系数。

识别主要影响因素。

可视化

绘制散点图,观察特征与seq_time之间的关系。

可能发现线性或非线性的关系。

  1. 数学建模

多元回归模型

建立回归模型,将seq_time作为因变量,输入特征作为自变量。

回归模型形式:

其中,为回归系数,为误差项。

非线性模型

如果发现特征与seq_time之间的关系非线性,可以考虑多项式回归或对数变换。

  1. 机器学习模型

模型选择: 决策树、随机森林、支持向量机(SVM)、人工神经网络(ANN)等。

优点: 能够捕捉复杂的非线性关系。 对于高维特征具有较好的处理能力。

  1. 模型训练与验证

训练集与验证集划分: 使用交叉验证或留出法,评估模型的泛化能力。

模型评估指标: 均方误差(MSE)、平均绝对误差(MAE)、决定系数()等。

  1. 预测测试集

使用训练好的模型,对test_set_1_2ap和test_set_1_3ap进行预测,得到每个AP的seq_time。

数学公式与推导

  1. 发送概率模型

假设

AP采用CSMA/CA机制,发送概率与竞争窗口有关。

发送概率

其中,为AP_i的竞争窗口大小。

  1. 碰撞概率

AP_i的碰撞概率

  1. 成功发送概率

AP_i的成功发送概率

  1. 平均发送时长

AP_i的平均发送时长

其中,为一次成功发送的时长。

问题二:AP的(MCS, NSS)选择预测

目标:预测AP发送数据时选用最多次数的(MCS, NSS)。

分析影响因素

  1. 信号与干扰

信号功率:AP到STA的RSSI,记为

干扰功率:其他AP到STA的RSSI,记为

  1. SINR计算

公式

省略部分内容

其中,为噪声功率。

  1. 传输方式的影响

同步传输:干扰较小,SINR较高。

异步传输:干扰较大,SINR降低。

  1. PER与SINR的关系

PER模型

其中,为拟合参数。

建模方法

  1. SINR计算

信号功率

干扰功率

噪声功率

可设定为常数,

例如,

  1. (MCS, NSS)映射

建立映射表: 根据标准或实测数据,确定SINR与(MCS, NSS)的对应关系。

示例 \begin{cases} \text{SINR} \geq \gamma_1 \implies (\text{MCS}, \text{NSS}) = (\text{MCS}_{\text{max}}, \text{NSS}_{\text{max}}) \\ \gamma_2 \leq \text{SINR} < \gamma_1 \implies (\text{MCS}, \text{NSS}) = (\text{MCS}_{\text{mid}}, \text{NSS}_{\text{mid}}) \\ \text{省略部分内容} < \gamma_2 \implies \text{MCS}...... \end{cases}

  1. 分类模型

使用机器学习算法: 多分类模型,如决策树、随机森林、支持向量机(SVM)、神经网络等。

特征: SINR、信号功率、干扰功率、传输方式(同步/异步)、PER等。

目标变量: (MCS, NSS)组合。

  1. 模型训练

数据集: 使用训练集中的数据,提取特征和目标变量。

模型评估: 准确率、召回率、F1-score等。

  1. 预测测试集

对于test_set_2_2ap和test_set_2_3ap,计算SINR,输入模型,预测(MCS, NSS)。

问题三:系统吞吐量的建模与预测

目标:预测网络的总吞吐量。

步骤

  1. 获取发送时长(seq_time)

使用问题一的预测结果。

  1. 确定PHY速率(PHY Rate)

使用问题二的(MCS, NSS)预测结果,查表获取PHY Rate。

PHY Rate查表

例如,对于20MHz带宽,MCS和NSS的组合对应的PHY Rate。

  1. 计算有效传输时间

公式: 省略部分内容

  1. 计算成功传输的比特数

公式: 省略部分内容

  1. 考虑聚合机制

PPDU有效载荷计算

吞吐量计算修正

省略部分内容

  1. 计算每个AP的吞吐量

公式

  1. 系统总吞吐量

公式: 省略部分内容

模型优化

  • PER模型的精细化
  • 根据SINR与PER的关系,建立更精确的模型。
  • 可能采用分段函数或插值方法。
  • 协议开销的考虑
  • 考虑RTS、CTS、ACK等帧的开销。
  • 修正有效传输时间。
  • 调整因子
  • 根据实测数据,加入调整因子,提高模型精度。

问题四:模型精度的评估

目标:评估模型的精度,绘制预测误差的CDF曲线。

步骤

  1. 计算预测误差(error)

公式

  1. 绘制CDF曲线

步骤

将所有error按从小到大排序,形成序列

计算累积分布函数(CDF):

省略部分内容

绘制图形

横轴为error,纵轴为CDF。

  1. 模型精度评估

定义模型精度

找到使CDF达到90%的error值,记为

模型精度为:

省略部分内容

解释: 当90%的预测误差小于时,模型精度越高,越小。

  1. 分别评估

每个AP的吞吐量预测精度

对每个AP的error单独计算CDF,得到AP级别的模型精度。

系统吞吐量的预测精度

对所有AP的总吞吐量计算error和CDF,得到系统级别的模型精度。

附录:关键公式与参数

  1. SINR计算公式

  1. PER模型

  1. PHY Rate查表

20MHz带宽时,选用不同(MCS, NSS)组合的PHY Rate(单位:Mbps)


MCSNSS=1NSS=2
08.617.2
117.234.4
225.851.6
334.468.8
451.6103.2
568.8137.6
677.4154.9
786.0172.1
8103.2206.5
9114.7229.4
10129.0258.1
11143.4286.8


  1. 帧序列时长

RTS-CTS模式下的帧序列总时长

各部分时长

省略部分内容

省略部分内容

  1. 竞争窗口

二进制指数退避算法

省略部分内容 其中,为重传次数。

  1. 发送概率

省略部分内容

总结

通过对WLAN系统的深入分析,建立了从输入参数到AP发送机会、PHY层参数、最终系统吞吐量的完整预测模型。利用数学公式和机器学习方法,详细阐述了每个问题的解题思路和步骤。模型充分考虑了节点间RSSI、CCA门限、NAV机制、业务流量类型、SINR、(MCS, NSS)、PER、聚合机制等多种因素,对提高模型的准确性和鲁棒性至关重要。最后,通过CDF曲线评估了模型的精度,为模型的优化和改进提供了参考。

问题求解:

下面是将根据前面的建模过程,针对问题1、2、3、4分别提供完整的代码示例。 这里首先使用生成一些示例数据来模拟实际情况。供大家参考。




问题1:AP发送机会的分析与预测

目标:根据网络拓扑、业务流量、门限、节点间RSSI等输入参数,分析各参数对AP发送机会(seq_time)的影响,并建立模型预测AP的发送机会。

步骤:

  1. 数据生成与预处理:创建模拟的数据集,包括输入特征和目标变量。
  2. 特征分析:计算特征与目标变量之间的相关性,确定主要影响因素。
  3. 模型建立:使用多元线性回归或机器学习模型来预测seq_time。
  4. 模型评估:评估模型性能,检查预测效果。

代码实现:

# 导入必要的库 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)。

步骤:

  1. 数据生成与预处理:创建模拟的数据集,包括SINR和对应的(MCS, NSS)。
  2. 建立SINR与(MCS, NSS)的映射关系
  3. 建立分类模型:使用机器学习模型预测(MCS, NSS)。
  4. 模型评估:评估模型的预测准确率。

代码实现:

# 导入必要的库 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())

问题三

省略该部分代码

问题四

省略该部分代码

END