R语言线性规划求解梦幻足球最优阵容报错问题排查
解决R语言梦幻足球阵容线性规划的"unused argument (200)"错误
错误根源
你遇到的unused argument (200)错误,是因为把总DraftValue上限200直接作为额外参数传给了lp()函数,但该函数没有接收这类裸数值的参数位置。预算限制需要定义到约束条件的规则里,而非直接传入函数。
正确实现方案
假设你的球员数据框名为players,包含Name、Position、FantasyPoints、DraftValue这几列,以下是完整的修正代码:
1. 加载依赖包
install.packages("lpSolve") library(lpSolve)
2. 定义目标函数
目标是最大化总FantasyPoints,目标系数为每个球员的FantasyPoints值:
obj <- players$FantasyPoints
3. 构建约束条件
需要两类约束:位置数量限制、总DraftValue上限。
# 生成位置约束的列向量 qb_constraint <- ifelse(players$Position == "QB", 1, 0) rb_constraint <- ifelse(players$Position == "RB", 1, 0) wr_constraint <- ifelse(players$Position == "WR", 1, 0) te_constraint <- ifelse(players$Position == "TE", 1, 0) # 生成预算约束的列向量 draft_val_constraint <- players$DraftValue # 组合约束矩阵 const_mat <- cbind(qb_constraint, rb_constraint, wr_constraint, te_constraint, draft_val_constraint) # 约束方向:位置要求等于指定数量,预算要求小于等于200 const_dir <- c("=", "=", "=", "=", "<=") # 约束对应的值:1QB、2RB、2WR、1TE、总DraftValue≤200 const_rhs <- c(1, 2, 2, 1, 200)
4. 定义变量类型
每个球员只能选或不选,所以变量为二进制(0=不选,1=选中):
var_types <- rep("binary", nrow(players))
5. 调用线性规划求解
result <- lp( direction = "max", objective.in = obj, const.mat = const_mat, const.dir = const_dir, const.rhs = const_rhs, all.bin = TRUE # 等价于传入types=var_types,二选一即可 )
6. 提取最优阵容结果
# 获取选中球员的索引 selected_indices <- which(result$solution == 1) # 输出选中球员详情 selected_players <- players[selected_indices, ] print(selected_players) # 输出关键指标 cat("总FantasyPoints:", sum(selected_players$FantasyPoints), "\n") cat("总DraftValue:", sum(selected_players$DraftValue), "\n")
注意事项
- 确认约束矩阵的列数,与
const_dir、const_rhs的长度完全匹配 - 必须明确设置变量为二进制类型,避免出现选中半名球员的不合理结果
内容的提问来源于stack exchange,提问作者Ranalytictsnewb
相关产品推荐
相关产品推荐

