用Python实现多重约束下的奇幻橄榄球最优阵容选择
奇幻橄榄球最优阵容筛选实现方案
当前场景基础
手上持有约200条球员历史预测数据,字段包含Country(球员所属国家)、Name(球员姓名)、Position(场上位置)、Value(球员薪资)、Pts(下周预测可得梦幻积分),核心目标是筛选出满足所有规则的阵容组合,拿到最高的总积分。
硬性筛选规则
- 国籍限制:单个国家最多入选4名球员,涉及参赛国家共6个
- 预算限制:所有入选球员(含替补)的总薪资不得超过246.4的预算上限
- 人数基础:首发阵容固定为15人
- 替补规则:最多可选3名替补,替补位可空缺;替补仅能获得对应积分的一半,但薪资成本和正选球员完全一致;和你原本的思路一致,由于该规则会提升计算复杂度,可分别按配置0名、1名、2名、3名替补的场景单独运行计算,再横向对比各场景的结果取最优
- 位置人数要求:全阵容(含替补)各位置入选人数必须落在对应区间内:
- FB:1-2人
- C:2-4人
- W:2-4人
- FH:1-2人
- SH:1-2人
- BR:3-6人
- SR:2-4人
- P:2-4人
- H:1-2人
新手友好的实现路径
首先明确:纯暴力枚举所有球员组合的方案在这个数据规模下完全不可行,200名球员选15-18人的组合数达到数亿亿量级,普通设备根本无法完成计算,不需要硬套教程里的递归遍历全组合的逻辑,更适配的路径如下:
- 第一步:用
pandas读取、整理球员数据,按位置拆分球员子集,提前缩小每个位置的候选范围 - 第二步:引入整数线性规划求解库
PuLP,不需要手写复杂的回溯逻辑,只需要把所有筛选规则转化为求解器可识别的约束条件,让求解器自动遍历最优解,这套库对新手非常友好,在Jupyter Notebook中安装后即可直接调用 - 第三步:分场景调试模型:先从规则最简单的0替补场景开始搭建求解逻辑,验证结果合规后,再逐步加入1-3名替补的约束,每加一层规则就跑一次小范围测试,避免一次性堆所有规则导致bug难排查
- 第四步:对求解器输出的结果做二次校验,核对总薪资、国籍分布、位置人数、积分计算逻辑是否完全符合规则,最终输出整理后的阵容名单、总积分、总薪资明细
基础代码框架参考
# 首次使用先在Jupyter cell中运行安装命令 # !pip install pandas pulp import pandas as pd import pulp # 读取本地球员数据 player_df = pd.read_csv("你的球员数据文件路径.csv") # 提前定义所有固定规则 pos_requirement = { "FB": (1, 2), "C": (2, 4), "W": (2, 4), "FH": (1, 2), "SH": (1, 2), "BR": (3, 6), "SR": (2, 4), "P": (2, 4), "H": (1, 2) } total_budget = 246.4 max_player_per_country = 4 max_starter = 15 max_substitute = 3
实现时的避坑提示
- 不要硬写全组合遍历逻辑:计算量会远超本地设备的处理能力,用成熟的求解库可以在几秒内算出最优解
- 位置计数要包含所有正选和替补球员,不要把替补排除在位置人数的统计范围外
- 替补的薪资是全额计入总预算的,不要误以为替补薪资会打折
- 建模时要给每个球员设置两个独立的决策变量:「是否进入首发」「是否进入替补」,并增加约束保证同一个球员不能同时出现在首发和替补名单中
内容的提问来源于stack exchange,提问作者danmccormack
相关产品推荐
相关产品推荐

