当前位置: 首页 > news >正文

2025年“创新杯”(原钉钉杯) B题 详细建模思路

2025年“创新杯”(原钉钉杯) 建模思路

B题 道路路面维护需求综合预测

2025钉钉杯 B题解题思路

任务A:道路维护需求预测(二分类)

1 问题分析

  • 特征多样:数值型(PCI、AADT)+ 分类型(道路类型、沥青类型)。
  • 样本不平衡:需维护路段占少数。
  • 可解释性:需量化关键特征对维护需求的影响。
  • 解决方案:随机森林——支持混合数据、鲁棒、自带特征重要性。

2 Python 代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, recall_score, f1_score, confusion_matrix
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
import matplotlib.pyplot as plt# 数据
data = pd.read_csv('road_maintenance.csv')
X = data[['PCI','Road_Type','AADT','Asphalt_Type','Last_Maintenance','Average_Rainfall','Rutting','IRI']]
y = data['Needs_Maintenance']# 预处理
pre = ColumnTransformer([('cat', OneHotEncoder(), ['Road_Type','Asphalt_Type']),('num', StandardScaler(), ['PCI','AADT','Last_Maintenance','Average_Rainfall','Rutting','IRI'])])
X_proc = pre.fit_transform(X)# 划分
X_train, X_test, y_train, y_test = train_test_split(X_proc, y, test_size=0.2, random_state=42)# 建模
clf = RandomForestClassifier(n_estimators=100, max_depth=10,min_samples_split=5, random_state=42)
clf.fit(X_train, y_train)# 评估
y_pred = clf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Recall:  ", recall_score(y_test, y_pred))
print("F1:      ", f1_score(y_test, y_pred))# 特征重要性
names = pre.get_feature_names_out()
imp = clf.feature_importances_
plt.barh(names, imp)
plt.title('Feature Importance')
plt.show()

3 MATLAB 代码

%% 数据
data = readtable('road_maintenance.csv');
cat_vars = {'Road_Type','Asphalt_Type'};
for v = cat_varsdata.(v{1}) = categorical(data.(v{1}));
end
X = data(:, {'PCI','Road_Type','AADT','Asphalt_Type', ...'Last_Maintenance','Average_Rainfall','Rutting','IRI'});
y = data.Needs_Maintenance;%% 编码与标准化
Xenc = onehotencode(X, cat_vars);
Xnorm = normalize(Xenc);%% 划分
rng(1)
cv = cvpartition(size(Xnorm,1), 'HoldOut', 0.2);
Xtr = Xnorm(cv.training,:); ytr = y(cv.training);
Xte = Xnorm(cv.test,:);     yte = y(cv.test);%% 模型
model = TreeBagger(100, Xtr, ytr, ...'Method','classification', ...'MaxDepth',10, 'MinParentSize',5);%% 评估
y_hat = str2double(predict(model, Xte));
cm = confusionmat(yte, y_hat);
acc = sum(diag(cm))/sum(cm(:));
rec = cm(2,2)/sum(cm(2,:));
f1  = 2*rec*cm(2,2)/sum(cm(:,2))/(rec+cm(2,2)/sum(cm(:,2)));fprintf('Accuracy: %.4f\nRecall: %.4f\nF1: %.4f\n', acc, rec, f1);%% 特征重要性
imp = model.OOBPermutedPredictorDeltaError;
bar(imp)
xticklabels(X.Properties.VariableNames)
title('Feature Importance')

任务B:维护紧急程度评分与优先级划分

1 思路

  1. 输出连续评分:将任务A的随机森林改为回归模型,输出 [0,1] 区间的紧急程度 R
  2. 无监督聚类:使用 K-means 把 R 划分为高、中、低三个优先级。
  3. 可解释验证:检查高优先级路段的 PCI、IRI 等核心指标,确保策略合理。

2 Python 代码

import numpy as np, pandas as pd, matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler# 数据
data = pd.read_csv('road_maintenance.csv')
X = data.drop('Needs_Maintenance', axis=1)
y = data['Needs_Maintenance']# 回归随机森林
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X, y)
R = rf.predict(X)# 归一化
R_norm = MinMaxScaler().fit_transform(R.reshape(-1,1)).flatten()# K-means 聚类(k=3)
km = KMeans(n_clusters=3, random_state=42)
clusters = km.fit_predict(R_norm.reshape(-1,1))# 映射优先级
centers = km.cluster_centers_.flatten()
order = np.argsort(centers)
prio_map = {order[0]:0, order[1]:1, order[2]:2}
priorities = np.array([prio_map[c] for c in clusters])# 统计
print(pd.Series(priorities).value_counts().sort_index())# 可视化
plt.hist(R_norm[priorities==0], bins=30, alpha=.7, color='green', label='Low')
plt.hist(R_norm[priorities==1], bins=30, alpha=.7, color='blue',  label='Medium')
plt.hist(R_norm[priorities==2], bins=30, alpha=.7, color='red',   label='High')
plt.xlabel('Maintenance Urgency Score')
plt.ylabel('Number of Segments')
plt.title('Priority Distribution via K-means')
plt.legend(); plt.show()

3 MATLAB 代码

%% 加载任务A回归模型
load('rf_regression_model.mat');   % model 已保存
data = readtable('road_maintenance.csv');
X = data{:, {'PCI','Road_Type','AADT','Asphalt_Type', ...'Last_Maintenance','Average_Rainfall','Rutting','IRI'}};%% 预测紧急程度
R = predict(model, X);
R_norm = (R - min(R)) / (max(R) - min(R));%% K-means 聚类
rng(1)
[idx, centers] = kmeans(R_norm, 3);
[~, order] = sort(centers);
prio = zeros(size(idx));
prio(idx==order(1)) = 0;  % 低
prio(idx==order(2)) = 1;  % 中
prio(idx==order(3)) = 2;  % 高%% 计数
fprintf('High: %d, Medium: %d, Low: %d\n', ...sum(prio==2), sum(prio==1), sum(prio==0));%% 可视化
figure
histogram(R_norm(prio==0), 'BinWidth',0.05,'FaceColor','g'); hold on
histogram(R_norm(prio==1), 'BinWidth',0.05,'FaceColor','b');
histogram(R_norm(prio==2), 'BinWidth',0.05,'FaceColor','r');
xlabel('Maintenance Urgency Score'); ylabel('Count');
title('Priority Distribution'); legend('Low','Medium','High');
http://www.lryc.cn/news/598012.html

相关文章:

  • 钉钉DingTalk完整版下载离线安装包2025
  • Webpack/Vite 终极指南:前端开发的“涡轮增压引擎“
  • 2025创新杯(钉钉杯)数学建模 AB赛题已出
  • 设置后轻松将 iPhone 转移到 iPhone
  • vue3 + vite || Vue3 + Webpack创建项目
  • 脑电分析——EEGLAB的使用与代码的解读
  • 系统配置修改安全指南
  • 硬件基础 -- PLL锁相环
  • c# SqlFunc.IF 使用方法
  • BacNet 是什么?跟 LoRaWAN 的关系是什么?
  • 结构化布线系统详解
  • YOLOv4深度解析:革命性的实时目标检测技术
  • Java学习第七十二部分——Zookeeper
  • ZooKeeper 是什么?
  • Qt(资源库和按钮组)
  • 【超完整图文】在 Ubuntu 环境下安装 Qt Creator 4.7.0(较旧版本)
  • React+threejs两种3D多场景渲染方案
  • 爬虫算法原理解析
  • 力扣刷题记录
  • Three.js 光照系统详解:打造真实的 3D 光影世界
  • 《从网页到桌面:PWA如何借两大核心实现离线启动》
  • b-up:Enzo_mi:Transformer DETR系列
  • 商场导航软件的核心技术实现:3D+AI 如何解决用户搜索意图识别难题
  • 《云计算蓝皮书 2025 》发布:云计算加速成为智能时代核心引擎
  • Flutter之Widget体系与布局原理
  • TimeXer - 重新审视时序预测内的外生变量
  • 【对线面试官】B 树与 B + 树:原理、区别及优劣势分析
  • Java集合去重
  • 借助AI学习开源代码git0.7之九diff-files
  • VUE的学习