R语言-大规模优化器(gurobi)

gurobi简介

大规模优化器一般针对问题规模比较庞大,变量和约束数量达到几十万或者以上级别的问题。当前运筹学领域公认主流的大规模优化器中,商业优化器包括 Gurobi, Cplex, Xpress;免费优化器包括 SCIP, CBC, GLPK 等。其中Gurobi有提供学术免费版本,并且现在支持特定广义约束,可以直接输入Min, Max, Abs, 逻辑条件(AND, OR)等约束,而不必人为转换为线性约束。

Gurobi 可以解决的数学问题包括:

  • 线性问题(Linear problems)
  • 二次型问题(Quadratic problems)
  • 混合整数线性和二次型问题(Mixed integer linear and quadratic problems)

gurobi的安装

gurobi学术免费版申请

假如在在官网申请了学术免费版后进行安装出现以下的一些错误:

ERROR 303: hostname mymachine.mydomain (xx.xx.xx.xx) not recognized as belonging to an academic domain
# 或  
ERROR 303: hostname xx.xx.xx.xx (xx.xx.xx.xx) not recognized as belonging to an academic domain

可以申请免ip验证学术许可,具体可以看下:http://www.edgestone-it.com/gurobi.htm

R语言安装gurobi包

找到gurobi安装目录下的R文件夹下的gurobi_7.0-1.zip。并在R语言中安装此包,便可以进行在R中调用gurobi接口。
R语言-大规模优化器(gurobi)_第1张图片

R语言中的gurobi

gurobi中,只提供了一条函数gourbi.主要通过两个list进行描述问题。Model描述问题,params描述自定义参量。

Model list

其中Model列表中包含以下元素

参数 作用
model$A 线性约束系数矩阵
model$obj 决策变量(控制变量)系数
model$sense 约束符号,由=, >, <, >=, <=组成
model$rhs 线性约束右端向量
model$lb 求解向量下界
model$ub 求解向量上界
model$vtypes 求解向量的类型,I表示整数,B表示0-1,C表示连续,S表示半连续,N表示半整数次
model$modelsense 设定max,min,默认求解min
model$start MIP初始解的设定,当存在是必须为每个变量都设定初始值。你也可以设定一些变量为NA,MIP求解器会尝试去进行填补NA值。(个人理解是设定初始的基本可行解)
model$vbasis 变量的状态向量(The variable basis status vector.),为单纯形法提供一个较好的起点。进行设置时,需要对变量都进行设置。(个人理解是非基变量的价值系数子向量)
model$cbasis 约束的状态向量(The constraint basis status vector),为单纯形法提供一个较好的起点。需要对约束条件都进行设置。个人理解是单纯形法中的松弛变量设置。
model$Q 二次型目标矩阵

Params list

其中Params 列表中包含以下元素

参数 作用
params$MIPFocus 默认值0,试图在最优值和可行解之间取得平衡。1:以可行解为目标;2:以最优解为目标;3:最优边界为目标。
params$Presolve 默认值:‐1,自动决定预优化力度。0:关闭预优化;1:保守;2:激进。
params$Method 默认值:‐1,自动决定优化方法。0:原始单纯型;1:对偶;2:Barrier; 3:随机并行;4:确定并行。如果模型巨大,可以考虑 2.
params$ImproveStartTime 确定从什么条件开始,优化转向对可行解质量的提升上。优化从 ImproveStartTime 设定的时间之后(以秒为单位)
params$ImproveStartGap 确定从什么条件开始,优化转向对可行解质量的提升上。ImproveStartGap 设定的收敛gap 达到之后开始进行可行解的提升。
params$OutputFlag 控制面板不输出运算过程

example1 (简单的MIP问题)

minimize:x+y+2zs.t:x+2y+3z<=4x+y>=1x,y,zbinary

library("gurobi")
# 对问题进行描述
model  <- list()
model$A     <- matrix(c(1, 2, 3, 1, 1, 0), nrow = 2, ncol=3, byrow=T) # 约束系数矩阵
model$obj   <- c(1, 1, 2) # 目标系数
model$sense <- c("<=", ">=") 
model$rhs   <- c(4, 1) # 约束右端
model$vtype <- "B" # 求解类型
model
# $A
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    1    1    0
# $obj
# [1] 1 1 2
# $sense
# [1] "<=" ">="
# $rhs
# [1] 4 1
# $vtype
# [1] "B"

result <- gurobi(model, params)
result$objval  # 1
result$x       # 0 1 0

你可能感兴趣的:(R语言-规划求解)