2016-11-27 3 views
1

を検索するためのモンテカルロ法を使用する方法:私は例えば、いくつかのシステムS.</p> <p>の限界確率を検索するためにモンテカルロ法を使用する方法を理解したいの限界確率

リミット(ボーダー)

-

if x 
    0 <= x < 0.1 => S0 -> S0 
    0.1 <= x < 0.9 => S0 -> S1 
    0.9 <= x < 0.9 => S0 -> S2 
    0.9 <= x < 0.9 => S0 -> S3 
    0.9 <= x < 1 => S0 -> S4 

S4:私は方法を理解したよう

S0 S1 S2 S3 
S0 0.1 0.9 0 0 
S1 0 0.2 0.3 0.5 
S2 0.2 0.1 0.5 0.2 
S3 0.5 0 0.4 0.1 

は、我々はいくつかの数(X)を生成し、確率を比較する必要があります

他の州でも同様です。

私は遷移の数を数えることができるこの方法を次のとおりです。私はこの問題を解決するために何をすべきかのヒントを聞いて喜んでいるでしょう

static double[] SimpleMonte(double[][] a, int iter = 1) 
    { 
     var n = a.GetLength(0); 

     var p = 
      a 
      .Select(x => x.Select((_, i) => x.Take(i + 1).Sum()).ToArray()) 
      .ToArray(); 

     Random rand = new Random(); 

     double[] X = new double[n]; 
     for (int x = 0; x < n; x++) 
     { 
      double count = 0; 
      for (int i = 0; i < iter; i++) 
      { 
       int row = x; 
       bool notG = true; 
       Console.Write("{0} -> ", row); 
       while (notG) 
       { 

        var e = rand.NextDouble(); 
        Console.Write("({0})", Math.Round(e, 2)); 
        bool ch = false; 
        for (int j = 0; j < n - 1; j++) 
        { 
         if (p[row][j] <= e && e < p[row][j + 1]) 
         { 
          row = j + 1; 
          ch = true; 
          break; 
         } 
        } 
        if (!ch) 
         notG = false; 
        else 
        { 
         Console.Write("{0} -> ", row); 
         count++; 
        } 
       } 
       Console.WriteLine(); 
      } 
      X[x] = count/iter; 
     } 
     return X; 
    } 

https://dotnetfiddle.net/nJF5sm

+0

問題を明確にすることはできますか?あなたは 'S x = x'を解く、つまり静止した設定を見つけたいですか? –

答えて

2

実用的な意味では、そのようなシステムの限界を見つける最良の方法は、エントリーが収束するまでマトリックスの二乗を繰り返すことです。これは、確率行列(各行の合計が1に等しい)であるために機能します。私が試したとき、私は答えを得ました:

S0  S1  S2  S3 
0.1939252 0.2593458 0.3294393 0.2172897 

あなたが特定の状態になる平均確率を示します。

モンテカルロ法を使用するには、実行したように乱数を生成し、トランジションのカウントを保持する必要があります。そして、あなたが特定の状態にいる平均確率はあなたの総トランジションなど

(Amount of Transitions to State S)/(Total Transitions)

が十分に大きくなっています。

iter変数のサイズを引き続き大きくする必要がある場合(そしてそれは比較的大きくする必要があります)、出力の最後の4行は上記の数値に収束する必要があります。私はそれが助けて欲しい


元のコードでは、初期状態への移行を妨げる間違いがありました。正しいバージョン:

static double[] SimpleMonte(double[][] a, int iter = 10000) 
    { 
     var n = a.GetLength(0); 

     var p = 
      a 
      .Select(x => x.Select((_, i) => x.Take(i + 1).Sum()).ToArray()) 
      .ToArray(); 

     Random rand = new Random(); 
     double[] X = new double[n]; 
     int row = rand.Next(n); 
     for (int i = 0; i < iter; i++) 
     { 
      var e = rand.NextDouble(); 
      X[row]++; 
      if (e < p[row][0]) 
       row = 0; 
      else 
       for (int j = 0; j < n - 1; j++) 
       { 
        if (p[row][j] <= e && e < p[row][j + 1]) 
        { 
         row = j + 1; 
         break; 
        } 
       } 

     } 
     return X.Select(x => x/iter).ToArray(); 
    } 
+0

あなたは知っている、私は休憩を取って、この結論に自分自身来た。ありがとうございました :) –

関連する問題