求解r中的线性规划问题



该函数接受目标函数的系数、约束矩阵、约束的右侧值、约束的方向以及LP问题的类型(最小化或最大化)。然后,它使用lpSolveAPI包创建LP问题,设置问题类型、决策变量类型和约束,然后解决LP问题。该函数返回一个包含最优解和目标函数值的列表,用户可以访问该列表。然后用特定的输入调用函数,并打印出最优解和目标函数值似乎都是正确的,但是当涉及到

时,我有sm问题。下面是我的函数:
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

将此程序的结果输出变为线性"Optimal solution: 5" "Optimal solution: 0" "Optimal solution: 0"我用我们在课堂上手工做的程序测试了这个程序但是我们有不同的输出7/14 0.5 0我的问题是哪个解决方案是正确的

使用lpSolve会更容易。Res $solution给出了解决方案。Res $status为0表示成功。

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

给:

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"

注意

我们使用这些输入:

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"

最新更新