1. 程式人生 > >最優化讀書筆記R(二)

最優化讀書筆記R(二)

線性規劃

簡單的線性規劃(目標函式和約束都是線性函式)

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)