2025年第十届“数维杯”大学生数学建模挑战赛【B】题论文+代码+结果

难度:A题 > C题 > B题,开放度:C题 > B题 > A题。综合来看:A题需要多刚体动力学建模和复杂数值模拟;C题涉及多学科交叉(气象+物候+经济);B题以数据分析和优化为主,难度相对较低。

对于开放度而言,C题需结合气象预测、花期建模、旅游经济等多领域;B题涉及多目标优化和城市数据融合;A题问题较具体,建模自由度有限。

以下为ABC题选题建议及初步分析:(要注意的是,本次选题建议会给出每道题目的题目分析、第一问建模过程和推荐算法,然后根据学生不同的专业,针对性给出选题建议)。

综合评价:

数据分析偏好优先选择B题或C题

  • B题

    :适合处理多源城市数据(如西安的住宿、交通、景点),需设计优化算法(如动态规划)和空间分析(GIS工具)。

  • C题

    :适合时序预测(如清明降雨)和跨学科建模(气象+经济),需结合Python的Scikit-learn/PyTorch库。

另外:A题适合有物理建模经验的团队,但对编程能力要求较高(需实现复杂微分方程)。C题开放度高,但需注意气象数据清洗和跨学科逻辑整合。

A题:空中芭蕾蹦床运动的力学行为分析

A题结合多刚体动力学、弹性力学疲劳损伤理论,需构建运动员与蹦床的交互模型。第一问要求分析起跳瞬间的发力方向、大小与身体姿态关系,需融合生物力学和物理建模。难点在于多段刚体动力学方程的耦合求解和主动蹬伸力的动态模拟。此外,疲劳损伤分析需结合循环载荷下的材料性能退化模型。

建议的建模过程为:

推荐算法:强化学习(PPO算法):用于优化起跳动作策略,动态调整发力方向和姿态。物理信息神经网络(PINNs):嵌入动力学方程约束,加速多刚体系统的反问题求解。自适应网格有限元法:模拟蹦床的非线性弹性形变,提升接触力计算精度。

可以使用的可视化方法:力学参数热力图(Python Plotly 3D Surface)、疲劳损伤云图(ParaView有限元后处理)

此题专业性较强,适合有物理建模经验的团队,但对编程能力要求较高(需实现复杂微分方程)

B题:马拉松经济的高质量发展思路探索

B题要求融合城市科学、交通规划和数据驱动优化,核心是构建多目标赛事规划框架。第一问涉及气象、人口、历史数据挖掘,需通过时空关联分析筛选赛事窗口期。难点在于多源异构数据融合(气象时序数据、人口密度、交通网络)和动态约束下的多目标优化。

推荐的建模过程为:

推荐算法有:1 时空图神经网络(ST-GNN):捕捉城市气象与人口数据的时空关联性。2 多目标贝叶斯优化(MOBO):高效求解高维约束下的赛事规划问题。3 联邦学习(Federated Learning):跨城市数据隐私保护下的联合建模。

这道题目的数据处理是重中之重 大家需要认真去处理。计算量大,适合系统建模能力强的团队。需要处理多源城市数据(如西安的住宿、交通、景点),设计优化算法(如动态规划)和空间分析(GIS工具)。

C题:清明时节雨纷纷,何处踏青不误春?

C题聚焦气象学、物候学和经济学,构建跨学科预测模型。第一问要求量化“雨纷纷”的降雨特征并预测2026年清明天气。难点在于小样本气象数据的时序外推和区域气候模式耦合(如西安与吐鲁番的地形效应差异)。数据需要自己找,有参考的网站。

第一问前大家需要对数据进行分析和数值化处理,也就是EDA(探索性数据分析)。对于数值型数据,大家用归一化、去除异常值等方式就可以进行数据预处理。而对于非数值型数据进行量化,大家可以使用以下方法:

1标签编码

标签编码是将一组可能的取值转换成整数,从而对非数值型数据进行量化的一种方法。例如,在机器学习领域中,对于一个具有多个类别的变量,我们可以给每个类别赋予一个唯一的整数值,这样就可以将其转换为数值型数据。

2独热编码onehot

独热编码是将多个可能的取值转换成二进制数组的一种方法。在独热编码中,每个可能取值对应一个长度为总共可能取值个数的二进制数组,其中只有一个元素为1,其余元素均为0。例如,对于一个性别变量,可以采用独热编码将“男”和“女”分别转换为[1, 0]和[0, 1]。

3分类计数

