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. 技术文档
相关推荐
漫谈网络28 分钟前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
wwer1425263632 小时前
数学建模_熵权法确定权重
数学建模
try2find2 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取3 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector4 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习5 小时前
Python入门Day2
开发语言·python
Vertira5 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉5 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗5 小时前
黑马python(二十四)
开发语言·python
晓13136 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr