最優化讀書筆記R(二)
阿新 • • 發佈:2019-01-02
線性規劃
簡單的線性規劃(目標函式和約束都是線性函式)
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)
整數約束的非線性規
可以通過優化演算法,如:遺傳演算法,蟻群等。
參考文獻: