2016-11-27 83 views
1

我想了解如何使用蒙特卡洛方法来搜索一些系统的极限概率S.如何使用蒙特卡洛方法来搜索极限概率

例如:

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),然后比较概率:

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 - 极限(境)

对于其他州也是如此。

按照这一办法,我可以算的转换数目:

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)

为您的总转换变得足够大。

在您提供的代码中,如果您不断增加变量的大小(并且它确实需要相对较大),则最后四行输出应该会收敛到上面的数字。我希望有所帮助。


在原始代码中有一个错误,阻止了转换到初始状态。这是正确的版本:

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

你知道,我休息一下,自己得出这个结论。谢谢 :) –