2016-10-28 2 views
1

окунание ног в R после использования excel в течение многих лет и вопрос. Я полностью впечатлен тем, насколько быстрее R, он использовал Excel за час, чтобы выполнить 10 000 симуляций, а R сделал 25 000 из того же сима за 4 минуты. Потрясающие.Условные ограничения в библиотеке RGLPK для R

Это фэнтезийный футбол, связанный, поскольку я пытаюсь создать оптимизатор линейки в 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

Я тоже до точки, где я могу мертвый код для создания нескольких составов команд, установив цель = к предыдущему балла - .01. В качестве побочного примечания этот процесс значительно замедляется, поскольку он продолжает развиваться (скажем, по линейке №50), является ли это нормальным, и есть ли более эффективный способ этого цикла?

Мой настоящий вопрос: как я могу добавить некоторые более обширные ограничения. В фэнтезийном футболе полезно «спарить» игроков из одной и той же команды, и я не могу понять, как бы это повлияло на ограничения.

Для простого примера спаривания, как я могу добавить ограничение, чтобы моя «оптимальная модель» имела бы D и K из той же команды? Я действительно смог решить этот вопрос, просто объединив D + K в CSV-файле, но меня интересует, как я буду кодировать его в R.

Более сложный сценарий сопряжения должен состоять в том, чтобы иметь QB и просто 1 из (3) WR/(1) TE находится в одной команде.

Другим было бы убедиться, что ни один из наступательных игроков не играет против моей собственной защиты.

Любая помощь была бы принята с благодарностью. Кажется, я не могу найти ответ на этот вопрос.

+0

Я думаю, что могу создать вектор для команд i.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

Предпочитаете сначала не выбирать вручную. i.e спросите код, чтобы дать мне лучший состав, где защита и K находятся в одной команде. – NxtWrldChamp

Смежные вопросы