2012-01-28 9 views
3

Rでメタヒューリスティックアルゴリズムを実装する方法については、無料のデータを使用したサンプルを含む良いチュートリアルをどこで見つけることができますか?Rのメタヒューリスティックアルゴリズムの実装R

私はこれを行う方法について多くのリソースを見つけたので、これを求めていますが、私はそれを実装する理論から移っていく上で大きな問題に直面しています。

Book Essentials of Metaheuristics (by Professor Sean Luke)

は例を拾いなど、しかし、限られたプログラミングの背景とアルゴリズムとの経験のない人のために、それはデータといくつかの「実例」なしでそれらを実装するのは難しい、始めるための素晴らしい本ですメタ戦略(ページ16)のブックエッセンシャルから:

Algorithm 5 Steepest Ascent Hill-Climbing 
1: n ← number of tweaks desired to sample the gradient 
2: S ← some initial candidate solution 
3: repeat 
4: R ← Tweak(Copy(S)) 
5: for n − 1 times do 
6: W ← Tweak(Copy(S)) 
7: if Quality(W) > Quality(R) then 
8: R ← W 
9: if Quality(R) > Quality(S) then 
10: S ← R 
11: until S is the ideal solution or we have run out of time 
12: return S 

私は後に実際のデータを使用して私の例を与えるだろう、何かを持っていると思います。 私は何かを探していますlike this

特定のアルゴリズム(GAなど)に関する多くの質問がありましたが、既に存在する質問を複製しているかもしれませんが、特にこの質問は見つかりませんでしたが、重複している場合は警告してください。

他の言語、たとえばPythonなども役立ちます(たとえばRに似た言語)。

+2

「数値メソッドと最適化入門」に関わるRパッケージは役に立ちますか? http://www.portfolioprobe.com/2011/10/27/introduction-to-numerical-methods-and-optimization-in-finance/ –

+0

私は@PatrickBurnsを見ていきます。実際のデータを使用するものは、私にとって大きな助けとなっています。ありがとう! –

答えて

5

私は、フィールドとして、メタ戦略に精通していないんだけど、あなたはそれを与えてくれたように擬似コードは、実際にRの構文にかなり容易に変換されます。今すぐ

# I never metaheuristic I didn't like 
metah <- function(S, quality, tweak, n, outer.limit, threshold) 
{ 
    outer.n <- 0 
    repeat { 
     outer.n <- outer.n + 1 
     R <- tweak(S) 
     for(i in seq_len(n - 1)) 
     { 
      W <- tweak(S) 
      if(quality(W) > quality(R)) 
       R <- W 
     } 
     if(quality(R) > quality(S)) 
      S <- R 
     if(quality(S) >= threshold || outer.n >= outer.limit) 
      break 
    } 
    S 
} 

あなたが適した機能を提供するだけですqualityおよびtweak

例えば、線形回帰に適合させたいとします。この場合、我々は応答のベクトルyとベクトルXの行列を持っています。 Sの解は、各ステップでの候補係数ベクトルであり、「品質」は、誤差損失の二乗です。sum((y - yhat)^2)です。ここでは、より低いの品質が良いことに注意してください。

tweakについては、現在の解決策Sからの摂動の正規分布を使用し、ユーザー指定の共分散行列を使用することがあります。

これは、さらなる改善があるかもしれない

require(MASS) # for mvrnorm 

quality <- function(S, y, X) 
sum((y - X %*% S)^2) 

tweak <- function(S, sigma=rep(1, length(s)) 
S + mvrnorm(length(S), 0, sigma) 

metah <- function(y, X, quality, tweak, n, outer.limit, threshold) 
{ 
    outer.n <- 0 
    S <- rep(1, ncol(X)) 
    repeat { 
     outer.n <- outer.n + 1 
     R <- tweak(S) 
     for(i in seq_len(n - 1)) 
     { 
      W <- tweak(S) 
      if(quality(W, y, X) < quality(R, y, X)) # note reversed comparison! 
       R <- W 
     } 
     if(quality(R, y, X) < quality(S, y, X)) 
      S <- R 
     if(quality(S) <= threshold || outer.n >= outer.limit) 
      break 
    } 
    S 
} 

として最大符号化することができる。

  1. *apply

  2. ひねりの分布を聞かせを用いてベクトル化コードと内部ループfor(i in ...)を交換上記のようにハードコーディングするのではなく、ソリューションの特性に応じて変化します(特に、sigmaはあなたのX変数のスケールに基づいて変化しなければならない)

  3. は、各候補解は前の反復から移動したどの程度まで、例えば、最小に向かって進捗状況の点でthresholdを発現します。

関連する問題