2016-10-28 47 views
1

使用excel多年后我的脚陷入了R,并且有一个问题。 R的速度让我印象深刻,过去一个多小时的Excel使用Excel进行10,000次模拟,R在4分钟内做了25,000次相同的模拟。真棒。RGLPK库中的条件约束R

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

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

我也是到了这种地步,我可以循环的代码通过设定目标=到以前的分数创建多个阵容 - .05。作为一个侧面说明,这个过程会持续下去(比如#50),这是否正常,是否有更有效的方式来循环呢?

我真正的问题是如何添加一些更广泛的约束。在幻想足球中,将来自同一个球队的球员“配对”在一起非常有用,而且我无法弄清楚我会如何将这些问题纳入限制。

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

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

另一个问题是要确保没有任何进攻球员与我自己的防守相比。

任何帮助将不胜感激。似乎无法在任何地方找到答案。

+0

我在想我可以为团队创建一个载体。e 'code' teams < - myData $ Team' code' 但是我怎样才能使用它来确保我选择的D =选中K – NxtWrldChamp

回答

0

尝试做类似的事情,你只需要修改它以适应你的情况。我从我自己的代码中直接得到了这个,但基本上,输入我想要的球员并用这些球员创建一个单独的数据框。然后我优化左后卫的位置,并共同创造最后的阵容。循环播放并提供尽可能多的用户需要的阵容。

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% 

希望你可以修改这个例子来适应你。

+0

谢谢,我在这里发现了你的问题,并且使用了很多这个我正在做的事情的基础。我可以锁定玩家,但我更想知道是否有办法让我告诉代码,将DEF和K放在同一个团队中的最佳团队。 我已经能够遍历每个DEF/K组合来查看最佳团队,但不知道是否有更有效的方法。 – NxtWrldChamp

+0

你是否想为每支球队提供相同的防守和踢球者的最佳阵容?还是你自己选择了K和DEF,然后想要看到最佳阵容? – Morts81

+0

首先不想做任何手动选择。 即问防守和K来自同一队伍的最佳阵容。 – NxtWrldChamp