如何用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名
原代码问题
现有实现代码存在两个核心问题:
- 无法保证最终选出恰好15名球员
- 未实现每队最多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
优化说明
- ROI优先逻辑:先将球员按ROI降序排序,确保优先挑选ROI最高的合格球员
- 球队约束实现:新增
team_selected_count字典,实时跟踪每支球队的入选人数,避免超过上限 - 多条件校验:选中球员前同时检查位置剩余名额、剩余预算、球队名额三个约束,确保所有规则都被满足
- 人数控制:选满15人后立即终止循环,保证最终名单人数符合要求
- 异常提示:如果无法凑齐15人,给出明确提示便于排查问题
内容的提问来源于stack exchange,提问作者grungrun
相关产品推荐
相关产品推荐

