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

使用R的lpSolve实现选行限制的最大化求解,解决结果异常

搞定你的lpSolve二进制规划问题!

嘿,我一眼就瞅出问题所在了——你代码里的约束矩阵格式错了,这才导致求解结果完全不符合预期!

你想用lpSolve实现和Excel规划求解一样的逻辑:选25个事件最大化总分,约束是选中的事件数正好是25。但你现在给con传的是一个向量rep(1, nrow(aggdata)),lpSolve会把它当成48行1列的矩阵,这就相当于给每个事件都加了一个“这个事件必须被选25次”的约束——这显然不可能满足,求解器只能随便找个勉强可行的解,自然只选中了3行。

修正后的代码

只需要把约束矩阵改成1行48列的形式(对应“所有选中事件的数量之和等于25”这一个约束)就行,看我给你调整好的代码:

library(lpSolve)

# 先构造你的数据框
tournament <- rep(1:48, 1)
mean <- c(12.2,30.4,30.9,44.1,31.3,27.6,31.5,25.0,31.2,24.0,28.0,23.9,14.1,9.5,17.2,37.8,30.5,43.0,32.1,30.7,30.2,37.0,32.1,28.9,23.7,4.6,29.0,29.1,30.7,31.6,49.5,25.1,30.2,10.3,30.3,21.8,88.5,31.0,30.9,2.9,31.1,30.3,29.7,63.7,31.6,91.6,30.6,31.0)
aggdata <- data.frame(tournament, mean)

maxevents <- 25

# 目标函数:每个事件的分数,要最大化
obj <- aggdata$mean

# 关键修正!约束矩阵是1行,每列都是1,代表所有变量的和等于maxevents
con <- matrix(rep(1, nrow(aggdata)), nrow = 1)
dir <- c("==")
rhs <- maxevents

# 求解0-1整数规划
result <- lp("max", obj, con, dir, rhs, all.bin = TRUE)

# 看看选中的事件
selected_events <- aggdata[result$solution == 1, ]
cat("选中的事件数量:", nrow(selected_events), "\n") # 输出25,符合要求
# 按分数降序看看前几个,都是最高分的那些
head(selected_events[order(-selected_events$mean), ])

为什么这样改?

lpSolve的con参数要求传入的是矩阵,每一行对应一个约束条件,每一列对应一个决策变量(也就是你那列“是否参与”的0/1变量)。我们要的约束是“选中的事件总数=25”,所以只需要1行,每列系数都是1,这样约束就是sum(x1 + x2 + ... + x48) = 25,完全符合你的需求。

现在运行代码,result$solution里会有25个1,对应的正好是分数最高的25个事件,和Excel里的结果一模一样!之后你要加其他约束的话,只需要在con矩阵里加新的行就行,比如某些事件不能同时选的约束,或者特定事件必须选的约束,都可以轻松扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:54:17