最优化读书笔记R(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)

整数约束的非线性规

可以通过优化算法,如:遗传算法,蚁群等。

参考文献:

数据科学中的R语言 李舰 肖凯(2015.3)

猜你喜欢

转载自blog.csdn.net/qq_40584718/article/details/78368711
今日推荐