比赛周期化训练体系:Base/Build/Peak/Taper四阶段算法实现

摘要:如何为不同水平的跑者生成科学的备赛计划?本文基于一个真实的AI跑步教练项目,详细解析周期化训练(Periodization)理论的代码实现。我们将深入源码,结合运动生理学模型,展示如何将Base(基础期)、Build(进展期)、Peak(巅峰期)、Taper(减量期)四个阶段转化为动态算法。这套方案让AI生成的计划不再是简单的“每日堆砌”,而是具备周期性波动和科学强度分配的专业课表。


一、背景:线性训练的误区

在项目初期,Agent生成的计划往往是线性的:每周跑量固定增加10%。

痛点

  • 缺乏波动:身体需要“刺激-恢复-适应”的循环,直线增加极易导致受伤。
  • 赛前状态差:没有在比赛前安排减量(Taper),导致用户带着疲劳站上起跑线。
  • 强度单一:全程都是一个配速,无法同时提升有氧基础和速度耐力。

二、解决方案:四阶段周期化模型

我引入了经典的马特奥波利夫周期化模型,将其拆解为四个算法模块:

周期化训练曲线

Base: 基础期
高跑量/低强度

Build: 进展期
中跑量/高强度

Peak: 巅峰期
模拟比赛强度

Taper: 减量期
低跑量/保持强度


三、核心实现:各阶段算法逻辑

文件位置:app/services/periodization_service.py

3.1 Base Phase(基础期):打造有氧引擎

目标:提升毛细血管密度和线粒体数量。
算法特征:80%的训练量集中在Zone 2心率区间。

def generate_base_week(weekly_distance: float) -> List[DayPlan]:
    """生成基础期周计划"""
    return [
        DayPlan(day="Mon", content="休息", distance=0),
        DayPlan(day="Tue", content=f"Zone2 轻松跑 {weekly_distance*0.2}km", intensity="Low"),
        DayPlan(day="Wed", content="交叉训练", distance=0),
        DayPlan(day="Thu", content=f"Zone2 轻松跑 {weekly_distance*0.2}km", intensity="Low"),
        DayPlan(day="Fri", content="休息", distance=0),
        DayPlan(day="Sat", content=f"长距离慢跑(LSD) {weekly_distance*0.4}km", intensity="Low"),
        DayPlan(day="Sun", content="主动恢复", distance=5),
    ]

3.2 Build Phase(进展期):引入乳酸阈值

目标:提高身体清除乳酸的能力。
算法特征:加入Tempo Run(节奏跑)和间歇跑。

def generate_build_week(weekly_distance: float, lt_pace: float) -> List[DayPlan]:
    """生成进展期周计划"""
    return [
        # ... 其他天保持不变
        DayPlan(day="Wed", content=f"节奏跑: 热身 + 5km @ {lt_pace} + 冷身", intensity="High"),
        DayPlan(day="Sat", content=f"长距离跑 {weekly_distance*0.45}km (最后3km加速)", intensity="Medium"),
    ]

3.3 Peak & Taper(巅峰与减量):调整至最佳状态

算法特征

  • Peak:跑量达到最大值,加入比赛配速(MP)训练。
  • Taper:赛前两周开始,跑量每周递减30%-50%,但强度不减。
def apply_taper(plan: List[WeekPlan], weeks_before_race: int):
    """应用赛前减量逻辑"""
    reduction_factor = 0.5 ** weeks_before_race # 指数级递减
    
    for week in plan:
        for day in week.schedule:
            if day.distance > 0:
                day.distance *= (1 - reduction_factor)
                day.content += " (赛前减量)"

四、动态调整算法

4.1 10%原则保护

为了防止过度训练,算法内置了安全锁:

if current_week_distance > last_week_distance * 1.1:
    logger.warning("触发10%原则保护,自动降低本周跑量建议")
    current_week_distance = last_week_distance * 1.1

4.2 疲劳度监控

结合用户的HRV(心率变异性)数据,如果疲劳度超标,自动将当天的“强度课”降级为“恢复跑”。


五、完整调用链追踪

5.1 计划生成流程

Metrics Service Periodization Service Race Plan API 用户 Metrics Service Periodization Service Race Plan API 用户 loop [12周循环] "我要参加12周后的半马" 获取当前VO2max和LT配速 VO2max=50, LT=4:30/km generate_cycle(weeks=12, goal=21.0975) 判断当前处于哪个阶段 调用对应阶段的生成函数 应用10%原则检查 返回完整的12周JSON计划 显示周期性训练课表

六、踩坑记录与解决方案

坑1:初始跑量设定不合理

现象:给一个月跑量只有20km的新手直接生成了60km的计划。

解决方案

  • 基线评估:取用户过去4周的平均跑量作为起点。
  • 渐进式增长:第一个月只负责稳定习惯,不追求大幅增长。

坑2:忽略了生活压力

现象:用户在加班周依然收到了高强度间歇训练建议。

解决方案

  • 在前端增加“本周忙碌程度”滑块。
  • 算法根据滑块系数动态压缩当周的训练负荷(TSS)。

七、总结与展望

核心价值

  1. 科学性:将复杂的运动训练学理论转化为了可执行的代码逻辑。
  2. 安全性:通过算法约束,最大程度降低了用户受伤的风险。
  3. 目标导向:所有的训练都围绕“比赛日表现最优”这一核心目标展开。

后续优化

  1. 多赛事管理:支持用户同时准备多个不同距离的比赛。
  2. 实时反馈闭环:根据用户每周的实际完成情况,动态调整后续周期的参数。

八、完整源码

GitHub仓库AiRunCoachAgent

快速演示AiRunCoachAgent

核心文件清单

app/
├── services/
│   ├── periodization_service.py       # 周期化算法核心
│   └── race_plan_api.py               # 备赛计划接口
data/
└── knowledge/
    └── periodization_theory.md        # 周期化训练理论知识库

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发!有任何问题或建议,请在评论区留言讨论。 🏃‍♂️💨

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