2025年第三届“华数杯”国际赛A题解题思路与代码(Python版)

游泳竞技策略优化模型代码详解

第一题:速度优化模型

在这一部分,我们将详细解析如何通过数学建模来优化游泳运动员在不同距离比赛中的速度分配策略。

1. 模型概述

我们的模型主要包含三个核心文件:

  • speed_optimization.py: 速度优化的核心算法
  • visualization.py: 结果可视化
  • main.py: 主程序入口

2. 核心算法实现

2.1 速度优化模型 (speed_optimization.py)
python 复制代码
import numpy as np
from scipy.optimize import minimize

class SwimmingSpeedModel:
    def __init__(self, distance, initial_energy=100):
        """
        初始化游泳速度优化模型
        Args:
            distance: 比赛距离(米)
            initial_energy: 初始能量值(默认100)
        """
        self.distance = distance
        self.initial_energy = initial_energy
        self.segments = 10  # 将比赛分成10段分析
        # 根据不同距离设置合理的最大速度(米/秒)
        self.max_speed = 2.2 if distance <= 50 else (2.0 if distance <= 100 else 1.8)
        
    def energy_consumption(self, speed):
        """
        计算能量消耗模型
        基于速度的三次方计算能量消耗,并添加合理的比例系数
        """
        k = 0.1  # 能量消耗系数
        return k * np.power(speed, 3)  
    
    def performance_function(self, speeds):
        """
        计算性能函数(总成绩)
        考虑时间和能量消耗的平衡
        """
        segment_distance = self.distance / self.segments
        total_time = np.sum(segment_distance / speeds)
        
        # 计算累计能量消耗
        energy_used = np.sum([self.energy_consumption(s) * (self.distance/self.segments) for s in speeds])
        
        # 如果超出能量限制或速度超过最大限制,添加惩罚项
        if energy_used > self.initial_energy or np.any(speeds > self.max_speed):
            return float('inf')  # 返回无穷大作为惩罚
        
        return total_time
    
    def optimize_speed(self):
        """
        优化速度分配
        返回每个段落的最优速度
        """
        # 初始猜测:根据距离设置合理的初始速度
        initial_speed = self.max_speed * 0.9  # 初始速度设为最大速度的90%
        initial_guess = np.ones(self.segments) * initial_speed
        
        # 速度约束:设置合理的速度范围
        min_speed = self.max_speed * 0.7  # 最小速度为最大速度的70%
        bounds = [(min_speed, self.max_speed) for _ in range(self.segments)]
        
        result = minimize(
            self.performance_function,
            initial_guess,
            method='SLSQP',
            bounds=bounds
        )
        
        return result.x 
2.2 可视化模块 (visualization.py)
python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from speed_optimization import SwimmingSpeedModel

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

def plot_optimal_speeds(distances=[50, 100, 200]):
    """
    绘制不同距离的最优速度分配图
    Args:
        distances: 要分析的距离列表
    """
    plt.figure(figsize=(12, 6))
    
    colors = ['r', 'b', 'g']  # 为不同距离设置不同颜色
    for i, distance in enumerate(distances):
        model = SwimmingSpeedModel(distance)
        optimal_speeds = model.optimize_speed()
        
        segments = np.linspace(0, distance, len(optimal_speeds))
        plt.plot(segments, optimal_speeds, 
                label=f'{distance}米', 
                color=colors[i],
                marker='o')
    
    plt.xlabel('距离 (m)')
    plt.ylabel('速度 (m/s)')
    plt.title('不同距离项目的最优速度分配策略')
    plt.legend()
    plt.grid(True)
    plt.show()

def plot_energy_distribution(distance=100):
    """
    绘制能量消耗分布图
    Args:
        distance: 比赛距离
    """
    model = SwimmingSpeedModel(distance)
    optimal_speeds = model.optimize_speed()
    
    segments = np.linspace(0, distance, len(optimal_speeds))
    energy_consumption = [model.energy_consumption(s) for s in optimal_speeds]
    
    plt.figure(figsize=(12, 6))
    plt.plot(segments, energy_consumption, 'r-', marker='o')
    plt.xlabel('距离 (m)')
    plt.ylabel('能量消耗率')
    plt.title(f'{distance}米比赛的能量消耗分布')
    plt.grid(True)
    plt.show() 
2.3 主程序 (main.py)
python 复制代码
from speed_optimization import SwimmingSpeedModel
from visualization import plot_optimal_speeds, plot_energy_distribution

def main():
    """
    主程序:分析不同距离的最优速度分配和能量消耗
    """
    # 分析不同距离的最优速度分配
    distances = [50, 100, 200]
    plot_optimal_speeds(distances)
    
    # 分析100米的详细数据
    model = SwimmingSpeedModel(distance=100)
    optimal_speeds = model.optimize_speed()
    print("\n100米比赛最优速度分配方案(单位:米/秒):")
    for i, speed in enumerate(optimal_speeds):
        print(f"第{i+1}段:{speed:.2f}")
    
    # 显示能量消耗分布
    plot_energy_distribution(100)

if __name__ == "__main__":
    main() 

获取完整代码

如果您对第二题"竞技策略分析"和第三题"接力赛追赶策略"的Python实现感兴趣,请访问:

完整代码包含:

  1. 详细的代码注释
  2. 运行示例
  3. 参数调优建议
  4. 技术文档
相关推荐
数维学长9862 分钟前
【翻译】2025年华数杯国际赛数学建模题目+翻译pdf自取
数学建模·pdf
潇与上海1 小时前
【pycharm发现找不到python打包工具,且无法下载】
ide·python·pycharm
代码飞走咯1 小时前
PyCharm文档管理
ide·python·pycharm
qq_441996052 小时前
Iterator 与 ListIterator 的区别
开发语言·windows·python
qq_273900233 小时前
pytorch张量的new_zeros方法介绍
人工智能·pytorch·python
lihan_freak3 小时前
支付宝沙箱接入SSM项目
java·服务器·python
weixin_307779133 小时前
Python单例模式的代码实现和原理
python·设计模式
Dyan_csdn3 小时前
【Python项目】基于自适应SVM电影评价倾向性分析系统
开发语言·python
SCBAiotAigc3 小时前
TIOBE编程语言排行靠前的编程语言的吉祥物
人工智能·python·编程语言排行·吉祥物