【问题标题】:How to return solutions in a nested optimization?如何在嵌套优化中返回解决方案?
【发布时间】:2016-02-18 18:44:44
【问题描述】:

我有以下问题:我要解决一个多维度的优化问题。但是,从某种意义上说,这个问题有点好:我可以将问题拆分为外部优化和内部优化,以减少维度。内部优化可以非常有效地解决(线性代数)。代码有点长。为此,我创建了一个玩具模型。

out.obj <- function(x,storage){
  inner.sol <- inner.obj(param = x)
  storage <- append(storage,inner.sol)
  return((x-inner.sol)^2)
}

inner.obj <- function(x = NULL,param){
  return(log(param)^2-param)
}
storage <- c()
sol <- optim(par = c(3),fn = out.obj,storage = storage)

从数学的角度来看,这个例子没有多大意义。但是,它显示了我关于提取内部解决方案的问题。在上面的代码中,我们有一个 2dim 问题,x1,x2。如您所见,我将外部目标函数称为 optim。给定 x1 的值,我们可以“求解”x2。

最后,我希望得到 x1 和 x2 的两个最优值。为此,我使用了参数存储。但是存储获得了本地版本,我无法检索 x2 的最佳值。我还尝试了以下方法:

    storage <- c()
    out.obj <- function(x){
      inner.sol <- inner.obj(param = x)
      storage <- append(storage,inner.sol)
      return((x-inner.sol)^2)
    }

    inner.obj <- function(x = NULL,param){
      return(log(param)^2-param)
    }

    sol <- optim(par = c(3),fn = out.obj)

In this case storage should be globally defined. Still the values for x2 are not getting populated. How can I get this value?


**EDIT**

f2 <- function(y=NULL){
  storage <- c()
sol <- optim(par = c(3),fn = out.obj)
return(list("sol" = sol,"storage"=storage))
}

f1 <- function(p=NULL){
  temp <- f2(NULL)
  return(temp)
}

out.obj <- function(x){
  inner.sol <- inner.obj(param = x)
  storage <<- append(storage,inner.sol)
  return((x-inner.sol)^2)
}

inner.obj <- function(x = NULL,param){
  return(log(param)^2-param)
}

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    使用

    storage <<- append(storage,inner.sol)
    

    assign

    assign("storage", append(storage, inner.sol), .GlobalEnv))
    

    关于storage不在全局环境中的修改问题,将storage所在的环境传递给out.obj,如图:

    f2 <- function(y=NULL){
      storage <- c()
      sol <- optim(par = c(3),fn = out.obj, e = environment())
      return(list("sol" = sol,"storage"=storage))
    }
    
    out.obj <- function(x, e){
      inner.sol <- inner.obj(param = x)
      assign("storage", append(e$storage, inner.sol), e)
      return((x-inner.sol)^2)
    }
    

    assign 行也可以写成:

     e$storage <- append(e$storage, inner.sol)
    

    【讨论】:

    • 感谢您的回答。它确实适用于玩具模型。但是,对于复杂的则没有。原因:以上所有代码都是函数 f2,它本身在函数 f1 中被调用。所以在控制台中我调用 f1() 调用 f2 (包含上面的代码。)如何适应这个?非常感谢,我真的很感激!
    • 我添加了玩具模型的更新版本。很抱歉给您带来不便。
    • 已添加对答案的响应。
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多