分类计数是将非数值型数据转换为数值型数据的一种简单方法。在分类计数中,我们根据某些特定属性(比如学历、职业等)来对数据进行分类,然后统计每个类别的数量或频率。例如,在调查问卷中,我们可以对某个问题的回答按照“是”、“否”和“不确定”三个类别进行分类,并计算每个类别的数量或频率。

4主成分分析

主成分分析是将多维数据转换为低维度表示的一种方法。在主成分分析中,我们通过找到最能解释数据变异的主成分来对原始数据进行降维处理。这样就可以将非数值型数据转换为数值型数据。

而第一问建议大家使用一些可视化方法,可以使用常见的EDA可视化方法:

  • 直方图和密度图:展示数值变量的分布情况。

  • 散点图:展示两个连续变量之间的关系。

  • 箱线图:展示数值变量的分布情况和异常值。

  • 条形图和饼图:展示分类变量的分布情况。

  • 折线图:展示随时间或顺序变化的趋势。

  • 热力图:展示不同变量之间的相关性。

  • 散点矩阵图:展示多个变量之间的散点图矩阵。

  • 地理图:展示地理位置数据和空间分布信息。

推荐的建模过程:

可使用的算法:1 Transformer-XL:处理长序列气象数据,捕捉跨区域气候关联。2 深度概率网络(DeepAR):生成概率性降雨预测区间。3 元学习(MAML):适应小样本城市的天气模式迁移。

C题开放度高,但需注意气象数据清洗和跨学科逻辑整合。这道题目适合所有专业的同学进行选择,是本次比赛的首选题目。

二、问题分析

问题1 分析

在问题1中,我们的目标是选择合适的数据集并综合考虑气象适宜性、城市承载能力、人口规模及报名热度等核心要素,科学筛选出中国主要城市的马拉松赛事窗口期,并合理确定比赛时间、赛事规模与频次。首先,气象适宜性是选择赛事时间窗口的关键因素之一,气候条件如气温、降水量和风速会影响参赛者的表现和安全性。因此,气象数据必须精确且具有时效性,以预测最佳的赛事举行时段。城市承载能力与人口规模则直接影响赛事规模的选择,城市的交通、住宿、医疗等基础设施必须能够承载一定数量的参赛者。报名热度,主要由历史报名人数及其增长率体现,是决定赛事频次和规模的重要依据。通过对这些因素的综合分析,结合城市的特性和需求,能够科学确定最佳的赛事时间和规模安排。

问题2 分析

问题2的核心是基于西安市的基础数据进行赛道设计,包括选择最优的起点和终点组合,并对赛道的其他条件进行优化。问题的第一部分要求我们建立一个评价函数,考虑容量权重与邻近路网密度,选择最合适的起点和终点组合。此部分的挑战在于如何精确地衡量城市设施的容量(如住宿设施)与交通网络的密度,以及如何通过地图数据和地理信息系统(GIS)工具进行可视化和优化。第二部分要求将景点抽象为必经节点,餐饮设施作为增益节点,设计一个符合国际马拉松要求的闭合回路。在此过程中,我们需要平衡多个因素,包括赛道的坡度、补给站的设置、餐饮设施的分布等。赛道的坡度不得超过5%,并且每5公里必须设置一个补给站,同时补给站需邻近餐饮设施,保证选手的饮食补给需求。通过这些优化,我们能够提供一个既符合比赛要求,又能最大化参赛者体验的赛道方案。

问题3 分析

问题3要求我们在问题2的基础上构建一个综合评估体系,提升选手舒适度并减少对城市交通的干扰,特别是考虑如何量化分析赛道沿线的树荫覆盖率,并结合气象数据优化赛道走向,以减少选手在高温时段暴露于阳光下的距离。树荫覆盖率是影响选手舒适度的重要因素,尤其在气温较高的时段,树荫可以有效减少太阳直射和高温对选手的影响。结合气象数据,我们可以优化赛道走向,选择树荫覆盖较好的区域。为了达到这个目标,我们需要设计一个多目标优化算法,综合考虑树荫覆盖、交通影响、赛道坡度等因素。在该算法中,树荫覆盖应当最大化,交通干扰应最小化,而坡度要保持在适宜范围内。通过生成若干候选路线方案,我们可以依据多个科学性量化指标(如舒适度评分、交通流量、坡度等)对赛道进行评估,并最终选择最佳赛道方案。

问题4 分析

