2024华东杯数学建模


A题 比赛出场顺序问题

排列组合,组合优化,模拟

第一问 最优出场顺序

(1)确定我方球员的最优出场顺序,以便在对抗固定对方出场顺序(B1, B2, B3, B4, B5)时达到最高的胜率。
我们需要将提供的历史对抗数据(表A-1)转化为更易于分析的格式,每个对抗组合的胜负统计。

(2)对每个我方可能的双打组合与对方的双打组合的胜率进行计算。这涉及到统计每种组合在历史对抗中的胜利次数和总比赛次数,然后计算胜率。

(3)模拟所有可能的出场顺序
由于问题涉及到在一个既定对方出场顺序下的最优我方出场顺序,可以通过穷举法来处理:

使用排列组合生成我方所有可能的出场顺序。
为每个可能的出场顺序计算预期的胜率。

(4)选择最优顺序
通过比较所有可能出场顺序的总胜率,选择胜率最高的出场顺序

综上,第一问的步骤就是先整理数据->计算每个组合的胜率->穷举所有可能的出场顺序

多句嘴,去年校赛就有一道类似的题,难绷^^


第二问 针对对抗策略的模拟

对于问题2中的动态调整策略,可以使用蒙特卡洛模拟来评估不同出场顺序对胜率的影响。通过大量模拟随机的比赛结果,可以统计在不同对手策略下的胜率分布。

这里提到蒙特卡洛模拟

蒙特卡洛模拟

蒙特卡洛模拟可以用来评估不同出场顺序对比赛结果的影响,当对手采用针对你们的原计划顺序的最优策略时,评估不同调整策略的有效性。

** 如何使用蒙特卡洛模拟解决问题 **

1.定义问题和参数:

定义每个球员之间的对抗胜率。这些胜率可以基于历史数据或假设数据。
确定对手的三种可能的最优出场顺序。

2.模拟比赛过程:

对于每种可能的我方出场顺序,模拟与对方三种顺序的多次比赛。
在每次模拟中,根据设定或估计的胜率来随机决定比赛的胜负。

3.统计分析:

计算每种我方出场顺序在模拟中对抗每种对方顺序时的平均胜率。
汇总统计数据,找出平均胜率最高的出场顺序。

4.优化策略:

基于模拟结果优化我方出场顺序。
可能需要多次迭代,调整胜率参数或测试不同的出场顺序。

python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import random
from itertools import permutations
# 假设胜率矩阵,这里需要实际数据或合理假设来填充
win_probability = {
('A1', 'B1'): 0.6, ('A1', 'B2'): 0.5, # 更多假设数据...
}
# 对手的顶级三种顺序
opponent_orders = [('B1', 'B2', 'B3', 'B4', 'B5'),
('B2', 'B3', 'B4', 'B5', 'B1'),
('B3', 'B4', 'B5', 'B1', 'B2')]

# 我方球员
players = ['A1', 'A2', 'A3', 'A4', 'A5']

def simulate_match(player, opponent):
# 基于胜率随机决定胜负
return random.random() < win_probability.get((player, opponent), 0.5)

def simulate_order(my_order, opponent_order):
score = 0
for i in range(5):
if simulate_match(my_order[i], opponent_order[i]):
score += 1
return score

# 模拟每个可能的出场顺序
best_order = None
highest_average_score = 0

for my_order in permutations(players):
total_score = 0
for opp_order in opponent_orders:
score = simulate_order(my_order, opp_order)
total_score += score

average_score = total_score / len(opponent_orders)
if average_score > highest_average_score:
highest_average_score = average_score
best_order = my_order

print("Best my order against top opponent orders:", best_order)
print("Highest average score:", highest_average_score)

ok这里还有其他选择,例如运筹学中的博弈论,遗传算法,时间原因不过多赘述。自己选择~


第三问 稳定性分析

第三个问题考虑了新的变化,即新增两名选手(A6和B6),并探索是否存在一种稳定的出场顺序,使得无论对方如何调整出场顺序,我方的胜率都保持较高。这涉及到组合优化和策略的稳定性分析。下面是解决这个问题的建议方法:

步骤 1:数据整理与分析

首先,将包括新选手的对抗数据整理并分析,以评估新选手与现有队员相比的表现。这包括对表A-2中的数据进行详细分析,计算各种组合的胜率。

步骤 2:模拟所有可能的组合

由于现在每队有六名选手,可以从中选择五名出场。这意味着需要考虑所有从六名选手中选择五名的组合,这可以通过组合公式 ( C(n, k) = \frac{n!}{k!(n-k)!})

(逆天。。。怎么敲不出来公式),其中 ( n ) 是总选手数,( k ) 是出场选手数。

步骤 3:搜索稳定的出场顺序

对每种可能的我方和对方组合进行模拟,确定在所有对方可能组合中,哪些我方组合具有较高的平均胜率。这涉及到对每种我方组合在面对所有对方组合时的胜率进行平均,并找出平均胜率最高的组合。

步骤 4:稳定性检验

