2016-06-21 10 views
0

Rのnloptrパッケージに複数の "不等式制約"を定義する方法はありますか?"複数の不等式制約" - R nloptrパッケージによる最小化

不等式関数には5つの不等式制約が必要です。行列の列(整数ベクトルから積み重ねたもの)< = 1。 (6列のうち5)

これは、私はそれを達成するために実装方法である:

constraint.func <- function(my.data.var) 
{ 
    column = 2 
    constr <- c("numeric",ncol(my.data.matrix.inj)) 

    for(index in 1:ncol(my.data.matrix.inj)) #1 to 5 
    { 
    constr[index] <- sum(my.data.var[column], my.data.var[column+6], my.data.var[column+12], my.data.var[column+18])-1 
    column = column+1 
    } 
    constr.1 <- c(constr[1],constr[2],constr[3],constr[4],constr[5]) 

return(constr.1) 
} 

my.data.varマトリックスとして積層されている数値ベクトルです。

my.data.var <- c(10,0.25,0.25,0.25,0.25,0.25, 
      10,0.25,0.25,0.25,0.25,0.25, 
      10,0.25,0.25,0.25,0.25,0.25, 
      10,0.25,0.25,0.25,0.25,0.25) 

my.data.var

NLOPTRは、以下のように定義されていますが、私はそれを実行すると、それは "不等式制約の数= 0" は言います。

opts = list("algorithm"="NLOPT_LN_COBYLA", 
      "xtol_rel"=1.0e-5, "maxeval"=500) 

result <- nloptr(my.data.var,eval_f = Error.func,lb=c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), 
       ub = (Inf,1,1,1,1,1,Inf,1,1,1,1,1,Inf,1,1,1,1,1,Inf,1,1,1,1,1), 
      eval_g_ineq=constraint.func,opts = opts) 

print(result) 

更新回答: を私はとしてConstraint.funcを更新し、今nloptrは不等式制約を選ぶ

constraint.func <- function(my.data.var) 
{ 
    column = 2 
    constr <- vector("numeric",length = 5) 
    for(index in 1:ncol(my.data.matrix.inj)) 
    { 
    constr[index] <- sum(my.data.var[column], my.data.var[column+6], my.data.var[column+12], my.data.var[column+18])-1 
    column = column+1 
    } 
return(constr) 
} 
+0

私はこのポストhttp://stackoverflow.com/questions/31431575/minimization-with-r-nloptr-package-multiple-equality-constraintsからではなく、無駄に言及しました。 – Modi

+0

[緊急募集に関するフィードバック](http://meta.stackoverflow.com/q/326569/472495)です。 – halfer

+0

@halfer:sure。 thnx – Modi

答えて

2

としてConstraint.funcを定義しました。

constraint.func <- function(my.data.var) 
{ 
    column = 2 
    constr <- vector("numeric",length = 5) 

for(index in 1:ncol(my.data.matrix.inj)) 
    { 
    constr[index] <- sum(my.data.var[column], my.data.var[column+6], my.data.var[column+12], my.data.var[column+18])-1 
    column = column+1 
    } 
return(constr) } 
関連する問題