获取跟踪以在R中存储值

时间:2015-11-10 16:46:50

标签: r mathematical-optimization

我在nloptr运行R包,这是一个非线性优化包。在nloptr包中,我使用cobyla()命令来执行优化。现在,我可以使用maxeval参数指定算法的最大迭代次数,但是当cobyla()命令执行时,它只允许我查看最终评估的输出。但是,我希望能够在方法的每次迭代中看到所有输出。

有人向我建议我使用trace()命令来查看所有中间输出,但我无法弄清楚如何让R存储此信息。任何人都可以建议我如何使用trace()(或任何其他方式)来完成此任务。

以下是我正在使用的代码:

library(nloptr)


#########################################################################################
### 
#########################################################################################
f = function(x){
    ans = cos(pi*x/5)+.2*sin(4*pi*x/5)

    return(ans)
}

const = function(x){
    ans = numeric(1)
    ans[1] = -(sin(pi*x/5)+.2*cos(4*pi*x/5))
    return(ans)
}

#########################################################################################
###
#########################################################################################

x0 = runif(1,0,10)

COB = cobyla(x0,f,hin=const,lower=0,upper=10,nl.info = TRUE,
      control = list(xtol_rel = 1e-16, maxeval = 2000))

所以我希望能够存储运行cobyla()的输出,用于迭代1,2,...,maxeval

所以我认为我需要做的是使用

trace(f) 

trace(cobyla)

在执行代码之前但我不确定如何存储运行trace()命令的值

2 个答案:

答案 0 :(得分:2)

在不调整 { "name": "[parameters('siteName')]", "type": "Microsoft.Web/sites", "location": "[resourceGroup().location]", "apiVersion": "2014-06-01", "kind": "mobileapp" ... 代码的情况下,最好的选择是将nloptr选项设置为print_level,将输出发送到3并抓取它以检索你需要。

请注意,要使用sink,您无法使用包装函数print_level - 而是必须下拉到cobyla函数。

最后,请注意nloptrcobyla函数与nloptr的行为不同 - 前者将不等式约束设为> = 0,后者将它们视为< = 0

在下面的代码中,我要做的第一件事是使用核心algorithm = NLOPT_LN_COBYLA函数并显示它导致与使用nloptr包装器代码相同的答案。

然后,我设置cobyla并将其写入文件。完成优化后,我将该文件读入,并使用正则表达式从输出中提取解决方案路径。

以下是这样的: enter image description here

print_level = 3

答案 1 :(得分:1)

假设Josh在他的评论中是正确的,那么你自己需要进行循环。它看起来像这样......

maxeval<-2000
x0<-c()
x0[1] = runif(1,0,10)
for (cureval in 1:maxeval) {
    COB = cobyla(x0[cureval],f,hin=const,lower=0,upper=10,nl.info = TRUE,
      control = list(xtol_rel = 1e-16, maxeval = 1))
    x0[cureval+1]  <-COB$par

  }