版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40584718/article/details/78368711
线性规划
简单的线性规划(目标函数和约束都是线性函数)
R中常用lpSolve、Rglpk包来解决。lpSolve包的核心函数的lp(),lp.assign,lp.transport()依次解决简单线性规划、分配问题、生产计划和交通运输问题。用法:
简单线性规划
lp (direction = "min", objective.in, mat,dir,rhs, int.vec,binary.vec, all.int=FALSE, all.bin=FALSE)
# mat为系数矩阵 dir 约束的方向 rhs 约束的右端系数
#若为整数规划,可通过int.vec=c(i)制定序号来设定,若全是可通过all.int=TRUE实现。若为0-1规划,则可以通过all.bin=TRUE来实现。
Rglpk包的函数Rglpk_solve_LP()也可以实现上述简单线性规划。用法:
Rglpk_solve_LP(obj, mat, dir, rhs, types = NULL, max = FALSE,control = list(), ...)
#max为最大值的逻辑参数
#type 变量类型 B——0-1变量 I——正整数 C 正实数
分配问题
分配问题,此处以匈牙利问题为例,说明其在R中的实现
- lp.assign()的用法
lp.assign (mat, "min", presolve = 0, compute.sens = 0)
#mat为系数矩阵
#返回的是目标值,可以通过$solution来查看具体的方案
- clue包下的solve_LSAP()
solve_LSAP(mat, maximum = FALSE)
#其返回的是具体的方案,若想看目标值,可以通过以下代码实现,
y<-solve_LSAP(mat)
sum(mat[cbinds(seq_along(y),y)]
例:有一份中文说明书,需要译成日德俄英四种文字,分别有四个人来完成。每个翻译所需时间不同。问怎样分配任务可以使总的时间最小。
Mat<-matrix(c(6,7,11,2,4,5,9,8,3,1,10,4,5,9,8,2),ncol=4,byrow=TRUE)
lp.assign(Mat)
#结果
#Success: the objective function is 15
lp.assign(Mat)$solution
#结果:
[,1] [,2] [,3] [,4]
[1,] 0 0 0 1
[2,] 1 0 0 0
[3,] 0 1 0 0
[4,] 0 0 1 0
#使用solve_LSAP解决问题
library(clue)
y<-solve_LSAP(Mat)
sum(Mat[cbinds(seq_along(y),y)])
#结果:
Optimal assignment:
1 => 4, 2 => 1, 3 => 2, 4 => 3
线性约束的非线性规划问题
R中内置函数constrOptim函数专门求解约束的非线性规划。
constrOptim(theta, f, grad, ui, ci, mu = 1e-04, control = list(),method = if(is.null(grad)) "Nelder-Mead" else "BFGS", outer.eps = 1e-05, ..., hessian = FALSE)
#theta 为初始值 ui 系数矩阵 ci=rhs
#所有不等式默认是“》=”
如香蕉函数
**f(x1,x2)=(1-x1)^2+100*(x2-x1^2)^2**
s.t:
**-3x1-4x2>=12**
**-x1+2x2>=-2**
**x1>=0;x2>=0**
代码:
constrOptim(theta=c(2,1),obj.f,gr.f,Mat,rhs)
非线性约束的非线性规划
R中通过alabama包,Rsolnp(R_3.4.2上不能使用)。以下简单介绍alabama包,其核心函数为constrOptim.nl(),用法:
constrOptim.nl(par, fn, gr = NULL,hin = NULL,...)
#hin为不等式约束,所有的约束需要转化为“》=”
例:
min z=(1-x1^2)+100(x2-x1^2)^2
s.t: x1^2+x^2<=4
x1/x2>=2
library(alabama)
hin.f<-function(x){
x1<-x[1]
x2<-x[2]
c(-x1^2-x2^2+4,x1/x2-2)
}
constrOptim.nl(par=c(1,0.3),obj.f,gr.f,hin.f)
整数约束的非线性规
可以通过优化算法,如:遗传算法,蚁群等。
参考文献: