Линейное программирование фэнтези-футбола в R с RGLPK
долгое время прослушиватель первый раз вызывающий абонент в S. O... Я задаю вопрос, который задавался очень похожим образом раньше, однако я не считаю, что я достаточно умен, чтобы расшифровать, как реализовать решение, за это я прошу прощения. Вот ссылка на вопрос, который я нашел: ограничения в R множественном целочисленном линейном программировании
Я максимизирую свои прогнозируемые точки фантазии (FPTS_PREDICT_RF), при условии ограничения зарплаты 50,000, минимизируя расчет "риска", который Я придумал.
теперь проблема заключается в положении" flex". Команда должна состоять из 9 позиций, 1 QB 2 РБ 3 WR 1 Тэ 1 DEF 1 FLEX
flex может быть RB, WR или TE.
Так, мы можем после этого иметь:
1 QB
2-3 РБ
3-4 WR
Те 1-2
1 DEF
Я пытаюсь реализовать ограничение, которое #RB + #WR + #TE ==7.
вот соответствующий код:
library(Rglpk)
# number of variables
num.players <- length(final$PLAYER)
# objective:
obj <- final$FPTS_PREDICT_RF
# the vars are represented as booleans
var.types <- rep("B", num.players)
# the constraints
matrix <- rbind(as.numeric(final$position == "QB"), # num QB
as.numeric(final$position == "RB"), # num RB
as.numeric(final$position == "WR"), # num WR
as.numeric(final$position == "TE"), # num TE
as.numeric(final$position == "DEF"),# num DEF
diag(final$riskNormalized), # player's risk
final$Salary) # total cost
direction <- c("==",
"<=",
"<=",
"<=",
"==",
rep("<=", num.players),
"<=")
rhs <- c(1, # Quartbacks
3, # Running Backs
2, # Wide Receivers
1, # Tight Ends
1, # Defense
rep(10, num.players), #HERE, you need to enter a number that indicates how
#risk you are willing to be, 1 being low risk,
# 10 being high risk. 10 is max.
50000) # By default, you get 50K to spend, so leave this number alone.
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs,
types = var.types, max = TRUE)
sol #Projected Fantasy Points
кто-нибудь может помочь мне реализовать это ограничение? Любая помощь-это много, высоко ценится!
EDIT: ссылка на набор данных "final" - это формат csv: https://www.dropbox.com/s/qp35wc4d380hep1/final.csv?dl=0
побочный вопрос: для любого из вас, фэнтезийных футболистов, я вычисляю свой фактор "риска" непосредственно из S. D. исторических фэнтезийных точек игрока и нормализую это число над поддержкой [0,10]. Можете ли вы придумать лучший способ рассчитать данный риск игроков?
1 ответов
вы можете сделать это, добавив следующие ограничения:
- число RBs >= 2
- число RBs
- количество WRs >= 3
- количество WRs
- количество TEs > = 1
- количество TEs
- количество RBs + WRs + TEs == 7
вот обновленный код:
library(Rglpk)
# number of variables
num.players <- length(final$PLAYER)
# objective:
obj <- final$FPTS_PREDICT_RF
# the vars are represented as booleans
var.types <- rep("B", num.players)
# the constraints
matrix <- rbind(as.numeric(final$position == "QB"), # num QB
as.numeric(final$position == "RB"), # num RB
as.numeric(final$position == "RB"), # num RB
as.numeric(final$position == "WR"), # num WR
as.numeric(final$position == "WR"), # num WR
as.numeric(final$position == "TE"), # num TE
as.numeric(final$position == "TE"), # num TE
as.numeric(final$position %in% c("RB", "WR", "TE")), # Num RB/WR/TE
as.numeric(final$position == "DEF"),# num DEF
diag(final$riskNormalized), # player's risk
final$Salary) # total cost
direction <- c("==",
">=",
"<=",
">=",
"<=",
">=",
"<=",
"==",
"==",
rep("<=", num.players),
"<=")
rhs <- c(1, # Quartbacks
2, # RB Min
3, # RB Max
3, # WR Min
4, # WR Max
1, # TE Min
2, # TE Max
7, # RB/WR/TE
1, # Defense
rep(10, num.players), #HERE, you need to enter a number that indicates how
#risk you are willing to be, 1 being low risk,
# 10 being high risk. 10 is max.
50000) # By default, you get 50K to spend, so leave this number alone.
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs,
types = var.types, max = TRUE)
наконец, вы можете оценить свое решение путем подмножества final
:
final[sol$solution==1,]
# X PLAYER FPTS_PREDICT_LIN FPTS_PREDICT_RF Salary position
# 1 1 A.J. Green 20.30647 20.885558 5900 WR
# 17 18 Andre Holmes 13.26369 15.460503 4100 WR
# 145 156 Giovani Bernard 17.05857 19.521157 6100 RB
# 148 160 Greg Olsen 17.08808 17.831687 5500 TE
# 199 222 Jordy Nelson 22.12326 24.077787 7800 WR
# 215 239 Kelvin Benjamin 16.12116 17.132573 5000 WR
# 233 262 Le'Veon Bell 20.51564 18.565763 6300 RB
# 303 340 Ryan Tannehill 17.92518 19.134305 6700 QB
# 362 3641 SD 5.00000 6.388666 2600 DEF
# risk riskNormalized
# 1 5.131601 3.447990
# 17 9.859006 6.624396
# 145 9.338094 6.274388
# 148 6.517376 4.379111
# 199 9.651055 6.484670
# 215 7.081162 4.757926
# 233 6.900656 4.636641
# 303 4.857983 3.264143
# 362 2.309401 0.000000
для этих проблемных данных вы выбрали широкий приемник в положение flex.