Optimization with multiple inequality constraints

65 Views Asked by At

I am working on R, I need to set up a non linear optimization problem, my dataset has the following columns:

  • Phs Code, that define univocally each pharmacy
  • Score, that define the score associated to each pharmacy
  • MKT, that define the market value generated by each pharmacy

The non linear maximization problem should contain:

  • decisional variable X(i) = the value to invest in pharmacy i
  • Objective function: MAX sum Y(i) where ``Y(i) = (0.272*log( x(i) ) + score (i) ) sales in face of the investment X(i)
  • Constraints 1: exp(0.0272*log( x(i) ) + score (i) ) < 0.8*MKT (i)
  • Constraints 2: exp(0.0272*log( x(i) ) + score (i) ) - exp( 0.0272*log( x(i) + 1 ) + score (i) ) >= 1
  • Constraints 3: sum of X(i) < B with B = budget
  • Constraints 4: X(i) > 0 for each i

--

#Objective function

    objfun <- function(x, score) 0.272 * log(x) + my_data$score


# Define the constraints

    con <- function(x, Score, MKT) {
      con1 <- exp(0.0272 * log(x) + Score) - 0.8 * MKT
      con2 <- exp(0.0272 * log(x) + Score) - exp(0.0272 * log(x + 1) + Score) - 1
      con3 <- sum(x) - 18000000
    }

# Set up the optimization problem

    x0 <- rep(1, nrow(my_data))
    lb <- rep(0, nrow(my_data))
    ub <- rep(Inf, nrow(my_data))


    problem <- list(
      objective = objfun,
      lb = lb,
      ub = ub,
      eval_g_ineq = con )

    result <- nloptr(x0 = x0, 
                 eval_f = problem$objective, 
                 lb = problem$lb, 
                 ub = problem$ub, 
                 eval_g_ineq = problem$eval_g_ineq, 
                 opts = list("algorithm" = "NLOPT_LN_COBYLA"))

Trying to change different things but keep bumping into errors. Not sure about where is the problem with my code. Really need some help Thanks

1

There are 1 best solutions below

0
Stéphane Laurent On

Assuming your data has two observations, you should do something like that:

score <- c(12, 14) # I don't have your data
MKT   <- c(22, 26) # I don't have your data

objfun <- function(x){ # minus for maximization
  -0.272 * sum(log(x) + score)
}

con <- function(x) {
  con1 <- exp(0.0272 * log(x) + score) - 0.8 * MKT
  con2 <- exp(0.0272 * log(x) + score) - exp(0.0272 * log(x + 1) + score) - 1
  con3 <- sum(x) - 18000000
  c(con1, con2, con3)
}

x0 <- rep(1, 2)
lb <- rep(0, 2)
ub <- rep(Inf, 2)


result <- nloptr(x0 = x0, 
                 eval_f = objfun, 
                 lb = lb, 
                 ub = ub, 
                 eval_g_ineq = con, 
                 opts = list("algorithm" = "NLOPT_LN_COBYLA"))