线性规划R语言
没有引言(懒得写),直接上例题和对应代码
1 最大化问题
求解线性规划
max
2
x
1
+
4
x
2
+
3
x
3
\max\quad 2x_1+4x_2+3x_3\\
max2x1+4x2+3x3
{
3
x
1
+
4
x
2
+
2
x
3
≤
60
2
x
1
+
x
2
+
2
x
3
≤
40
x
1
+
3
x
2
+
2
x
3
≤
80
x
1
,
x
2
,
x
3
≥
0
\left\{\begin{array}{l} 3x_1+4x_2+2x_3 \le 60\\ 2x_1+x_2+2x_3\le40\\ x_1+3x_2+2x_3\le80\\ x_1,x_2,x_3 \ge0 \end{array}\right.
⎩
⎨
⎧3x1+4x2+2x3≤602x1+x2+2x3≤40x1+3x2+2x3≤80x1,x2,x3≥0
R代码求解,需要安装“Rglpk”优化包,当然也有其他优化包,这里只介绍它
# 线性规划
# install.packages("Rglpk")
library(Rglpk)
# 目标函数向量
obj = c(2, 4, 3)
# 线性约束矩阵
mat = matrix(c(3, 2, 1, 4, 1, 3, 2, 2, 2), nrow = 3)
# 约束符号
dir = c("<=", "<=", "<=")
# 线性约束向量
rhs = c(60, 40, 80)
# 求最大值
max = TRUE
# 优化
Rglpk_solve_LP(obj, mat, dir, rhs, max = max)
运行结果如下,返还值为列表,optimum为目标函数值,solution是解向量,status为返还状态,0表示寻找到最优值,其他非最优。
$optimum
[1] 76.66667
$solution
[1] 0.000000 6.666667 16.666667
$status
[1] 0
$solution_dual
[1] -1.833333 0.000000 0.000000
$auxiliary
$auxiliary$primal
[1] 60.00000 40.00000 53.33333
$auxiliary$dual
[1] 0.8333333 0.6666667 0.0000000
$sensitivity_report
[1] NA
2 最小化问题
最小化问题只需将参数max = TRUE修改为FALSE即可,例如求解如下线性规划问题
min
z
=
2
x
1
+
3
x
2
+
x
3
\min z = 2x_1+3x_2+x_3 \\
minz=2x1+3x2+x3
{
x
1
+
4
x
2
+
2
x
3
≥
8
3
x
1
+
2
x
2
≥
6
x
1
,
x
2
,
x
3
≥
0
\left\{\begin{array}{l} x_1+4x_2+2x_3 \ge 8\\ 3x_1+2x_2\ge 6\\ x_1,x_2,x_3 \ge 0 \end{array}\right.
⎩
⎨
⎧x1+4x2+2x3≥83x1+2x2≥6x1,x2,x3≥0
对应的优化代码为
obj <- c(2, 3, 1)
mat <- matrix(c(1, 3, 4, 2, 2, 0), nrow = 2)
dir <- c(">=", ">=")
rhs <- c(8, 6)
# 求最小值
max <- FALSE
# 优化
Rglpk_solve_LP(obj, mat, dir, rhs, max = max)
返还结果为
$optimum
[1] 7
$solution
[1] 0.8 1.8 0.0
$status
[1] 0
$solution_dual
[1] 0.000000e+00 0.000000e+00 -1.705303e-16
$auxiliary
$auxiliary$primal
[1] 8 6
$auxiliary$dual
[1] 0.5 0.5
$sensitivity_report
[1] NA
3 变量类型问题
一般的线性规划只要求变量为连续型变量,而对于一些特殊规划要求变量为整型或而二进制型。用函数Rglpk_solve_LP求解需要指明不同变量的类型。在例题2的基础上添加变量类型的约束,对不同变量指明不同类型,默认为连续型变量。
type = c("B","I","C")
# B二进制变量
# I整数型变量
# C连续型变量
Rglpk_solve_LP(obj, mat, dir, rhs, max = max,type = type)
返还结果为
$optimum
[1] 8
$solution
[1] 1 2 0
$status
[1] 0
$solution_dual
[1] NA
$auxiliary
$auxiliary$primal
[1] 9 7
$auxiliary$dual
[1] NA
$sensitivity_report
[1] NA
4 变量边界问题
对于特定的规划问题,不同变量取值存在边界,Rglpk_solve_LP求解的变量默认范围是 [ 0 , ∞ ] [0,\infty] [0,∞]。但对其他边界限制需要重新指明。例题2中有三个变量,加入三个变量的下限分别为(0.1,1,2),上限分别为(2,3,3),则可以进行如下界定
bounds <- list(lower = list(ind = c(1L,2L,3L), val = c(0.1,1,2)),
upper = list(ind = c(1L,2L,3L), val = c(2,3,3)))
# 这里变量类型选择连续(默认)
Rglpk_solve_LP(obj, mat, dir, rhs, max = max,bounds =bounds)
返还结果如下
$optimum
[1] 7.666667
$solution
[1] 1.333333 1.000000 2.000000
$status
[1] 0
$solution_dual
[1] 0.000000 1.666667 1.000000
$auxiliary
$auxiliary$primal
[1] 9.333333 6.000000
$auxiliary$dual
[1] 0.0000000 0.6666667
$sensitivity_report
[1] NA
参考资料
https://cran.r-project.org/web/packages/Rglpk/Rglpk.pdf