2024美赛数学建模C题网球的动量:思路+代码+模型+论文

问题分析见下列内容,完整思路代码见文末名片

1.题目

在2023年温布尔登绅士队的决赛中,20岁的西班牙新星卡洛斯·阿尔卡拉兹击败了36

岁的诺瓦克·德约科维奇。这是德约科维奇自2013年以来首次在温布尔登公开赛失利

,并结束了他在大满贯赛事中历史上最伟大的球员之一的非凡表现。

这场比赛本身就是一场非凡的战斗。[1]德约科维奇似乎注定要轻松获胜,他以6-1控制

了第一盘(7场比赛赢6场)。然而,第二盘比赛很紧张,最终阿尔卡雷兹以7-6的比分获

胜。第三盘与第一盘相反,阿尔卡拉兹以6-1轻松获胜。在第四盘开始时,年轻的西班牙

人似乎完全控制了局面,但不知怎么的,比赛又改变了方向,德约科维奇完全控制了局

面,以6-3赢得了这一盘。第五盘也是最后一盘开始时,德约科维奇从第四盘领先,但方

向又发生了变化,阿尔卡拉兹控制了局面,以6-4获胜。这场比赛的数据在所提供的

“2023-温布尔登1701”的数据集“match_id”中。当德约科维奇使用“set_no”列等于

1时,你可以看到第一回合的所有分数。令人难以置信的波动,有时是很多分数,甚至是

比赛,发生在那些似乎有优势的球员,通常被归因于“势头”。

字典中对动量的一种定义是“通过运动或一系列事件获得的力量或力”。[2]在体育运

动中,一个团队或球员可能会觉得他们在比赛/比赛中有动力,或“力量/力量”,但很

难衡量这种现象。此外,如果比赛中各种事件如何创造或改变势头,这并不明显。

提供2023年温布尔登男子比赛前两轮后的每一分数据。您可以自行选择包含额外的玩家

信息或其他数据,但您必须完全记录这些来源。将数据用于:

开发一个模型,捕捉得分发生时的比赛流程,并将其应用于一个或多个比赛。你的模

型应该确定哪个球员在比赛的特定时间表现更好,以及他们的表现有多好。提供

一个基于模型的可视化功能来描述匹配流程。注:在网球比赛中,发球者赢得得

分的可能性要高得多。您可能希望以某种方式将其考虑到您的模型中。

网球教练怀疑“势头”是否在比赛中起着任何作用。相反,他假设一个球员的波动和

成功的跑动是随机的。使用您的模型/度量来评估此

|教练们很想知道是否有指标可以帮助决定何时比赛的流程将从偏爱一个球员转向另

一个球员。

o利用至少一场比赛提供的数据,建立一个模型来预测比赛中的这些波动。哪

些因素似乎是最相关的(如果有的话)?

o考虑到过去比赛“势头”波动的差异,你如何建议一名球员与另一名球员进

行新的比赛?

2.思路分析:

首先,要对网球比赛进行建模,我们必须要先了解网球比赛的规则才可以。

网球比赛分为单打和双打两种形式。在正式比赛前,需要确定比赛由谁先发球。整个比赛中,双方球员轮流发球,发球员在发球前应先站在端线后、中点和边线的假定延长线之间的区域里。发出的球应从网上越过,落在对角的对方发球区内。每局第一分球记为15,第二分球为30,接下来为40。每局比赛中,至少要比对手多2分球才能结束该局比赛。

此外,还有如下规则:

  1. 发球员连续两次发球失误或脚误时。

  2. 接球员在发来的球没有着地前用球拍击球,或球触及自己的身体及所穿戴的衣物时。

  3. 在球第二次落地前未能还击过网时。

  4. 还击球触及对方场区界线以外的地面、固定物或其它物件时。

  5. 还击空中球失败时。

  6. 在比赛中,击球员故意用球拍拖带或接住球,或故意用球拍触球超过一次时

  7. 数据收集:收集比赛中的各项数据,包括发球局数、破发次数、发球得分、接发球得分、制胜分和非受迫性失误等。这些数据可以通过网球比赛统计网站或使用专业的网球数据采集设备获得。

  8. 数据预处理:对收集到的数据进行清洗和整理,例如处理缺失值、异常值和重复值。还需要将数据标准化或归一化,以便进行比较和分析。

  9. 特征选择:从收集的数据中选择与球员表现相关的特征。例如,可以选择发球局数、破发次数、发球得分率、接发球得分率、制胜分和非受迫性失误率等作为特征。

  10. 模型训练:选择一个适合的机器学习算法来训练模型。可以使用分类算法(如逻辑回归、支持向量机等)或聚类算法(如K-means聚类等)来对球员的表现进行分类或排序。

  11. 模型评估:使用适当的评估指标(如准确率、召回率、F1分数等)对模型进行评估。如果模型的性能不够理想,可以对模型进行调整或重新选择特征。

  12. 结果解释:根据模型的输出结果,解释哪位球员在特定的时间内表现得更好,以及表现得有多好。例如,可以使用排名、评分或置信度等方式来解释结果。

在建模过程中,可以考虑以下因素来衡量球员的表现:

  • 发球局更容易赢:由于在一场比赛中,赢得的发球局数通常与球员的实力和比赛表现有关,因此可以将其作为衡量球员表现的重要特征。可以使用发球局数、发球局赢率等指标来评估球员的发球局表现。

  • 破发次数:破发是比赛中一个重要的转折点,破发次数多说明球员在比赛中能够抓住机会,对对手施加压力。因此,破发次数也可以作为衡量球员表现的重要特征。

  • 制胜分和非受迫性失误:制胜分能够反映球员的进攻能力,而非受迫性失误则反映了球员的控制能力。在建模时可以考虑将这两个指标作为特征,以全面评估球员的表现。

  • 接发球得分率:接发球得分率反映了球员在对手发球局中的表现,以及其对比赛的控制能力。因此,这个指标也可以作为衡量球员表现的特征之一。

