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. 技术文档
相关推荐
用户2519162427119 小时前
Python之语言特点
python
刘立军9 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
数据智能老司机13 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机14 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i15 小时前
django中的FBV 和 CBV
python·django
c8i15 小时前
python中的闭包和装饰器
python
这里有鱼汤18 小时前
小白必看:QMT里的miniQMT入门教程
后端·python
TF男孩1 天前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
该用户已不存在1 天前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
站大爷IP1 天前
Java调用Python的5种实用方案:从简单到进阶的全场景解析
python