我是R的新手,我想解决一个特殊的幻想运动队优化问题。我见过其他帖子使用lpSolve来解决类似的问题,但我似乎无法绕过代码。下面的示例数据表。每个球员都在一个团队中,扮演一个特定角色,有薪水,并且每场比赛都有平均分。我需要的限制是我需要8名球员。任何一支球队不得超过3名球员。每个角色必须至少有一个玩家(5个)。累计工资不得超过10,000美元。
Team Player Role Avgpts Salary
Bears A T 22 930
Bears B M 19 900
Bears C B 30 1300
Bears D J 25 970
Bears E S 20 910
Jets F T 21 920
Jets G M 26 980
[...]
在R中,我写下以下内容
> obj = DF$AVGPTS
> con = rbind(t(model.matrix(~ Role + 0, DF)), rep(1,nrow(DF)), DF$Salary)
> dir = c(">=",">=",">=",">=",">=","==","<=")
> rhs = c(1,1,1,1,1,8,10000)
> result = lp("max", obj, con, dir, rhs, all.bin = TRUE)
此代码适用于制作最佳幻想团队 而不 限制不超过3名玩家可能来自任何一个团队。这就是我陷入困境的地方,我怀疑它与con
论证有关。任何帮助表示赞赏。
答案 0 :(得分:2)
如果您添加类似于con
角色的方式,该怎么办?
如果添加t(model.matrix(~ Team + 0, DF))
,您的约束中的每个团队都会有指标。对于您给出的示例:
> con <- rbind(t(model.matrix(~ Role + 0,DF)), t(model.matrix(~ Team + 0, DF)), rep(1,nrow(DF)), DF$Salary)
> con
1 2 3 4 5 6 7
RoleB 0 0 1 0 0 0 0
RoleJ 0 0 0 1 0 0 0
RoleM 0 1 0 0 0 0 1
RoleS 0 0 0 0 1 0 0
RoleT 1 0 0 0 0 1 0
TeamBears 1 1 1 1 1 0 0
TeamJets 0 0 0 0 0 1 1
1 1 1 1 1 1 1
930 900 1300 970 910 920 980
我们现在需要更新dir
和rhs
以解决此问题:
dir <- c(">=",">=",">=",">=",">=",rep('<=',n_teams),"<=","<=")
rhs <- c(1,1,1,1,1,rep(3,n_teams),8,10000)
正确设置n_teams
。