我们如何将此代码修改为更高效的代码并进行搜索,直到达到p1-p2的容差级别,结果我们得到极值?有没有比这个黄金部分搜索更快的查找极值的算法?
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)
答案 0 :(得分:4)
有没有理由不使用内置的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