我的优化代码运行了几天,由于外部原因,我不时通过单击 R-studio 的“停止”来中断/中止代码。 是否有可能查看最后一次优化迭代的内容是什么,该内容尚未保存在对象中(但必须保存在计算机内存中),或者该信息是否已经丢失? Traceback() 没有帮助。 我使用 optimx 包。
可以运行以下简单代码(并且必须手动中断)来说明我的问题。
require(optimx)
# genrose function code
genrose.f<- function(x, gs=NULL){ # objective function
## One generalization of the Rosenbrock banana valley function (n parameters)
n <- length(x)
if(is.null(gs)) { gs=100.0 }
fval<-1.0 + sum (gs*(x[1:(n-1)]^2 - x[2:n])^2 + (x[2:n] - 1)^2)
return(fval)
}
startx <- seq(1:100) / 5
n <- length( startx )
# Here is the command which has to be stopped by hand after few seconds
ans = optimx( startx, fn=genrose.f, gr=NULL, hess=NULL,
method=c("Nelder-Mead"),
control=list( maxit=5000000, save.failures=TRUE, trace=3), gs=10)
您可以修改目标函数以在函数环境中存储有关最后一次调用的信息(与优化算法的最后一次迭代并不完全相同,因为一次迭代通常涉及对目标函数的多次调用),例如
require(optimx)
# genrose function code
last_it <- 0
last_pars <- NA_real_
last_val <- NA_real_
genrose.f <- function(x, gs=100) {
last_pars <<- x
last_it <<- last_it + 1
n <- length(x)
fval <- 1.0 + sum (gs*(x[1:(n-1)]^2 - x[2:n])^2 + (x[2:n] - 1)^2)
last_val <<- fval
return(fval)
}
startx <- seq(1:100) / 5
n <- length( startx )
ans = optimx( startx, fn=genrose.f, gr=NULL, hess=NULL,
method=c("Nelder-Mead"),
control=list( maxit=5000000, save.failures=TRUE,
trace=3), gs=10)
停止后:
> last_val
[1] 9954591
> last_it
[1] 88872
> head(last_pars)
[1] 8.071216 6.878062 -4.777840 6.682326 7.567179 7.840888