2017-12-06 8 views
0

私はかなり単純な最適化に関する質問をしていますが、私はかなりうまくいっていますが、最適化はあまりできません。最適化 - 制限と単純な制約

my.function <- function(parameters){ 
    x <- parameters[1] 
    y <- parameters[2] 
    z <- parameters[3] 
    ((10*x^2) - ((y/2) * (z/4)))^2 
} 

result <- optim(c(7,10,18),fn = my.function, method = 'L-BFGS-B', 
     lower = c(2,7,7), 
     upper = c(15,20,20)) 

result$par 
#[1] 2.205169 19.546621 19.902243 

これは私が取り組んでいる問題のメークアップ版です。その目的が理にかなっていない場合は、許してください。私は 'L-BFGS-B'メソッドを使用して制限を設けていますが、制約を追加する必要があり、それを行う方法がわかりません。次のように私が実装しようとしている私のルールは以下のとおりです。

  • xがyはzは7と20
  • の間でなければなりません
  • 7〜20でなければならない2及び15
  • 間でなければなりません。 z < = y

これは実装方法がわからない最後のものです。どんな助けもありがとう。ありがとうございました。制約違反があった場合に

+1

「L-BFGS-B」は、束縛された制約付きの問題のみです。 'x <= y'は実際の制約なので、別のオプティマイザ(cobyla、slsqpなど)が必要です –

+0

@ErwinKalvelagenありがとうございました。 – Balter

+0

@Balterネイティブな最適化を使用する場合は 'constrOptim'が問題のために動作します –

答えて

2

は、目的関数に多数の追加、すなわちにmy.functionの最後の行を変更:

((10*x^2) - ((y/2) * (z/4)))^2 + ifelse(y > z, 10^5, 0) 

この場合の結果は、制約を満たす行い以下のとおりです。また、目的関数は負ではないので、その値は0より小さくすることはできませんので、最小から数値の許容値を達成しました。

result$par 
## [1] 2.223537 19.776462 20.000000 

result$value 
## [1] 1.256682e-11 
+1

このアプローチの標準的な議論は、これは区別できないのでほとんどのソルバーの仮定に従わないことです。 –

+0

それはdoesn問題ありません。あなたはそれがしばしば動作することがわかります。 –

+1

それには同意しません。 –

関連する問題