验证选出的组合是否真的对多种对方组合都有效。这可以通过更广泛的模拟,包括随机生成对方组合,来检验。

Python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import itertools
import random

# 假设胜率数据结构,这需要根据实际数据填充
win_probability = {
('A1', 'B1'): 0.6, # 添加所有可能的对抗和胜率
# 添加包含A6和B6的胜率
}

# 所有球员
a_players = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6']
b_players = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6']

def simulate_match(player, opponent):
"""模拟比赛结果,返回胜利为True,失败为False"""
return random.random() < win_probability.get((player, opponent), 0.5)

def evaluate_sequence(a_sequence, b_sequence):
"""评估给定序列的胜率"""
wins = 0
total = 0
for a, b in zip(a_sequence, b_sequence):
if simulate_match(a, b):
wins += 1
total += 1
return wins / total

best_order = None
highest_average_win_rate = 0

# 遍历所有可能的我方出场顺序
for a_order in itertools.permutations(a_players, 5):
total_win_rate = 0
count = 0

# 遍历所有可能的对方出场顺序
for b_order in itertools.permutations(b_players, 5):
win_rate = evaluate_sequence(a_order, b_order)
total_win_rate += win_rate
count += 1

average_win_rate = total_win_rate / count
if average_win_rate > highest_average_win_rate:
highest_average_win_rate = average_win_rate
best_order = a_order

print("Best stable order against any opponent order:", best_order)
print("Highest average win rate:", highest_average_win_rate)

核心就是稳态分析吧,最好是二三题用一样的模型,上面提到了供你选择的模型,比如蒙特卡洛模拟,博弈论,遗传算法。


B题 自动驾驶中的转弯问题

4.30 23:37修改

这个b题是改编题,在互联网上可以找到许多可供借鉴的资料,相对于A题可能更容易一点。


物理+数学

第一问 建立转弯的数学模型

动力学模型:

车辆的转向:单轨模型或多轨模型。物理学中的各种力,牵引力、侧向力、摩擦力。
同时需要考虑车辆的前轮转向角度对车辆路径的影响。

肯定要写方程-
Ackermann:基于前轮的转向角和车辆的几何尺寸,计算理论转弯半径。放个链接

第一个

第二个

第二问 车辆的具体位置计算

用matlab或者python做仿真| 画图

时间步进模拟:

基于第一部分建立的模型,进行时间步进仿真,以计算每隔0.1秒车辆的位置。这可能包括计算车辆的速度向量、加速度以及转向过程中的路径。

路径跟踪:

计算车辆转弯过程中的路径,使用数学方程(如参数方程)描述车辆中心以及车轮的具体位置。

问题三 转弯角度与停车位置的计算
同上的思路

C T

基于MACD指标的交易策略问题,目标是构建一个交易系统,使用MACD指标分析给定数据,并计算相关的量化指标,如胜率、赔率、频率、最大收益、年化收益率、夏普比率和最大回撤。以下是解决这个问题的步骤和方法:

1. 理解和计算MACD指标

  • 计算DIF和DEA
    • DIF:短期(通常为12天)指数移动平均线(EMA)与长期(通常为26天)EMA之间的差异。
    • DEA:DIF的指数移动平均线,通常是9天期。
    • MACD Histogram:DIF与DEA之差的两倍,用于显示买卖动量。

2. 交易策略的制定

  • 基本规则
    • 买入信号:当DIF从下向上穿越DEA时。
    • 卖出信号:当DIF从上向下穿越DEA时。
    • 其他信号:考虑使用MACD的高点和低点之间的背离,作为市场即将反转的预警信号。

3. 量化交易系统的构建

  • 数据处理:清洗和准备交易数据,确保数据质量。
  • 交易模拟:基于历史数据模拟交易,记录每次交易的开仓和平仓时间、价格等详细信息。
  • 性能评估
    • 胜率:成功交易占总交易的比例。
    • 赔率:平均每次赢利与每次亏损的比率。
    • 频率:交易的频繁程度。
    • 最大收益最大回撤:最大盈利和在特定时间内可能的最大亏损。
    • 年化收益率:将收益率转换为年度收益率。
    • 夏普比率:风险调整后的收益,衡量每单位风险的收益。

4. 改进和优化

  • 参数调整:尝试不同的EMA参数,如调整短期和长期EMA的天数,优化交易性能。
  • 机器学习应用:利用机器学习算法(如随机森林、支持向量机)分析指标和市场条件,优化买卖信号的判断。
  • 经验分析:从实证结果和投资交易逻辑两方面对MACD指标的实用性进行分析。

5. 软件工具和编程

  • Python:使用Pandas进行数据处理,使用NumPy进行数学计算,Matplotlib和Seaborn用于数据可视化。
  • 回测平台:如QuantConnect或Backtrader,进行策略的回测和评估。

这个问题的解决涉及到较为复杂的数据处理和数学建模,需要准确理解MACD指标的计算方法和交易策略的逻辑。如果你需要进一步的指导,例如如何编写计算MACD的Python代码或者如何进行策略的回测,我可以提供详细的帮助和示例代码。