这是幻想足球相关,因为我试图在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中的一个在同一个团队中。
另一个是确保没有任何进攻球员参加我自己的防守。
非常感谢任何帮助。似乎无法在任何地方找到答案。
答案 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%
希望您可以修改此示例以适合您。