R 团队花名册优化 w/ lpSolve

R Team Roster Optimization w/ lpSolve

我是 R 的新手,有一个我想解决的特定梦幻运动队优化问题。我已经看到其他帖子使用 lpSolve 来解决类似的问题,但我似乎无法理解代码。下面的示例数据 table。每个球员都在一个团队中,扮演着特定的角色,有薪水,并且每场比赛都有平均得分。我需要的限制是我需要 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 论点有关。任何帮助表示赞赏。

如果您添加类似于您对 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 设置得当。