问题4的核心在于设计具有收藏价值的限定纪念品,并结合参赛组别、成绩排名设置差异化兑换权益。纪念品设计不仅需要满足赛事主题的要求,还要考虑其收藏价值和吸引力。限定纪念品的设计应具有独特性,可以根据赛事的历史背景、城市特色等元素来定制,吸引参赛者的兴趣。与此同时,根据参赛者的成绩和组别,设置差异化的兑换权益,可以通过历史成绩数据预测不同组别的竞争激烈程度,优化奖励分配。年龄分组规则的优化是关键,按照5岁为间隔进行细分,可以更加科学地平衡不同年龄段参赛者的竞争强度。历史成绩数据对于预测各组别的竞争激烈程度非常重要,借助这些数据,可以为参赛者提供一个赛前模拟排名工具,帮助他们了解自己的潜在排名,并制定合理的目标。同时,合理的奖励方案可以激励选手的参与热情和表现。通过这些设计,我们不仅能够优化赛事奖励方案,还能提升赛事的整体吸引力和品牌价值。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport randomfrom typing import Tuple# ========== 参数设置 ==========N = 10  # 城市数量(可替换为真实城市列表长度)M = 12  # 月份数量POP_SIZE = 50MAX_GEN = 100MUTATE_PROB = 0.1CROSSOVER_PROB = 0.8MAX_CITY_EVENTS = 6MAX_MONTH_EVENTS = 10# ========== 构造评分矩阵S_ij(模拟气候、热度、承载) ==========np.random.seed(42)S_matrix = np.random.rand(N, M)  # 若有真实数据,请在此处替换为实际评分矩阵# ========== 个体生成 ==========def generate_individual() -> np.ndarray:    individual = np.zeros((N, M), dtype=int)    for i in range(N):        total = 0        for j in range(M):            if total >= MAX_CITY_EVENTS:                break            if random.random() < 0.3:                f = random.randint(1, 3)                if total + f <= MAX_CITY_EVENTS:                    individual[i, j] = f                    total += f    return individual# ========== 适应度函数 ==========def fitness(individual: np.ndarray) -> float:    base_score = np.sum(individual * S_matrix)    # 城市约束惩罚    city_penalty = 0    for i in range(N):        total_events = np.sum(individual[i, :])        if total_events > MAX_CITY_EVENTS:            city_penalty += (total_events - MAX_CITY_EVENTS)    # 月度约束惩罚    month_penalty = 0    for j in range(M):        cities = np.sum(individual[:, j] > 0)        if cities > MAX_MONTH_EVENTS:            month_penalty += (cities - MAX_MONTH_EVENTS)    penalty = 10 * (city_penalty + month_penalty)    return base_score - penalty# ========== 遗传操作 ==========def crossover(parent1: np.ndarray, parent2: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:    point = random.randint(1, N - 1)    child1 = np.vstack((parent1[:point], parent2[point:]))    child2 = np.vstack((parent2[:point], parent1[point:]))    return child1, child2def mutate(individual: np.ndarray) -> np.ndarray:    i = random.randint(0, N - 1)    j = random.randint(0, M - 1)    individual[i, j] = random.randint(0, 3)    return individual# ========== 初始化种群 ==========population = [generate_individual() for _ in range(POP_SIZE)]best_fitness_list = []# ========== 主进化过程 ==========for gen in range(MAX_GEN):    population.sort(key=fitness, reverse=True)    next_gen = population[:2]  # 精英保留    while len(next_gen) < POP_SIZE:        p1, p2 = random.sample(population[:20], 2)        if random.random() < CROSSOVER_PROB:            c1, c2 = crossover(p1, p2)        else:            c1, c2 = p1.copy(), p2.copy()        if random.random() < MUTATE_PROB:            c1 = mutate(c1)        if random.random() < MUTATE_PROB:            c2 = mutate(c2)        next_gen.extend([c1, c2])    population = next_gen[:POP_SIZE]    best_fitness = fitness(population[0])    best_fitness_list.append(best_fitness)# ========== 最优方案展示 ==========best_individual = population[0]df_result = pd.DataFrame(best_individual, columns=[f"Month {m+1}" for m in range(M)])df_result["City"] = [f"City {i+1}" for i in range(N)]df_result.set_index("City", inplace=True)# 打印排布方案print("最优城市-月份赛事安排频次:")print(df_result)# ========== 适应度变化图 ==========plt.figure(figsize=(10, 5))plt.plot(best_fitness_list, label="Best Fitness")plt.xlabel("Generation")plt.ylabel("Fitness Score")plt.title("GA Optimization Progress for Marathon Scheduling")plt.legend()plt.grid(True)plt.tight_layout()plt.show()

2025年第十届数维杯数学建模挑战赛B题论文Word+代码结果https://download.csdn.net/download/qq_52590045/90778329↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓​​​​​​​↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微信公众号:数模0error

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值