Пакет Rglpk (R) - Оптимизатор фэнтези-спорта - Дополнительные шаги

У меня есть кадр данных (статистика), который структурирован следующим образом:

   Pos        Player.Name   TM   Sal  R1  R2  R3  R4  R5  R6  R7  R8  R9 R10 R11 R12 R16 R17 R18 R19 R20 R21 R22 R23     FP
1  MID        Blake Acres  STK 11200  83   0   0  41   0 126  49  35   0   0   0  71  32  65  46  91  82  99 121  66  71.92
2  FWD      Jack Billings  STK 12100  74  59 122 113  46  88  81  76  80   0  60   0   0  74  63  85  99  52 105  72  79.35
3  FWD         Josh Bruce  STK  9250  59  81  72  55  59  69  47  43 112  60  57  59  71  65  26  48 104  49  41  69  62.30
5  DEF      Sean Dempster  STK  8650  42  47  62  79  44  42  65  57  52  62  24   0  21  48  97  40  80  71  81  54  56.21

Я могу выполнить простую оптимизацию состава Rglpk, как показано ниже, без каких-либо проблем, и это даст мне оптимальный состав на основе статистики $FP.

num.players <- length(stats$Player.Name)
obj <- stats$FP
var.types <- rep("B", num.players)
names<-unique(stats$Player.Name)
mat<-matrix(0, nrow = length(names), ncol = nrow(stats))
for (i in 1:length(names)){mat[i,]<-as.numeric(stats$Player.Name == names[i])}
matrix <- rbind(as.numeric(stats$Pos == "DEF"),as.numeric(stats$Pos == "MID"),as.numeric(stats$Pos == "RK"),as.numeric(stats$Pos == "FWD"),stats$Sal)
matrix<-rbind(mat,matrix)
direction <- c(rep("<=",length(names)),"==","==","==","==","<=") 
rhs <- c(rep(1,length(names)),2,4,1,2,100000)             
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs,types = var.types, max = TRUE)
Lineup<-stats[sol$solution==1,]

Однако я хочу модифицировать этот код, чтобы я мог найти оптимальную сторону, которая набрала указанное количество очков в указанном количестве раундов (т. е. от stats$R1 до stats$R23). Я собрал метод цикла, который теоретически работает, но слишком медленный, чтобы его можно было реализовать на практике:

target<-readline("Enter target score: ")
gms_target<-as.numeric(readline("Enter number of games to reach target score (out of 20): "))

pass<-"N"
avg<-2000

while (pass == "N"){
num.players <- length(stats$Player.Name)
obj <- stats$FP
var.types <- rep("B", num.players)
names<-unique(stats$Player.Name)
mat<-matrix(0, nrow = length(names), ncol = nrow(stats))
for (i in 1:length(names)){mat[i,]<-as.numeric(stats$Player.Name == names[i])}
matrix <- rbind(as.numeric(stats$Pos == "DEF"),as.numeric(stats$Pos == "MID"),as.numeric(stats$Pos == "RK"),as.numeric(stats$Pos == "FWD"),stats$Sal,stats$FP)
matrix<-rbind(mat,matrix)
direction <- c(rep("<=",length(names)),"==","==","==","==","<=","<=") 
rhs <- c(rep(1,length(names)),2,4,1,2,100000,avg)             
sol <- Rglpk_solve_LP(obj = obj, mat = matrix, dir = direction, rhs = rhs,types = var.types, max = TRUE)

Lineup<-stats[sol$solution==1,]
Salary<-sum(Lineup$Sal)
Score<-sum(Lineup$FP)
avg<-Score-.05
sums<-colSums(Lineup[,c(5:24)])
gms<-length(sums[sums >= target])
if(gms>=gms_target){pass="Y"}
}

Есть ли простой способ встроить этот запрос в стандартную структуру Rglpk? Например, найти оптимальный состав (на основе статистики $FP), в котором эта команда набрала 500 очков как минимум в 5 из 20 игр между R1 и R23?

------------------------------ОБНОВИТЬ------------------- -----------

Я думал об этом немного больше, и обновление stats$FP со среднего балла до общего сезона в цикле выше резко сокращает время выполнения цикла, тем не менее, я все еще очень заинтересован в альтернативе без цикла.


person Morts81    schedule 21.02.2017    source источник


Ответы (1)


Вы можете взглянуть на функции распределения в R. Если вы можете найти среднее значение и стандартное отклонение ваших оптимизированных команд, вы можете рассчитать вероятность того, что команда наберет указанный балл, используя pnorm(). На самом деле я использую его для своих фэнтези-игроков, чтобы увидеть, какова вероятность того, что они вернут мне определенный счет. Вот пример моего кода.

players$lk = mapply(function(x,y,z) pnorm(q=z, mean=x, sd=y, lower.tail = FALSE), x=players$points, y=players$sd, z=players$projection) -players$points — их средняя проекция. -players$sd – их стандартное отклонение. -players$projection – число, которое я хочу, чтобы они набрали.

Вы можете использовать эту же функцию распределения для своих команд, если сможете рассчитать стандартное отклонение.

person Tyler    schedule 05.01.2018