PuLP求解幻想橄榄球优化问题返回空DataFrame的解决方法
问题根因
- 给
is_drafted列赋值时使用了硬编码的列索引10,你在读取CSV后新增了8个位置标识列+薪资列,原始CSV列数不固定的前提下,列索引10大概率不是你新增的is_drafted列,导致选中状态没有写入正确的列,筛选自然为空。 - 整数规划求解器返回的二进制变量值可能存在浮点精度误差,直接用
==1.0判断可能出现漏匹配。
修改方案
把结果格式化部分的代码替换为以下内容即可:
print('--- (4/4) Formatting the results ---') raw_data["is_drafted"] = 0.0 for var in model.variables(): # 用列名而非硬编码索引赋值,避免列顺序变化导致的错误 row_idx = int(var.name[1:]) raw_data.loc[row_idx, "is_drafted"] = var.varValue # 用阈值判断规避浮点精度问题,大于0.9就认定为被选中 my_team = raw_data[raw_data["is_drafted"] >= 0.9] my_team = my_team[["Asset Name", "Player", "Pos. Parent", "Rarity", "Point Cost", "FPTS"]] print(my_team) print("Total used amount of salary cap: {}".format(my_team["Point Cost"].sum())) print("Projected points: {}".format(my_team["FPTS"].sum().round(1))) print('--- Completed ---')
额外优化建议
你当前的约束只定义了QB最少1人,其他位置只有上限没有下限,可能会出现K、DST这类必要位置没选的情况,可以根据赛制规则补充下限约束,例如:
model += (K_constraint >= 1) model += (DST_constraint >= 1)
内容的提问来源于stack exchange,提问作者python_noob_5
相关产品推荐
相关产品推荐

