2024年美国大学生数学建模竞赛C题网球运动中的动量解题全过程文档及程序

2024年美国大学生数学建模竞赛

C题 网球运动中的动量

原题再现:

  在 2023 年温布尔登网球公开赛男子组决赛中,20 岁的西班牙新星卡洛斯-阿尔卡拉斯击败了 36 岁的诺瓦克-德约科维奇。这是德约科维奇自 2013 年以来首次在温布尔登输掉比赛,也结束了这位大满贯历史上最伟大球员之一的辉煌战绩。
  德约科维奇似乎注定会轻松获胜,他在第一盘以6-1的比分占据优势(7局比赛中赢了6局)。然而,第二盘比赛却十分紧张,最终阿尔卡雷斯在决胜盘中以7-6获胜。第三盘与第一盘相反,阿尔卡拉兹以6-1的比分轻松获胜。第四盘开始后,年轻的西班牙人似乎完全控制了局面,但不知何故,比赛的走势再次发生了变化,德约科维奇完全控制了局面,以6-3的比分赢得了这一盘。第五盘也是最后一盘比赛开始后,德约科维奇延续了第四盘的优势,但比赛的走向再次发生了变化,阿尔卡拉斯以6-4取得了胜利。本场比赛的数据在提供的数据集中,“atch id"为"2023-wimbledon-1701”。您可以使用"set no"列(等于 1)查看第一盘德约科维奇占优时的所有得分。 似乎占优的一方有时会出现多分甚至多局的惊人波动,这通常归因于"势头"。
  在字典中,"动量"的定义是"通过运动或一系列事件获得的力量或作用力。“2在体育运动中,一支球队或一名球员可能会觉得他们在比赛中拥有动量或"力量/作用力”,但很难衡量这种现象。此外,如果存在"势"的话,比赛中的各种事件是如何产生或改变"势"的也不是一目了然的。
  提供 2023 年温布尔登网球公开赛前两轮之后所有男子比赛中每一分的数据。您可以自行决定加入其他球员信息或其他数据,但必须完整记录数据来源。使用这些数据:
  建立一个模型,捕捉赛点发生时的比赛流程,并将其应用到一场或多场比赛中您的模型应能确定哪位球员在比赛中的某个特定时间段表现更好,以及他们的表现好到什么程度。根据您的模型提供可视化的比赛流程描述。注意:在网球比赛中,发球的一方赢得赛点比赛的概率要高得多。您可能希望以某种方式将这一因素考虑到您的模型中。
  一位网球教练对"势头"在比赛中的作用持怀疑态度。相反,他假设比赛中的波动和一名球员的成功是随机的。请使用您的模型/度量来评估这一说法。
  教练们很想知道,是否有一些指标可以帮助判断比赛的流程何时会从偏向一名球员变为偏向另一名球员。
  利用提供的至少一场比赛的数据,建立一个模型来预测比赛中的这些波动。哪些因素似乎最相关(如果有的话)?考虑到过去比赛"势头"波动的差异,您如何建议球员在新的比赛中对阵。不同的球员?
  在一场或多场其他比赛中测试您开发的模型。您对比赛中的波动预测得如何?如果模型有时表现不佳,您是否能找出未来模型中可能需要包含的任何因素?您的模型对其他比赛(如女子比赛)、锦标赛、球场表面和其他运动(如乒乓球)的通用性如何?
  撰写一份不超过 25 页的报告,介绍您的研究结果,并附上一至两页的备忘录总结您的研究结果,并就"动力"的作用以及如何让球员做好准备,应对网球比赛中影响比赛进程的事件,向教练提出建议。

整体求解过程概述(摘要)

  目前,教练员、运动员和管理者都意识到“动量”在网球比赛中起着巨大的作用。通过分析比赛过程中动量的变化,我们可以评估球员在特定时间段的表现,并对比赛结果进行推测。通过了解影响比赛动量的因素,可以评估比赛过程中的波动,构建一个运动员训练系统。因此,必须认识到“动量”在游戏中的作用,并利用它帮助玩家应对影响游戏进程的事件。
  首先,建立了瞬时得分率(ISR)模型来获取匹配点。采用三次样条插值方法对离散数据进行处理后,该模型能够平滑地估计任意时刻的瞬时得分率,准确捕捉比赛中的关键时刻。基于该模型的结果,可以快速识别出运动员在特定时间点的表现。此外,模型的结果清楚地显示了服务方在博弈中的先动优势,这与事实相符。然后,我们建立了一个模型来检验动量在竞争中的作用。结果表明,博弈中的波动与玩家的成功之间并不独立。除了先发优势外,游戏中还会有强大的“动量”,影响瞬间得分率。
  其次,为了预测竞争中的涨落,采用集成梯度的选通递归神经网络模型(GRU)进行特征分离工程,在GRU模型的基础上拟合现有条件下的“动量”函数,准确预测竞争动量的变化。我们手工将原始指标分为六个维度。利用积分梯度算法,从GRU模型输出中反映出六个维度对输出的影响。基于模型结果,我们确定了12个对进度波动有显著影响的重要指标。在此基础上,建立了基于六个维度的胜任力评价体系,并在分析真实运动员能力的基础上,为运动员提供有针对性的建议。
  此外,我们在不同性别、游戏系统和球类游戏的实时数据中验证了模型的预测能力。测试结果表明,该模型能准确预测其他竞争过程,具有较高的泛化能力。最后,为了帮助教练员培养运动员更好地应对影响网球赛程的事件,提出针对性的建议。我们希望这些建议能帮助玩家在新游戏中取得胜利。

