【问题标题】:Getting intermediate results from nloptr in R从 R 中的 nloptr 获取中间结果
【发布时间】:2015-10-21 01:24:42
【问题描述】:

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

【问题讨论】:

    标签: r mathematical-optimization


    【解决方案1】:

    您可以在代码的 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) 
    

    除了每次迭代的参数之外,这将为您提供目标函数值

    【讨论】:

      【解决方案2】:

      这是一种可能性。在另一个问题上,我定义了一组reap/sow 函数,允许您通过不同的函数调用收集值。如果我定义一个名为“sower”的辅助函数

      sower <- function(f,n=deparse(substitute(f))) {
          function(...) {
              x <- f(...)
              do.call("sow", setNames(list(x),n))
              x
          }
      }
      

      它包装了一个函数并通过sow() 收集它的输出,我可以在你的调用中使用它

      rr <- reap(COB = cobyla(x0, sower(f), hin=sower(const), 
          lower=rep(0,8), upper=rep(1,8), nl.info = TRUE, 
          control = list(xtol_rel = 1e-16, maxeval = 2000)))
      

      那么你可以得到标准返回值仍然在COB 但你也可以调用

      rr$f
      rr$const
      

      每次调用函数时获取函数的值。 (同样,一定要包括在另一个函数的答案中定义的收获/播种函数。)

      【讨论】:

        【解决方案3】:

        我们可以在运行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)"
        

        此外,这是我在运行 trace 语句后运行问题中的 COB(...) 语句时的最后一点输出:

        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
        

        【讨论】:

        • 当我按照您的建议运行时,我收到了以下错误消息:> 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 version 3.1.2 (2014-10-31)"
        猜你喜欢
        • 2017-10-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2020-01-30
        • 2014-05-01
        • 2020-11-30
        • 1970-01-01
        相关资源
        最近更新 更多