You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python构建满足多约束的15人英超高ROI球员阵容

优化英超Fantasy球队ROI最大化选阵代码

数据集结构

现有英超球员数据集ROI_top_players结构如下:

player                 team         position    cost_2223   total_points  ROI   
0   Mohamed Salah          Liverpool    FWD         13.0        259           29.77 
1   Trent Alexander        Liverpool    DEF         8.4         206           24.52 
2   Jarrod Bowen           West Ham     MID         8.5         204           23.56
3   Kevin De Bruyne        Man  City    MID         12.0        190           15.70
4   Virgil van Dijk        Liverpool    DEF         6.5         183           14.91 
... ... ... ... ... ... ... ... ... ...
151 Jamaal Lascelles       Newcastle    DEF         4.5         45            10.22
152 Ben Godfrey            Everton      GKP         4.5         45            9.57  
153 Aaron Wan-Bissaka      Man Utd      DEF         4.5         41            8.03
154 Brandon Williams       Norwich      DEF         4.0         36            7.23  

选阵需求

构建15人球员名单,需同时满足以下约束以实现ROI最大化:

  • 位置约束:2名GKP、5名DEF、5名MID、3名FWD
  • 预算约束:总预算100,选中球员cost_2223总和不超过预算
  • 球队约束:每支俱乐部入选球员不超过3名

原代码问题

现有实现代码存在两个核心问题:

  1. 无法保证最终选出恰好15名球员
  2. 未实现每队最多3名球员的约束

原代码:

def get_ideal_team_ROI(budget = 100, star_player_limit = 3, gk = 2, df = 5, md = 5, fwd = 3):
    money_team = []
    budget = budget
    positions = {'GK': gk, 'DEF': df, 'MID': md, 'FWD': fwd}
    for index, row in ROI_top_players.iterrows():
       if (budget >= row['cost_2223'] and positions[row['position']] > 0):
           money_team.append(row['player'])
           budget -= row['cost_2223']
           positions[row['position']] = positions[row['position']] - 1
    return money_team

优化后的代码

def get_ideal_team_ROI(budget=100, team_limit=3, gk=2, df=5, md=5, fwd=3):
    # 按ROI从高到低排序,优先选择高ROI球员
    sorted_players = ROI_top_players.sort_values(by='ROI', ascending=False).reset_index(drop=True)
    
    selected_players = []
    remaining_budget = budget
    # 跟踪各位置剩余名额
    position_quota = {'GKP': gk, 'DEF': df, 'MID': md, 'FWD': fwd}
    # 跟踪每支球队已选人数
    team_selected_count = {}
    
    for _, player in sorted_players.iterrows():
        # 同时校验所有约束条件
        if (position_quota[player['position']] > 0 
            and remaining_budget >= player['cost_2223']
            and team_selected_count.get(player['team'], 0) < team_limit):
            
            selected_players.append(player['player'])
            remaining_budget -= player['cost_2223']
            position_quota[player['position']] -= 1
            team_selected_count[player['team']] = team_selected_count.get(player['team'], 0) + 1
            
            # 选满15人直接终止循环
            if len(selected_players) == 15:
                break
    
    # 处理无法选满15人的情况
    if len(selected_players) < 15:
        print("警告:无法凑齐15人阵容,可能预算不足或符合条件的球员数量不足")
    
    return selected_players

优化说明

  1. ROI优先逻辑:先将球员按ROI降序排序,确保优先挑选ROI最高的合格球员
  2. 球队约束实现:新增team_selected_count字典,实时跟踪每支球队的入选人数,避免超过上限
  3. 多条件校验:选中球员前同时检查位置剩余名额、剩余预算、球队名额三个约束,确保所有规则都被满足
  4. 人数控制:选满15人后立即终止循环,保证最终名单人数符合要求
  5. 异常提示:如果无法凑齐15人,给出明确提示便于排查问题

内容的提问来源于stack exchange,提问作者grungrun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:06:21