R optimx,中断后恢复内部存储的值

问题描述 投票:0回答:1

我的优化代码运行了几天,由于外部原因,我不时通过单击 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)
r optimization mathematical-optimization
1个回答
0
投票

您可以修改目标函数以在函数环境中存储有关最后一次调用的信息(与优化算法的最后一次迭代并不完全相同,因为一次迭代通常涉及对目标函数的多次调用),例如

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
© www.soinside.com 2019 - 2024. All rights reserved.