以考虑以下几种模型和算法:

  1. 线性回归模型:用于分析球员的各项数据与比赛胜率之间的关系,通过回归分析来找出影响比赛胜率的主要因素。

  2. 逻辑回归模型:适用于分类问题,可以用来预测球员赢得比赛的概率。

  3. 决策树模型:通过构建决策树来分析球员在不同情况下的表现,并预测比赛结果。

  4. 支持向量机模型:适用于分类和回归问题,可以用来构建预测模型,预测比赛结果或评估球员表现。

  5. 聚类模型:通过将球员的数据进行聚类分析,将表现相似的球员归为一类,用于比较和分析。

  6. 神经网络模型:适用于处理复杂的非线性问题,可以用来构建球员表现的预测模型。

  7. 遗传算法模型:通过模拟自然选择和遗传机制来寻找最优解,可以用于优化球员的战术和策略。

  8. 模拟退火算法模型:适用于解决组合优化问题,可以用于寻找最佳的球员组合或战术策略

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问!以下是基于Arduino和OpenCV实现的代码,用于实现基于视觉算法的自主网球拾捡机器人,并且具有人脸追踪功能。希望对您有所帮助! 首先,我们需要准备以下硬件和软件: 硬件: 1. Arduino板子 2. 电机驱动模块 3. 摄像头模块 4. 机械臂 5. 电池组 6. 网球 软件: 1. Arduino IDE 2. OpenCV库 3. Python 2.7 接下来,我们来看一下实现的代码: Arduino代码: ```C++ #include <Servo.h> #include <AFMotor.h> AF_DCMotor motor1(1, MOTOR12_64KHZ); AF_DCMotor motor2(2, MOTOR12_64KHZ); AF_DCMotor motor3(3, MOTOR34_64KHZ); AF_DCMotor motor4(4, MOTOR34_64KHZ); Servo myservo1; Servo myservo2; Servo myservo3; Servo myservo4; void setup() { Serial.begin(9600); myservo1.attach(9); myservo2.attach(10); myservo3.attach(11); myservo4.attach(12); } void loop() { int ball_x = 0; //球的x坐标 int ball_y = 0; //球的y坐标 int face_x = 0; //人脸的x坐标 int face_y = 0; //人脸的y坐标 //从Python中读取球和人脸的坐标 if(Serial.available() > 0) { ball_x = Serial.parseInt(); ball_y = Serial.parseInt(); face_x = Serial.parseInt(); face_y = Serial.parseInt(); } //控制机械臂抓取球 if(ball_x != 0 && ball_y != 0) { if(ball_x < 200) { motor1.run(BACKWARD); motor2.run(BACKWARD); } else if(ball_x > 400) { motor1.run(FORWARD); motor2.run(FORWARD); } else { motor1.run(RELEASE); motor2.run(RELEASE); } if(ball_y < 200) { motor3.run(BACKWARD); motor4.run(BACKWARD); } else if(ball_y > 400) { motor3.run(FORWARD); motor4.run(FORWARD); } else { motor3.run(RELEASE); motor4.run(RELEASE); } } else { motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); } //控制机械臂放下球 if(face_x != 0 && face_y != 0) { myservo1.write(90); myservo2.write(90); myservo3.write(90); myservo4.write(90); } else { myservo1.write(0); myservo2.write(0); myservo3.write(0); myservo4.write(0); } } ``` Python代码: ```Python import cv2 import serial ser = serial.Serial('COM3', 9600) #连接Arduino face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #人脸检测器 cap = cv2.VideoCapture(0) #打开摄像头 while True: ret, img = cap.read() #读取摄像头的图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #将图像转换为灰度图像 faces = face_cascade.detectMultiScale(gray, 1.3, 5) #检测人脸 for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) #在人脸周围画矩形框 ser.write(str(x + w/2) + ' ' + str(y + h/2) + ' 0 0\n') #将人脸中心坐标发送给Arduino hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #将图像转换为HSV颜色空间 lower_red = np.array([0, 50, 50]) #设置红色的HSV阈值 upper_red = np.array([10, 255, 255]) mask1 = cv2.inRange(hsv, lower_red, upper_red) lower_red = np.array([170, 50, 50]) upper_red = np.array([180, 255, 255]) mask2 = cv2.inRange(hsv, lower_red, upper_red) mask = mask1 + mask2 #将两个红色区域的mask相加 contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #寻找所有的轮廓 max_area = 0 ball_x = 0 ball_y = 0 for i in range(len(contours)): area = cv2.contourArea(contours[i]) #计算轮廓面积 if area > max_area: max_area = area max_contour = contours[i] (ball_x, ball_y), radius = cv2.minEnclosingCircle(max_contour) #计算最小外接圆的圆心坐标和半径 if max_area > 100: cv2.circle(img, (int(ball_x), int(ball_y)), int(radius), (0, 255, 0), 2) #在球周围画圆 ser.write('0 0 ' + str(int(ball_x)) + ' ' + str(int(ball_y)) + '\n') #将球的中心坐标发送给Arduino cv2.imshow('img', img) #显示图像 if cv2.waitKey(1) & 0xFF == ord('q'): #按下q键退出 break cap.release() cv2.destroyAllWindows() ``` 以上代码实现了一个基于Arduino和OpenCV的自主网球拾捡机器人,并且具有人脸追踪功能。在代码中,我们使用了Arduino控制机械臂抓取和放下球,使用了OpenCV检测人脸和球,并且使用了Python将人脸和球的坐标发送给Arduino。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值