我有以下问题:我必须解决多维度的优化问题。但是,从某种意义上说,问题在某种程度上是好的:我可以在外部优化和内部优化中分解问题,从而减少维度。内部优化可以非常有效地解决(线性代数)。代码有点冗长。出于这个原因,我创造了一个玩具模型。
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)
}
答案 0 :(得分:2)
使用&lt;&lt; -
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)