2016-12-02 6 views
4

私はstackoverflowを新しく検索しましたが、私の質問に対する回答が見つかりませんでした。私は最適化パッケージRsolnpの問題を最小限に抑えようとしています。ソルバーは私に解決策を与えますが、コードを実行するたびに次の警告メッセージが表示されます。Rsolnp:cbind(temp、funv):結果の行数がベクトルの長さの倍数ではない(arg 1)

警告メッセージ:1:cbind(temp、funv)で: 結果の行数はベクトルの倍数ではありません長さ(arg 1)

さらに、このソリューションはipopとsolve.QPで得られるソリューションとはまったく異なります。それらの解はほぼ同じです(0.2480,0.0000,0.0121,0.7400)。 問題の多くの異なる形式を試しましたが、私が間違ったことを理解できませんでした。私はすべての助けと情報に感謝しています!

library(Rsolnp) 
# Starting Values 
x0 <- c(0.25,0,0.01,0.75) 


fn <- function(x){ 
    d <- c(0.0308, 0.0269, 0.0145, 0.0130) 
    d <- -d 
    D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
     c(0.0778, 0.1170, 0.0066, 0.0029), 
     c(-0.0240, 0.0066, 0.0444, 0.0193), 
     c(-0.0154, 0.0029, 0.0193, 0.0148)) 
out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x) 
out 
} 


# Inequality Constraint: 0 =< x 0 =< 1 
lx <- rep(0,4) 
ux <- rep(1,4) 



sol <- solnp(pars = x0, 
     fun = fn, 
     eqfun = sum, 
     eqB = 1, 
     ineqLB = lx, 
     ineqUB = ux) 
sol$pars 

答えて

2

ようこそ。

ここで2つの問題があります。a)問題があります。結果はbです。b)あなたには意味をなさない警告メッセージがあります。

ad a) これは、LaGrangeの最適化が、正の値を最大化する代わりに負の値を最小化することによって行われることが多いためです。それは違いです。 d-d(私が編集で行った)を設定すると、そのソリューションは他のソルバーによって作成されたソリューションと同じです。

ad b) 警告メッセージの問題は多少トリッキーです。メッセージ自体は、cbindが異なる長さの2つの列をバインドしようとしていることを意味します。 Rは、同じ長さの2つの列をバインドするのに必要な回数だけ短い列の値を繰り返します。長い方が短い方の倍数でない場合は、この警告が表示されますが、未使用の剰余がある場合は、Rはより短い方の値を繰り返し続けます。

ただし、パッケージにバグがあるようです。 あなたが

options(warn = 2) # turns warnings to errors and breaks code 
debug(solnp) 
sol <- solnp(pars = x0, 
    fun = fn, 
    eqfun = sum, 
    eqB = 1, 
    ineqLB = lx, 
    ineqUB = ux) 

を実行すると、あなたが問題を引き起こしtempdfが作成されていると呼ばれるオブジェクトがあることを認識しています。しかし、このオブジェクトはsolnpのコードで再び使用されることはありません。私は作者に尋ねるでしょう、おそらく彼らはこれがバグであることを確認したり、そうでないことを示すことができます。

1

明示的に数値、FN、あなたの目的関数の結果を作成します。

fn <- function(x){ 
    d <- c(0.0308, 0.0269, 0.0145, 0.0130) 
    d <- -d 
    D <- cbind(c(0.1486, 0.0778, -0.0240, -0.0154), 
      c(0.0778, 0.1170, 0.0066, 0.0029), 
      c(-0.0240, 0.0066, 0.0444, 0.0193), 
      c(-0.0154, 0.0029, 0.0193, 0.0148)) 
    out <- t(d) %*% x + 0.5 * (t(x) %*% D %*% x) 
    as.numeric(out) 
} 

と私は

イーター取得:1つのFN:-0.01153 Parsで:0.24798607502 0.00000002295 0.01205720515 0.73995669928イーター:2 fn:-0.01153パーツ:0.247984418270 0.000000003318 0.012080555874 0.739935021900 solnp - > 2回の繰り返しで完了

sol $ pars [1] 2.479 844e-01 3.317577e-09 1.208056e-02 7.399350e-01

関連する問題