2015-05-12 19 views
3

我是R新手,有特殊的幻想运动队优化问题我想解决。我已经看到其他文章使用lpSolve类似的问题,但我似乎无法绕过代码。下面的示例数据表。每个球员都在一个球队中,扮演着特定的角色,有薪水,并且每场比赛都有平均得分。我需要的约束是我需要8个玩家。任何一支球队不得超过3名球员。每个角色必须至少有一名玩家(5人)。累计工资不得超过10,000美元。R球队阵容优化w/lpSolve

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的论点。任何帮助表示赞赏。

回答

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 

我们现在需要更新dirrhs考虑到这一点:

dir <- c(">=",">=",">=",">=",">=",rep('<=',n_teams),"<=","<=") 
rhs <- c(1,1,1,1,1,rep(3,n_teams),8,10000) 

随着n_teams设置正确。

+0

谢谢!很棒! – altaylor1123

+0

任何想法如何强制玩家进入阵容?我可以看到如何通过在con模型矩阵中将它们置零来消除它们,但不知道如何强制include。 – tcash21

+0

当我尝试查看'result'时,得到'Error:status -1'。结果是否应该存储求解器的结果? – Keith