模型假设:

  1不考虑球员因伤病或身体因素导致的成绩下降。
  2不存在玩家恶意控分等负面博弈现象。
  3比赛是正式的,绝大多数场外因素都被筛选出来了。唯一能影响比赛情况的场外因素是比赛的当前得分。
  4假设先前的研究数据准确。

问题重述:

  •构建模型1,以捕获游戏流程中的匹配点,并确定哪些玩家表现更好,以及在游戏中的给定点达到何种程度。
  -测试提供了基于模型1的游戏流程的可视化。
  -判断比赛中动量的波动是否与随后的得分情况无关。

  •建立模型2,预测游戏“动量”的波动,并确定更好的指标,以帮助确定游戏情况。
  -测试预测比赛波动程度的准确性和通用性。
  -根据动量的波动给出了赢得网球比赛的战术策略。

  •由编写的备忘录总结了结果,并就以下方向向教练提出建议:
  -通过游戏的“动量”影响游戏的方向。
  -为影响网球赛程的比赛做准备。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

代码:(文档not free)

class W6(nn.Module):
def __init__(self, input_size):
super(W6, self).__init__()
self.W1 = nn.Linear(len(xintai), 1, bias=False)
self.W2 = nn.Linear(len(chijiuli), 1, bias=False)
self.W3 = nn.Linear(len(shiwulv), 1, bias=False)
self.W4 = nn.Linear(len(qishou), 1, bias=False)
self.W5 = nn.Linear(len(jiqiao), 1, bias=False)
self.W6 = nn.Linear(len(guanjian), 1, bias=False)
self.act = nn.Tanh()
def forward(self, x):
x1 = x[:,:, :len(xintai)]
x2 = x[:,:, len(xintai):len(xintai)+len(chijiuli)]
x3 = x[:,:, len(xintai)+len(chijiuli):len(xintai)+len(chijiuli)+len
(shiwulv)]
x4 = x[:,:, len(xintai)+len(chijiuli)+len(shiwulv):len(xintai)+len(
chijiuli)+len(shiwulv)+len(qishou)]
x5 = x[:,:, len(xintai)+len(chijiuli)+len(shiwulv)+len(qishou):len(
xintai)+len(chijiuli)+len(shiwulv)+len(qishou)+len(jiqiao)]
x6 = x[:,:, len(xintai)+len(chijiuli)+len(shiwulv)+len(qishou)+len(
jiqiao):len(xintai)+len(chijiuli)+len(shiwulv)+len(qishou)+len(
jiqiao)+len(guanjian)]
# concatenate the output of the 6 subnetworks
x1 = self.act(self.W1(x1))
x2 = self.act(self.W2(x2))
x3 = self.act(self.W3(x3))
x4 = self.act(self.W4(x4))
x5 = self.act(self.W5(x5))
x6 = self.act(self.W6(x6))
return torch.cat((x1, x2, x3, x4, x5, x6), -1)
class GruRNN(nn.Module):
def __init__(self, input_size, hidden_size=1, output_size=1, num_layers
=1):
super().__init__()
self.gru = nn.GRU(3*hidden_size, hidden_size, num_layers,
batch_first=True) # utilize the GRU model in torch.nn
self.linear0 = nn.Linear(input_size, hidden_size)
self.activation = nn.Tanh()
self.linear01 = nn.Linear(hidden_size, hidden_size)

self.linear11 = nn.Linear(hidden_size + hidden_size, hidden_size)
self.dropout = nn.Dropout(0.2)
self.linear21 = nn.Linear(hidden_size, output_size)
self.linear12 = nn.Linear(hidden_size + hidden_size, hidden_size)
self.linear22 = nn.Linear(hidden_size, output_size)
self.sigmoid = nn.Tanh()
self.player_embedding = nn.Embedding(32, hidden_size)
def forward(self,_x, p1=None, p2=None,ig=False):
p1_emb = self.player_embedding(p1)
p2_emb = self.player_embedding(p2)
_x = self.linear0(_x)
_x = torch.cat([p1_emb , p2_emb, _x], dim=2)
x, _ = self.gru(_x)
s, b, h = x.shape
x = x.reshape(s * b, h)
p1_emb = p1_emb.reshape(s * b, -1)
p2_emb = p2_emb.reshape(s * b, -1)
x1 = self.linear11(torch.cat([x, p1_emb], dim=1))
x1 = self.sigmoid(x1)
x1 = self.dropout(x1)
x1 = self.linear21(x1)
x1 = x1.reshape(s, b, -1)
x2 = self.linear12(torch.cat([x, p2_emb], dim=1))
x2 = self.sigmoid(x2)
x2 = self.dropout(x2)
x2 = self.linear22(x2)
x2 = x2.reshape(s, b, -1)
return x1, x2
class Net(nn.Module):
def __init__(self, input_size,hid_dim = 128):
super(Net, self).__init__()
self.w6 = W6(input_size)
self.gru = GruRNN(6, hid_dim, 1, 1)
def forward(self, x,p1,p2):
x = self.w6(x)
x = self.gru(x,p1,p2)
return x
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值