在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)