【问题标题】:How to use the method of Monte Carlo to search for the limit probabilities如何使用蒙特卡罗方法搜索极限概率
【发布时间】:2017-04-11 08:42:32
【问题描述】:

我想了解如何使用蒙特卡罗方法来搜索某个系统 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

我很高兴听到有关如何解决此问题的提示。

【问题讨论】:

  • 你能澄清你的问题吗?你想解决S x = x,即找到固定设置吗?

标签: c# algorithm statistics montecarlo


【解决方案1】:

在实际意义上,找到此类系统极限的最佳方法是重复对矩阵进行平方,直到条目收敛。这是有效的,因为它是一个随机矩阵(每行之和等于 1)。当我尝试它时,我得到了答案:

S0        S1        S2        S3
0.1939252 0.2593458 0.3294393 0.2172897

它给出了您将处于特定状态的平均概率。

要使用 Monte Carlo 方法,您应该像之前那样生成随机数并记录转换次数。那么你处于某种状态的平均概率是

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

随着您的 Total Transitions 变得足够大。

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


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

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();
    }

【讨论】:

  • 你知道,我休息了一下,自己得出了这个结论。谢谢你:)
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 2020-01-26
  • 2018-12-25
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多