2012-07-17 67 views
0

我們如何修改此代碼以獲得更高效的代碼並搜索,直到p1-p2的容差水平達到並且結果得到極值?有沒有更快的算法找到極值比這個黃金分割的serach?在R中的黃金分割搜索極值的實現

lambda<-(sqrt(5)-1)/2 

    golden.section<-function(f, pL, pU, p1, p2, top, result){ 
     if (top==26){ 
     return(result) 
    } 
    else if(top==1){ 
    p1<-pL + (1-lambda)*(pU - pL) 
    p2<-pU - (1-lambda)*(pU - pL) 
    } 
    result[top,]<-c(p1,p2) 
    if(f(p2) < f(p1)){ 
    pU<-p2 
    pL<-pL 
    p2<-p1 
    p1<-pL + (1-lambda)*(pU - pL) 
    } else if (f(p2) > f(p1)){ 
    pU <- pU 
    pL <- p1 
    p1 <- p2 
    p2<-pU - (1-lambda)*(pU - pL) 
    } 
    result<-golden.section(f, pL, pU, p1, p2, top=top+1, result) 
    return(result) 
    } 

result<-data.frame(p1=rep(NA, 25), p2=rep(NA, 25)) 
result<-golden.section(function(x) -(x - 1.235)^2 + 0.78 * x + 0.2, 
        -5, 5, NA, NA, 1, result) 

回答

3

有什麼理由不使用內置optimize()功能,它採用「黃金分割搜索和連續的拋物線插值的組合」?基於這個基準測試,它比你的代碼快78倍(儘管它不能保存所有嘗試的連續值)

ff <- function(x) -(x - 1.235)^2 + 0.78 * x + 0.2 
library(rbenchmark) 
benchmark(golden.section(ff,-5, 5, NA, NA, 1, result), 
      optimize(ff,c(-5,5))) 
##     test replications elapsed relative user.self sys.self 
## 1 golden.section(...)   100 0.936  78  0.904 0.032 
## optimize(ff, c(-5, 5))   100 0.012  1  0.012 0.000