2015-11-17 49 views
0

我有以下問題:我有在多個維度來解決優化問題。然而,這個問題在某種意義上是不錯的:我可以在外部和內部優化中分解問題,從而減少維度。內部優化可以非常有效地解決(線性代數)。代碼有點冗長。出於這個原因,我創建了一個玩具模型。如何在嵌套優化中返回解決方案?

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

回答

2

使用< < -

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) 
+0

謝謝您的回答。它對玩具模型完美地工作。然而,對於複雜的一個沒有。原因:以上所有代碼都是函數f2,它本身在函數f1中被調用。所以在控制檯中我調用了f1(),它調用f2(包含上面的代碼)。如何適應這個?很多thx,我真的很感激它! – math

+0

我添加了玩具模型的更新版本。抱歉給你帶來不便。 – math

+0

已添加回復回答。 –