2016-10-28 49 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