C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

マルコフ連鎖の特定の時間における状態の確率を見つけるためのC++プログラム


この記事では、マルコフ連鎖の特定の期間に初期状態から最終状態に到達する確率を見つけるプログラムについて説明します。

マルコフ連鎖は、さまざまな状態と、ある状態から別の状態に移行する関連する確率で構成されるランダムプロセスです。ある状態から別の状態に移行するには、単位時間がかかります。

マルコフ連鎖は有向グラフで表すことができます。この問題を解決するために、与えられたマルコフ連鎖から行列を作ることができます。そのマトリックスでは、位置(a、b)の要素は、状態「a」から状態「b」に移行する確率を表します。

これは、式を使用した確率分布への再帰的アプローチに任せます

P(t) = Matrix * P(t-1)

#include <bits/stdc++.h>
using namespace std;
#define float_vec vector<float>
//to multiply two given matrix
vector<float_vec > multiply(vector<float_vec > A, vector<float_vec > B, int N) {
   vector<float_vec > C(N, float_vec(N, 0));
   for (int i = 0; i < N; ++i)
      for (int j = 0; j < N; ++j)
         for (int k = 0; k < N; ++k)
            C[i][j] += A[i][k] * B[k][j];
   return C;
}
//to calculate power of matrix
vector<float_vec > matrix_power(vector<float_vec > M, int p, int n) {
   vector<float_vec > A(n, float_vec(n, 0));
   for (int i = 0; i < n; ++i)
      A[i][i] = 1;
   while (p) {
      if (p % 2)
         A = multiply(A, M, n);
      M = multiply(M, M, n);
      p /= 2;
   }
   return A;
}
//to calculate probability of reaching from initial to final
float calc_prob(vector<float_vec > M, int N, int F, int S, int T) {
   vector<float_vec > matrix_t = matrix_power(M, T, N);
   return matrix_t[F - 1][S - 1];
}
int main() {
   vector<float_vec > G{
      { 0, 0.08, 0, 0, 0, 0 },
      { 0.33, 0, 0, 0, 0, 0.62 },
      { 0, 0.06, 0, 0, 0, 0 },
      { 0.77, 0, 0.63, 0, 0, 0 },
      { 0, 0, 0, 0.65, 0, 0.38 },
      { 0, 0.85, 0.37, 0.35, 1.0, 0 }
   };
   //number of available states
   int N = 6;
   int S = 4, F = 2, T = 100;
   cout << "Probability of reaching: " << F << " in time " << T << " after starting from: " << S << " is " << calc_prob(G, N, F, S, T);
   return 0;
}

出力

Probability of reaching: 2 in time 100 after starting from: 4 is 0.271464

  1. 与えられた整数から可能な最大の集計を見つけるためのC++プログラム

    2つの整数nとmが与えられ、4つの整数{ai、bi、ci、di}を含む整数のkタプルがあるとします。 4つの配列a、b、c、dが与えられ、a[i]はi番目のタプルの値を示します。ここで、n個の正の整数と1 <=dp [1]

  2. 与えられたグラフのブリッジエッジの数を見つけるためのC++プログラム

    n個の頂点とm個のエッジを含む重み付けされていない無向グラフが与えられたとします。グラフのブリッジエッジは、グラフを削除するとグラフが切断されるエッジです。与えられたグラフでそのようなグラフの数を見つける必要があります。グラフには、平行なエッジや自己ループは含まれていません。 したがって、入力がn =5、m =6、edges ={{1、2}、{1、3}、{2、3}、{2、4}、{2、5}、{3 、5}}の場合、出力は1になります。 グラフには、{2、4}のブリッジエッジが1つだけ含まれています。 これを解決するには、次の手順に従います- mSize := 100 Define an