r как использовать lpSolve и ограничить количество выбранных строк

Я пытаюсь воспроизвести модель решателя Excel в R. Это простая проблема - начать стремиться к максимальному увеличению количества очков с единственным ограничением, ограничивающим количество событий, которые можно воспроизвести. Итак, у меня есть двухколоночный фрейм данных с номером турнира и баллами проекта. В Excel у нас есть двоичный столбец Play Yes / no, умножаем его на точки и устанавливаем для максимизации, что позволяет модели изменить столбец Play Yes / No на 0 или 1. Ограничение ограничивает сумму переменной play yes / no. к значению ограничения, например 25.

library(lpSolve)
tournament<-rep(1:48,1)
mean<-c(12.2,30.4,30.9,44.1,31.3,27.6,31.5,25.0,31.2,24.0,28.0,23.9,14.1,9.5,17.2,37.8,30.5,43.0,32.1,30.7,30.2,37.0,32.1,28.9,23.7,4.6,29.0,29.1,30.7,31.6,49.5,25.1,30.2,10.3,30.3,21.8,88.5,31.0,30.9,2.9,31.1,30.3,29.7,63.7,31.6,91.6,30.6,31.0)

aggdata<-data.frame(tournament,mean)

maxevents <-25

obj<-aggdata$mean
con <- rep(1,nrow(aggdata))
dir <- c("==")
rhs <- maxevents
result <- lp("max", obj, con, dir, rhs, all.bin = TRUE)

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


person G Casey    schedule 15.05.2018    source источник
comment
Ответ на этот пост может быть полезен? Как реплицировать решатель Excel в R   -  person Russ Thomas    schedule 15.05.2018


Ответы (1)


Надеюсь это поможет!

library(lpSolve)

#objective function
obj <- rep(1, nrow(aggdata))

#constraints
con <- matrix(c(obj <- rep(1, nrow(aggdata)),
                as.vector(aggdata$point)), nrow = 2, byrow = T)  #you can add another constraints here and make 'nrow' equals to number of total constraints
dir <- c("==", "<=")
rhs <- c(25,     #total number of tournament
         1000)   #let's assume that total points can't exceeds 1000

#optimization solution
result <- lp ("max", obj, con, dir, rhs, all.bin=TRUE)
result$solution

Примеры данных:

aggdata <- data.frame(tournament = rep(1:48,1),
                      point = c(12.2,30.4,30.9,44.1,31.3,27.6,31.5,25.0,31.2,24.0,28.0,23.9,14.1,
                               9.5,17.2,37.8,30.5,43.0,32.1,30.7,30.2,37.0,32.1,28.9,23.7,4.6,
                               29.0,29.1,30.7,31.6,49.5,25.1,30.2,10.3,30.3,21.8,88.5,31.0,30.9,
                               2.9,31.1,30.3,29.7,63.7,31.6,91.6,30.6,31.0))
#  tournament point
#1          1  12.2
#2          2  30.4
#3          3  30.9
#4          4  44.1
#5          5  31.3
#6          6  27.6
person 1.618    schedule 16.05.2018