Solve a linear programming (LP) problem in R

663 views Asked by At

The function takes in the coefficients of the objective function, the constraints matrix, the right-hand side values for the constraints, the direction of the constraints, and the type of the LP problem (minimization or maximization). It then uses the lpSolveAPI package to create an LP problem, set the problem type, decision variable types, and constraints, and then solves the LP problem. The function returns a list containing the optimal solution and the objective function value, which can be accessed by the user. The function is then called with specific inputs and the optimal solution and objective function value are printed all seems correct but i have sm issues when it come to

here is my function :

solve_lp <- function(objective_coefs, constraints_matrix, constraints_rhs, constraints_dir, problem_type) {
  
  # Load the lpSolveAPI package
  library(lpSolveAPI)
  
  # Set the number of rows (constraints) and columns (decision variables)
  nrow <- nrow(constraints_matrix)
  ncol <- ncol(constraints_matrix)
  
  # Create an LP problem with nrow constraints and ncol decision variables
  lprec <- make.lp(nrow = nrow, ncol = ncol)
  
  # Set the type of problem to minimize or maximize the objective function based on the problem_type argument
  lp.control(lprec, sense=problem_type)
  
  # Set the type of decision variables to integer
  set.type(lprec, 1:ncol, type=c("integer"))
  
  # Set the objective function coefficients
  set.objfn(lprec, objective_coefs)
  
  # Add the constraints to the LP problem
  for (i in 1:nrow) {
    add.constraint(lprec, constraints_matrix[i, ], constraints_dir[i], constraints_rhs[i])
  }
  
  # Solve the LP problem
  solve(lprec)
  
  # If the problem has a feasible solution, get the decision variables values and the value of the objective function
  solution <- get.variables(lprec)
  obj_value <- get.objective(lprec)
  
  # Return the optimal solution and objective function value
  return(list(solution = solution, obj_value = obj_value))
}


  objective_coefs <- c(15, 3, -6)

constraints_matrix <- matrix(c(1, 1, 1,
                               2, -1, -2,
                               2, 3, -5), nrow=3, byrow=TRUE)

constraints_rhs <- c(36, 8, 10)

constraints_dir <- c("<=", ">=", "=")

problem_type <- "min"


# Solve the LP problem using the solve_lp function
result <- solve_lp(objective_coefs = objective_coefs, constraints_matrix = constraints_matrix, constraints_rhs = constraints_rhs, constraints_dir = constraints_dir,  problem_type= problem_type)
                   # Extract the optimal solution and objective function value
                   optimal_solution <- result$solution
                   obj_value <- result$obj_value
                   
                   # Print the results
                   print(paste("Optimal solution:", optimal_solution))
                   print(paste("Objective function value:", obj_value))
 
               min z = 15x1 + 3x2 − 6x3
               S.C
               x1 + x2 + x3 ≤ 36
               2x1 − x2 − 2x3 ≥ 8
               2x1 + 3x2 − 5x3 = 10
               x1, x2, x3 ≥ 0

the result output turned for this program linear "Optimal solution: 5" "Optimal solution: 0" "Optimal solution: 0" i tested this program from a program that we did manually in class but we had different output 7/14 0.5 0 my question is which solution is the right one

1

There are 1 answers

0
G. Grothendieck On

It would be easier to use lpSolve. res$solution gives the solution. res$status of 0 means it succeeded.

library(lpSolve)

res <- lp("min", objective_coefs, constraints_matrix, 
  constraints_dir, constraints_rhs)
str(res)

giving:

List of 28
 $ direction       : int 0
 $ x.count         : int 3
 $ objective       : num [1:3] 15 3 -6
 $ const.count     : int 3
 $ constraints     : num [1:5, 1:3] 1 1 1 1 36 2 -1 -2 2 8 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:5] "" "" "" "const.dir.num" ...
  .. ..$ : NULL
 $ int.count       : int 0
 $ int.vec         : int 0
 $ bin.count       : int 0
 $ binary.vec      : int 0
 $ num.bin.solns   : int 1
 $ objval          : num 65.2
 $ solution        : num [1:3] 4.25 0.5 0
 $ presolve        : int 0
 $ compute.sens    : int 0
 $ sens.coef.from  : num 0
 $ sens.coef.to    : num 0
 $ duals           : num 0
 $ duals.from      : num 0
 $ duals.to        : num 0
 $ scale           : int 196
 $ use.dense       : int 0
 $ dense.col       : int 0
 $ dense.val       : num 0
 $ dense.const.nrow: int 0
 $ dense.ctr       : num 0
 $ use.rw          : int 0
 $ tmp             : chr "Nobody will ever look at this"
 $ status          : int 0
 - attr(*, "class")= chr "lp"

Note

We used these inputs:

objective_coefs <- c(15, 3, -6)
constraints_matrix <- matrix(c(1, 1, 1,
                               2, -1, -2,
                               2, 3, -5), nrow=3, byrow=TRUE)
constraints_rhs <- c(36, 8, 10)
constraints_dir <- c("<=", ">=", "=")
problem_type <- "min"