R的RGLPK库中的条件约束

时间:2016-10-28 18:11:30

标签: r optimization constraints

使用excel多年后,我的脚浸入R中,并有一个问题。我对R的速度有多快印象深刻,过去一小时用Excel做10,000次模拟,R在4分钟内做了25,000次相同的模拟。真棒。

这是幻想足球相关,因为我试图在R中创建一个阵容优化器,并发现RGLPK库是一个不错的选择。关于SO还有其他一些问题可以帮助我达到今天的状态但是我遇到了障碍。以下是其他一些主题。

Fantasy football linear programming in R with RGLPK

Rglpk - Fantasy Football Lineup Optimiser - Rbind of For Loop Output

Rglpk - Fantasy Football Lineup Optimiser - Forcing the Inclusion of a Player

这是我的股票优化器

#stock optimal linups solver

name <- myData$Name
pos <- myData$Pos
pts <- myData$Projection
cost <- myData$Salary
team <- myData$Team
opp <- myData$Opp


num.players <- length(name)

f <- pts

var.types <- rep("B", num.players)

A <- rbind(as.numeric(pos=="QB")
           , as.numeric(pos=="RB")
           , as.numeric(pos=="WR")
           , as.numeric(pos=="TE")
           , as.numeric(pos=="K")
           , as.numeric(pos=="D")
           ,cost)

dir <- c("=="
         ,"=="
         ,"=="
         ,"=="
         ,"=="
         ,"=="
         ,"<=")

b <- c(1
       , 2
       , 3
       , 1
       , 1
       , 1
       , 60000)

library(Rglpk)

sol <- Rglpk_solve_LP(obj = f
                      , mat = A
                      , dir = dir
                      , rhs = b
                      , types = var.types
                      , max=TRUE)

myData[sol$solution == 1,]
sprintf('Cost is:$%i', sum(cost[sol$solution > 0]))
sprintf('Projected Points is: %f', sol$optimum)

这是我正在使用的数据的链接。

https://www.dropbox.com/s/d5m8jjnq32f0cpe/Week6NFLProjections.csv?dl=0

我也可以通过将objective =设置为上一个得分 - .01来循环代码以创建多个阵容。作为旁注,这个过程会随着时间的推移而显着减慢(比如阵容#50),这是正常的,是否有更有效的方法来循环呢?

我真正的问题是如何添加更广泛的约束。在幻想足球中,将来自同一团队的玩家“配对”很有用,我无法弄清楚如何将其纳入约束。

对于一个简单的配对示例,我如何添加一个约束,以便我的“最佳阵容”具有来自同一团队的D和K?我实际上已经能够通过在CSV文件中组合D + K来解决这个问题,但我对如何将其编码到R中感兴趣。

更复杂的配对方案是让我的QB和(3)WR /(1)TE中的一个在同一个团队中。

另一个是确保没有任何进攻球员参加我自己的防守。

非常感谢任何帮助。似乎无法在任何地方找到答案。

1 个答案:

答案 0 :(得分:0)

尝试做类似的事情,你只需要修改它以适应你的情况。我从我自己的代码中直接看了这个,但基本上,输入我想要的玩家并用这些创建一个单独的数据框。然后我优化左侧位置和rbind一起创建最终阵容。这循环并提供用户想要的尽可能多的阵容。

Inclusions<-readline("Enter players to include into optimal lineups: ")
Inclusions <- as.character(unlist(strsplit(Inclusions, ",")))
Inclusions_table<-Data[  Data$Player.Name %in% Inclusions, ]
Inclusions_no<-nrow(Inclusions_table)
Data<-Data[ ! Data$Player.Name %in% Inclusions, ]

Lineup_no<-readline("How many lineups to be generated?: ")

num.players <- length(Data$Player.Name)
obj<-Data$fpts
var.types<-rep("B",num.players)
subscore<-1000

Lineups <- list()
for(i in 1:Lineup_no)
{
matrix <- rbind(as.numeric(Data$Position == "QB"), # num QB
       as.numeric(Data$Position == "RB"), # num RB
       as.numeric(Data$Position == "RB"), # num RB
       as.numeric(Data$Position == "WR"), # num WR
       as.numeric(Data$Position == "WR"), # num WR
       as.numeric(Data$Position == "TE"), # num TE
       as.numeric(Data$Position == "TE"), # num TE
       as.numeric(Data$Position %in% c("RB", "WR", "TE")),  # Num RB/WR/TE
       as.numeric(Data$Position == "DEF"),# num DEF
       Data$Salary,Data$fpts)
direction <- c("==",
     ">=",
     "<=",
     ">=",
     "<=",
     ">=",
     "<=",
     "==",
     "==",
     "<=","<")
opt_var<-subscore-0.01         
rhs<-c(1-sum(Inclusions_table$Position=="QB"),max(0,2-sum(Inclusions_table$Position=="RB")),4-sum(Inclusions_table$Position=="RB"),max(0,2-sum(Inclusions_table$Position=="WR")),4-sum(Inclusions_table$Position=="WR"),max(0,1-sum(Inclusions_table$Position=="TE")),2-sum(Inclusions_table$Position=="TE"),7-sum(Inclusions_table$Position=="RB")-sum(Inclusions_table$Position=="WR")-sum(Inclusions_table$Position=="TE"),1-sum(Inclusions_table$Position=="DEF"),100000-sum(Inclusions_table$Salary),opt_var)
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs,
                  types = var.types, max = TRUE)
Lineup<-data.frame(Data[sol$solution==1,])
subscore<-sum(Lineup$fpts)
Lineup<-rbind(Lineup,Inclusions_table)
Lineup<-Lineup[order(Lineup$Position),]
Salary<-sum(Lineup$Salary)
Score<-sum(Lineup$fpts)
print(Lineup)
print(Salary)
print(Score)
Lineups[[i]]<-Lineup
}

数据是我的数据集,如下所示:

     Position             Player.Name       Team   Opponent Salary  PPG    fpts Pos_Rank   upper   lower Off_Snaps Pct_Off
1056       TE              A.J. Derby   Patriots      Bills   5000    0  0.0000       82       0       0        NA    <NA>
462        RB         Aaron Ripkowski    Packers    Falcons   6000  1.8  1.3116       75  1.8852    0.01        22     25%
78         QB           Aaron Rodgers    Packers    Falcons  19350 20.6 18.4292        1 19.9689    17.2        87    100%
1466       WR          Adam Humphries Buccaneers    Raiders   7650  8.1  9.4808       46 11.2125  7.5664        38     51%
1808       WR           Albert Wilson     Chiefs      Colts   5000  4.3  5.6673       74  6.2438    4.78        11     21%
1252       WR        Aldrick Robinson    Falcons    Packers   5000  3.8  2.9114       96  3.2836  2.0152        10     15%
636        RB            Alex Collins   Seahawks     Saints   6000  2.7  1.5992       69  2.1513    0.41         1      2%

希望您可以修改此示例以适合您。