2016-07-21 10 views
1

DEoptimを使用して目的関数を最小化しようとしていますが、単純な制約があります。 DEoptimの呼び出しに単純な制約を追加する方法については明確ではありません。次のようにR:DEoptimに制約を追加する方法

obj_min <- function(n,in_data) { 
    gamma <- in_data$Gamma 
    delta <- in_data$Delta 
    theta <- in_data$Theta 
    gammaSum <- sum(n * gamma) 
    deltaSum <- sum(n * delta) 
    thetaSum <- sum(n * theta) 
    abs((EPC * gammaSum - 2 * abs(deltaSum))/thetaSum) 
} 

私のマッピング機能(整数制約を課すこと)されています:ここでの目的関数である

mappingFun <- function(x) { 
    x[1:length(x)] <- round(x[1:length(x)], 0) 
} 

DEoptimへの私の呼び出しは次のとおりです。

out <- DEoptim(DTRRR_min, lower = c(rep(-5, length(in_data[, 1]))), 
     upper = c(rep(5, length(in_data[, 1]))), 
     fnMap = mappingFun, DEoptim.control(trace = F),in_data) 

マイIN_DATAオブジェクト

(データフレーム)は:

Underlying.Price Delta Gamma Theta Vega Rho Implied.Volatility 
1   40.69 0.9237 3.2188 -0.7111 2.0493 0.0033    0.3119 
2   40.69 0.7713 6.2267 -1.6352 4.3240 0.0032    0.3402 
3   40.69 0.5822 8.4631 -2.0019 5.5782 0.0338    0.3229 
4   40.69 0.3642 8.5186 -1.8403 5.3661 0.0210    0.3086 
5   40.69 0.1802 6.1968 -1.2366 3.7517 0.0093    0.2966 

私は、という単純な制約を追加したいと思います:、言い換えれば

sum(n * delta) = target 

最適化されたパラメータの合計を、nは、ある種のターゲットに私のIN_DATAデータフレームの合計でデルタを掛けました。簡単にするために、単に0.5と言うことができます。どのようにすればいいですか?

sum(n * delta) = 0.5 

ご協力ありがとうございました!

答えて

0

DEOptimパッケージの説明は

がrealvaluedパラメータ ベクトルのrealvalued機能のグローバル 最適化のための差動の進化アルゴリズムを実装しますと言います。

グローバル最適化の概念は制約条件を持たず、制約のない最適化とも呼ばれます。だから申し訳ありませんが、それは直接できません。あなたがそれをやらなければならない場合は、常に「ラグランジュの乗数」ハックを使用できると言っています。これを行うには、

abs((EPC * gammaSum - 2 * abs(deltaSum))/thetaSum) - lambda* (sum(n * delta) - 0.5) 

のようなものを実行する必要があります。

+0

ありがとう、これは理にかなっています。 Rのこの特定の制約付き最適化を解決するために私が取ることのできるアプローチについて別の提案がありますか? –

+0

また、プログラムでLegrange乗数のバージョンを使用するにはどうすればよいですか?言い換えれば、ラムダはこの場合の方程式乗数(終わりまでの手段)ですが、Rには単なる別の未定義変数です。 Rに最小化を続行させ、ラムダを解きほぐし、最終的に最適化された解に到達するにはどうすればよいのでしょうか?言い換えれば、私は紙面上でラグランジュ乗数を行うことができます。この最適化問題の文脈でRにそれをどうやって行なわせるのですか? –

+0

最初の質問については、http://stackoverflow.com/questions/38404309/setting-variables-to-a-value-using-linear-programming-in-r/38404428#38404428にLambdaパラメータを設定する必要があります試行錯誤によって選ばれたので、私はそれを解決策ではなくハックと呼んだのです。 – abhiieor

0

よろしくお願いいたします。ありがとうございます。私は研究し、問題をさまざまな角度から取り組んできました。皆さんに役立つことができるように、みなさんと私の考えを分かち合いたいと思っていました。

私の特定の目的関数で最も明白なのは、deltaSumは変数であり、私はそれを特定の値に制限しようとしています。この制約された値を目的関数に単純に代入することは、これに対する解決策(自明)です。

obj_func_sum_RRRs <- function(n, in_data) { 
#Declare deltaSum, gammaSum, thetaSum, vegaSum, and rhoSum from in_data 

#Impose constraints 
#No dividing by 0: 
     if (thetaSum == 0) { 
      return(Inf) 
     } 

#Specify that regardless of the length of vector of variables to 
#be optimized, we only want our final results to include either 4 or 6 
#nonzero n's in our final optimized solution 

     if (!sum(n[1:length(n)] != 0) == 4 & 
      !sum(n[1:length(n)] != 0) == 6) { 
      return(Inf) 
     } 

    (deltaSum + gammaSum)/thetaSum 
} 

:しかし、私はすでに、目的関数内の変数ではない変数に制約を導入したと仮定すると、私は単に私が課すことを希望する任意の制約のためにInfのを返すループ、すなわちのために実行することができます最適化が理解できる(そして決して最適として選択されない)解である間、Rの0除算はNaNを返し、最適化プロセスを「中断」するため、最初のforループ(thetaSum == 0、return Inf)が機能します。これはちょっとした "ハッキー"です。問題を解決するのに計算上最も効率的な方法ではないかもしれませんが、正直言って私が親しい友人やソフトウェアアーキテクトの達人と開発しているインフラストラクチャ(これは、マイクロソフトのサービスファブリック)、私たちの長距離のバックテストはまだ軽快になっています。この方法論は、実際には、このテクニックを使用して計算上の複雑さがどれほど負担になるかを知るためには、さらにテストを行う必要がありますが、問題にはいくつもの制約を課すことができます...

上記のラグランジュ手法は、紙面上にラムダの解析的な形を派生させてから、コードで実装すればよいのです。アプリケーションでは必ずしも実用的というわけではありませんが、パラメータを最適化するアルゴリズムをコーディングすることは可能ですが、パラメータを最適化しなければならないコーナーに自分自身をペイントすることは悪い考えです元の目的関数の最適化に至る。上記のようにforループを設定するだけの方がいいでしょう。

思考のための食べ物....

+0

FYI、これを実装しました。実際には最適化のソリューションとしてInfを取得します。 thetaSum == 1、Return Infは、私がそれを仮定したように動作しません。私のためにこれに描画ボードに戻って.... –

関連する問題