2016-11-22 18 views
0

私はポートフォリオ最適化の問題を解決しようとしていますが、基本的にはポートフォリオと返品率があります。基本的には、全体の返品率を最大限に最適化する必要があります。問題の製品に固有の最小限の制約制約で最適化するR

がありますので、トリッキーな取得データ:

product share_per return_per min_share_per 
prod1 0.5  0.1  0.2 
prod2 0.2  0.4  0.1 
prod3 0.2  0.05  0.0 
prod4 0.1  0.04  0.0 
prod5 0.0  0.3  0.0 

基本的に私たちが列に最適化を行っているshare_perので、製品*(share_per * return_per)を作成するようにあなたはどこSPEし、私はどちらも把握することはできません見ることができるように*この最大 私の絶望的に悪い試みは

mat <- matrix(c(0.5, 0.2, 0.2, 0.1, 0.0)) 
colnames(mat) <- c("return_per") 

minmax <- function(x, a) (sum(a*x)) 
opt <- apply(mat, 1, function(i) { 
    optimize(minmax, c(0, 1), a = i[["return_per"]], maximum=T)$maximum 
}) 

mat2 <- cbind(mat, opt) 
mat2 

ました行に固有の制約を覚えてください

constrOptimは私が探しているはずのものですが、制約部分を理解することはできません。

答えて

1

あなたはこれを試すことができます。

df <- read.table(text='product share_per return_per min_share_per 
       prod1 0.5  0.1  0.2 
       prod2 0.2  0.4  0.1 
       prod3 0.2  0.05  0.0 
       prod4 0.1  0.04  0.0 
       prod5 0.0  0.3  0.0', header=TRUE) 

ret <- df$return_per 

fn <- function(sp) sum(ret*sp) # objective 

Amat <- rbind(diag(nrow(df)), diag(-1,nrow(df)), rep(-1,nrow(df))) # constraints 
bvec <- c(df$min_share_per, rep(-1, nrow(df)), -1)    # sp_j >= min_share_per, 
                    # sp_j <= 1 and 
                    # sum_j sp_j <= 1 
init <- c(0.5,0.2,0.2,0.05,0.01) # making sure that the initial value is in the feasible region 

sol <- constrOptim(init, fn, NULL, ui = Amat, ci = bvec, control=list(fnscale=-1)) # maximize 
round(sol$par, 2) 
# [1] 0.2 0.8 0.0 0.0 0.0 
+0

をすごいああ!美しく完成!私は十分にあなたに感謝できない! –

関連する問題