Search code examples
rlpsolve

r how to use lpSolve and limit rows selected


I'm trying to replicate an Excel solver model in R. It's a simple problem to start looking to maximize points with the only constraint being limited the number events than can be played. So I have a two column data frame with a tournament number and project points. In Excel we have a Play Yes/no binary column and multiply it by the points and set to maximize, allowing the model to change the Play Yes/No column to 0 or 1. The constraint limits the sum of the play yes/no variable to the constraint value, for example 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)

The result looks at only 3 rows of the data frame and it should look at the top 25. Eventually, I'll add additional constraints as I know lp is not required for this simple example, but need to get past this roadblock first.


Solution

  • 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
    

    Sample data:

    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