线性规划R语言

2 篇文章 0 订阅

线性规划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+2x3602x1+x2+2x340x1+3x2+2x380x1,x2,x30
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+2x383x1+2x26x1,x2,x30
对应的优化代码为

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



-END-

参考资料

https://cran.r-project.org/web/packages/Rglpk/Rglpk.pdf

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值