R Team Roster Optimization w/ lpSolve

一世执手 提交于 2019-12-13 15:04:37

问题


I am new to R and have a particular fantasy sports team optimization problem I would like to solve. I have seen other posts use lpSolve for similar problems but I can not seem to wrap my head around the code. Example data table below. Every player is on a team, plays a particular role, has a salary, and has avg points produced per game. The constraints that I need are I need exactly 8 players. No more than 3 players may come from any one team. There must be at least one player for each role (of 5). And cumulative salary must not exceed $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
[...]   

In R, I write in the following

> 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)

This code works fine in producing the optimal fantasy team without the limitation of no more than 3 players may come from any one team. This is where I am stuck and I suspect it relates to the con argument. Any help is appreciated.


回答1:


What if you added something similar to the way you did the roles to con?

If you add t(model.matrix(~ Team + 0, DF)) you'll have indicators for each team in your constraint. For the example you gave:

> 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

We now need to update dir and rhs to account for this:

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

With n_teams set appropriately.



来源:https://stackoverflow.com/questions/30182557/r-team-roster-optimization-w-lpsolve

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!