在R中从nloptr获取中间结果
我正在运行在R中从nloptr获取中间结果,r,mathematical-optimization,R,Mathematical Optimization,我正在运行R中的nloptr包,在获取算法的中间结果时遇到问题。该算法运行良好,但我不希望只得到最终解和迭代次数,而是希望能够在每次迭代中获得目标函数的当前值。这是我正在使用的代码 library(tgp) library(nloptr) ######################################################################################### ### ##################################
R
中的nloptr
包,在获取算法的中间结果时遇到问题。该算法运行良好,但我不希望只得到最终解和迭代次数,而是希望能够在每次迭代中获得目标函数的当前值。这是我正在使用的代码
library(tgp)
library(nloptr)
#########################################################################################
###
#########################################################################################
f = function(x){
ans = cos(pi*(x[1]+x[2]*x[3]+x[4]))+.2*sin(4*pi*(x[5]*x[6]+x[7])/(x[8]+1))
return(ans)
}
const = function(x){
ans = numeric(2)
ans[1] = sin(pi*(x[1]+x[2]*x[3]+x[4]))+.2*cos(4*pi*(x[5]*x[6]+x[7])/(x[8]+1))
ans[2] = -cos(pi*(x[1]+x[2]*x[3]+x[4]))+.2*cos(4*pi*(x[5]*x[6]+x[7])/(x[8]+1))
ans[1] = -ans[1]
ans[2] = -ans[2]
return(ans)
}
#########################################################################################
###
#########################################################################################
lhs.size = 1
lhs.lower = 0
lhs.upper = 1
x0 = c(lhs(lhs.size,rbind(c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper),c(lhs.lower,lhs.upper))))
COB = cobyla(x0,f,hin=const,lower=rep(0,8),upper=rep(1,8),nl.info = TRUE, control = list(xtol_rel = 1e-16, maxeval = 2000))
因此对象COB
给我的是:
> COB
$par
[1] 0.4209398 0.4932406 0.5175745 0.7786042 0.2980017 0.6785051 0.2313283 0.3872766
$value
[1] -0.2828427
$iter
[1] 559
$convergence
[1] 4
$message
[1] "NLOPT_XTOL_REACHED: Optimization stopped because xtol_rel or xtol_abs (above) was reached."
但是我希望每个
$iteration
都有$value
,这里有一个可能性。关于另一个问题,我定义了一组函数,允许您通过不同的函数调用收集值。如果我定义一个名为“sower”的助手函数
然后,您可以得到标准返回值仍然在COB
中,但您也可以调用
rr$f
rr$const
每次调用函数时获取它们的值。(同样,确保包含在对另一个函数的回答中定义的收获/播种函数。)我们可以在运行
cobyla
之前随时发出此语句来跟踪f
。每次计算f
时,都会显示目标值和参数值
trace(f, exit = quote(cat(returnValue(), x, "\n")))
要删除跟踪,请执行以下操作:
untrace(f)
下面是一个演示:
> f <- function(x) 2*x
> trace(f, exit = quote(cat(returnValue(), x, "\n")))
[1] "f"
> f(3)
Tracing f(3) on exit
6 3
[1] 6
> R.version.string
[1] "R version 3.2.2 Patched (2015-10-19 r69550)"
您可以在代码的opts部分添加“打印级别=3”。例如:
opts = list("algorithm"="NLOPT_LN_COBYLA",
"xtol_rel"=1.0e-8, "maxeval"= 5000,
"print_level" = 3)
然后在调用算法时使用opts
,即
result <- nloptr(my.data.var,eval_f = Error.func,
lb=lb,ub=ub,
eval_g_ineq=constraint.func,
opts = opts)
result当我运行您建议的程序时,我收到了以下错误消息:>COB=cobyla(x0,f,hin=const,lower=rep(0,8),upper=rep(1,8),nl.info=TRUE,control=list(xtol_rel=1e-16,maxeval=2000))跟踪cat(returnValue(),x,“\n”)中退出错误时的f1(x…):找不到函数“returnValue”>我添加了一个小型的独立演示。尝试将其复制并粘贴到会话中。如果这不起作用,也许你需要一个新版本的R,或者你需要开始一个新的会话。有趣的是,即使是最简单的例子,我仍然收到相同的错误消息。我使用的是一年前的R版本….>R.version.string[1]“R版本3.1.2(2014-10-31)”
Tracing f1(x, ...) on exit
-0.7071068 0.9867454 0.9798806 0.9903225 0.7928568 0.9767687 0.6967606 0.6352815 0.05268439
Tracing f1(x, ...) on exit
-0.7071068 0.9867454 0.9798806 0.9903225 0.7928568 0.9767687 0.6967606 0.6352815 0.05268439
Tracing f1(x, ...) on exit
-0.7071068 0.9867454 0.9798806 0.9903225 0.7928568 0.9767687 0.6967606 0.6352815 0.05268439
Tracing f1(x, ...) on exit
-0.7071068 0.9867454 0.9798806 0.9903225 0.7928568 0.9767687 0.6967606 0.6352815 0.05268439
Tracing f1(x, ...) on exit
-0.7071068 0.9867454 0.9798806 0.9903225 0.7928568 0.9767687 0.6967606 0.6352815 0.05268439
Call:
nloptr(x0 = x0, eval_f = fn, lb = lower, ub = upper, eval_g_ineq = hin, opts = opts)
Minimization using NLopt version 2.4.0
NLopt solver status: 5 ( NLOPT_MAXEVAL_REACHED: Optimization stopped because maxeval (above) was reached. )
Number of Iterations....: 2000
Termination conditions: stopval: -Inf xtol_rel: 1e-16 maxeval: 2000 ftol_rel: 0 ftol_abs: 0
Number of inequality constraints: 2
Number of equality constraints: 0
Current value of objective function: -0.707106791132674
Current value of controls: 0.9867454 0.9798806 0.9903225 0.7928568 0.9767687 0.6967606 0.6352815 0.05268439
opts = list("algorithm"="NLOPT_LN_COBYLA",
"xtol_rel"=1.0e-8, "maxeval"= 5000,
"print_level" = 3)
result <- nloptr(my.data.var,eval_f = Error.func,
lb=lb,ub=ub,
eval_g_ineq=constraint.func,
opts = opts)