我在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()
命令的值
答案 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
函数。
最后,请注意nloptr
和cobyla
函数与nloptr
的行为不同 - 前者将不等式约束设为> = 0,后者将它们视为< = 0
在下面的代码中,我要做的第一件事是使用核心algorithm = NLOPT_LN_COBYLA
函数并显示它导致与使用nloptr
包装器代码相同的答案。
然后,我设置cobyla
并将其写入文件。完成优化后,我将该文件读入,并使用正则表达式从输出中提取解决方案路径。
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
}