带lpsolve的R团队花名册约束-必须从团队中挑选至少x名球员 我很难建立在的基础上。

带lpsolve的R团队花名册约束-必须从团队中挑选至少x名球员 我很难建立在的基础上。,r,optimization,solver,knapsack-problem,lpsolve,R,Optimization,Solver,Knapsack Problem,Lpsolve,我想优化,所以至少有3名球员来自同一支球队,但我不在乎是哪支球队 在下面的代码中,我可以强制它从熊队(或我指定的其他球队)中挑选3名球员。如果有3名球员来自同一支球队,你会如何挑选最佳阵容 library(Rglpk) DF <- data.frame(Team=c(rep("Bears",5), rep("Jets",5), rep("49ers", 5)), Player=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",

我想优化,所以至少有3名球员来自同一支球队,但我不在乎是哪支球队

在下面的代码中,我可以强制它从熊队(或我指定的其他球队)中挑选3名球员。如果有3名球员来自同一支球队,你会如何挑选最佳阵容

library(Rglpk)
DF <- data.frame(Team=c(rep("Bears",5), rep("Jets",5), rep("49ers", 5)), Player=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"), Role=c(rep(c("WR", "RB", "TE"),5)), Avgpts=c(22, 19, 30, 25, 20, 21, 26, 14, 21, 13, 11, 8, 4, 3, 5), Salary=c(930, 900, 1300, 970, 910, 920, 980, 720, 650, 589, 111, 1239, 145, 560, 780))
obj = DF$Avgpts
con = rbind(as.numeric(DF$Role=="WR"), as.numeric(DF$Role=="RB"), as.numeric(DF$Role=="TE"), as.numeric(DF$Team == "Bears"), DF$Salary)
dir = c("==","==","==","==","<=")
rhs = c(1,1,1,3,100000)
sol <- Rglpk_solve_LP(obj = obj
                , mat = con
                , dir = dir
                , rhs = rhs
                , types = rep("B", length(DF$Team))
                , max=TRUE)

solution <- DF[sol$solution==1,]
库(Rglpk)

DF如果我把一些术语弄错了,请原谅,但这是我最后想出的解决方案。每个球员都被视为一个专栏,我也为每支球队设立了一个专栏。我为每个团队输入了一个虚拟变量=团队等于我想要的单个团队中的最少球员数量

library("lpSolveAPI")
DF <- data.frame(Team=c(rep("Bears",5), rep("Jets",5), rep("49ers", 5)), Player=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"), Role=c(rep(c("WR", "RB", "TE"),5)), Avgpts=c(22, 19, 30, 25, 20, 21, 26, 14, 21, 13, 11, 8, 4, 3, 5), Salary=c(930, 900, 1300, 970, 910, 920, 980, 720, 650, 589, 111, 1239, 145, 560, 780))

ncol <- nrow(DF) # of players in DF
nteams <- length(unique(DF$Team))
teams <- unique(DF$Team)

lp_rowpicker <- make.lp(ncol=(ncol+nteams))

obj_vals <- DF[, "Avgpts"]
set.objfn(lp_rowpicker, c(obj_vals, rep(0, nteams))) #dummy 0s for team variable
lp.control(lp_rowpicker,sense='max')
set.type(lp_rowpicker, columns=1:(ncol+nteams), type = "binary")
add.constraint(lp_rowpicker, xt=c(DF$Salary, rep(0, nteams)), type="<=", rhs=35000)
add.constraint(lp_rowpicker, xt=c(as.numeric(DF$Role=="WR"), rep(0, nteams)), type="=", rhs=1)
add.constraint(lp_rowpicker, xt=c(as.numeric(DF$Role=="RB"), rep(0, nteams)), type="=", rhs=1)
add.constraint(lp_rowpicker, xt=c(as.numeric(DF$Role=="TE"), rep(0, nteams)), type="=", rhs=1)
库(“lpSolveAPI”)

DF如果我把一些术语弄错了,请原谅,但这是我最后想出的解决方案。每个球员都被视为一个专栏,我也为每支球队设立了一个专栏。我为每个团队输入了一个虚拟变量=团队等于我想要的单个团队中的最少球员数量

library("lpSolveAPI")
DF <- data.frame(Team=c(rep("Bears",5), rep("Jets",5), rep("49ers", 5)), Player=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"), Role=c(rep(c("WR", "RB", "TE"),5)), Avgpts=c(22, 19, 30, 25, 20, 21, 26, 14, 21, 13, 11, 8, 4, 3, 5), Salary=c(930, 900, 1300, 970, 910, 920, 980, 720, 650, 589, 111, 1239, 145, 560, 780))

ncol <- nrow(DF) # of players in DF
nteams <- length(unique(DF$Team))
teams <- unique(DF$Team)

lp_rowpicker <- make.lp(ncol=(ncol+nteams))

obj_vals <- DF[, "Avgpts"]
set.objfn(lp_rowpicker, c(obj_vals, rep(0, nteams))) #dummy 0s for team variable
lp.control(lp_rowpicker,sense='max')
set.type(lp_rowpicker, columns=1:(ncol+nteams), type = "binary")
add.constraint(lp_rowpicker, xt=c(DF$Salary, rep(0, nteams)), type="<=", rhs=35000)
add.constraint(lp_rowpicker, xt=c(as.numeric(DF$Role=="WR"), rep(0, nteams)), type="=", rhs=1)
add.constraint(lp_rowpicker, xt=c(as.numeric(DF$Role=="RB"), rep(0, nteams)), type="=", rhs=1)
add.constraint(lp_rowpicker, xt=c(as.numeric(DF$Role=="TE"), rep(0, nteams)), type="=", rhs=1)
库(“lpSolveAPI”)

DF一般来说,有链接是可以的,但是您的代码应该自己运行。这意味着创建
DF
并调用
library(lpSolve)
以及其他任何东西。很抱歉,我更改了示例,使其运行。它目前的条件是硬编码从熊队中挑选3名球员,但是我想从同一时间挑选最好的3名球员,不管是哪支球队。一般来说,有链接是可以的,但是你的代码应该独立运行。这意味着创建
DF
并调用
library(lpSolve)
以及其他任何东西。很抱歉,我更改了示例,使其运行。它目前的条件是从熊队中挑选3名球员,但我想从同一时间挑选最好的3名球员,不管是哪支球队。