Подсчёт количества поглощающих состояний и построение матриц переходов марковской цепи — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(не показаны 22 промежуточные версии 2 участников)
Строка 1: Строка 1:
 
==Подсчет количества поглощащих состояний==
 
==Подсчет количества поглощащих состояний==
Пусть <tex>\mathtt{transition}</tex> - массив переходов марковской цепи, где <tex>\mathtt{transition[i][2]}</tex> - вероятность перехода из состояния  <tex>\mathtt{transition[i][0}</tex> в <tex>\mathtt{transition[i][1]}</tex>.
+
Для хранения переходов марковской цепи создадим структуру <tex> \mathtt{jump}</tex>.
Тогда, по определению поглощающего состояния, если <tex>\mathtt{j}</tex> - поглощающее состояние, то <tex>\mathtt{transition[j][2] = 1}</tex>. По этому признаку помно определить все поглощающие состояния в цепи.
+
 
 +
Введем <tex>\mathtt{transition}:</tex> <tex> \mathtt{jump}[\mathtt{m}] </tex>, где <tex>\mathtt{transition}[\mathtt{i}]\mathtt{.prob}</tex> вероятность перехода из состояния  <tex>\mathtt{transition}[\mathtt{i}]\mathtt{.from}</tex> в <tex>\mathtt{transition}[\mathtt{i}]\mathtt{.to}</tex>.
 +
 
 +
Тогда, по определению поглощающего состояния, если <tex>\mathtt{j}</tex> поглощающее состояние, то <tex>\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1</tex>. По этому признаку можно определить все поглощающие состояния в цепи.
  
 
===Псевдокод===
 
===Псевдокод===
*<tex>\mathtt{absorbing}: boolean:[\mathtt{n}]</tex> - массив состояний. Если i - посглощающее состояние absorbing[i] = true
+
*<tex>\mathtt{absorbing}[\mathtt{n}]</tex> массив состояний. Если <tex>\mathtt{i}</tex> — посглощающее состояние <tex>\mathtt{absorbing}[\mathtt{i}] = true</tex> иначе <tex>\mathtt{absorbing}[\mathtt{i}] = false</tex>
*<tex>\mathtt{n}</tex> - количество состояний
+
*<tex>\mathtt{n}</tex> количество состояний
*<tex>\mathtt{m}</tex> - количество переходов
+
*<tex>\mathtt{m}</tex> количество переходов
  
  '''function''' findAbsorbings(transition: '''int'''[m][2]):
+
  '''boolean[]''' findAbsorbings(transition: '''jump'''[m]):
     '''boolean''' absorbing[m]
+
     '''boolean''' absorbing[n]  
     '''for''' i = 0 '''to''' m - 1
+
      '''if''' transition[i][0] == transition[i][1] '''and''' transition[i][2] == 1
+
     '''for''' '''jump''' i '''in''' transition  
        absorbing[transition[i][0]] = ''true''
+
      absorbing[i.from] = i.from == i.to '''and''' i.prob == 1
 +
 
     '''return''' absorbing
 
     '''return''' absorbing
  
Строка 18: Строка 22:
 
Cоздадим сначала массив <tex>\mathtt{position}</tex> где <tex>\mathtt{i}</tex>-ый элемент указывает под каким номером будет находиться <tex>\mathtt{i}</tex>-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.
 
Cоздадим сначала массив <tex>\mathtt{position}</tex> где <tex>\mathtt{i}</tex>-ый элемент указывает под каким номером будет находиться <tex>\mathtt{i}</tex>-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.
 
===Псевдокод===
 
===Псевдокод===
*<tex>\mathtt{position[n]}</tex> - массив нумерации состояний относительно существенной/ несущественной матрицы.
+
*<tex>\mathtt{position}[\mathtt{n}]</tex> массив нумерации состояний относительно существенной/несущественной матрицы.
*<tex>\mathtt{Q}</tex> - матрица перехода мужду несущественными состояниями.
+
*<tex>\mathtt{Q}</tex> матрица перехода мужду несущественными состояниями.
*<tex>\mathtt{R}</tex> - матрица из несущественных состояний в поглощающие.
+
*<tex>\mathtt{R}</tex> матрица из несущественных состояний в поглощающие.
  
  '''procedure''' buildTransitionMatrix()
+
  '''float[][]''' buildTransitionMatrix(absorbing: '''boolean'''[n], transition: '''jump'''[m]):
     count_q = 0
+
     '''int''' count_q = 0
     count_r = 0
+
     '''int''' count_r = 0
 +
    '''float''' Q[n][n]
 +
    '''float''' R[n][n]
 +
    '''int''' position[n]
 +
 
     '''for''' i = 0 '''to''' n - 1
 
     '''for''' i = 0 '''to''' n - 1
 
       '''if''' absorbing[i]
 
       '''if''' absorbing[i]
Строка 32: Строка 40:
 
           position[i] = count_q
 
           position[i] = count_q
 
           count_q++
 
           count_q++
     '''for''' i = 0 '''to''' m - 1
+
       '''if''' absorbing[transition[i][1]]
+
     '''for''' '''jump''' i '''in''' transition
           '''if''' !absorbing[transition[i][0]]
+
       '''if''' absorbing[i.to]
             R[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]
+
           '''if''' !absorbing[i.from]
 +
             R[position[i.from]][position[i.to]] = i.prob
 
       '''else'''
 
       '''else'''
           Q[position[transition[i][0]]][position[transition[i][1]]] = transition[i][2]
+
           Q[position[i.from]][position[i.to]] = i.prob
 +
 +
    '''return''' Q
  
 +
== См. также ==
 +
*[[Марковская цепь]]
 +
*[[Расчет вероятности поглощения в состоянии]]
 +
*[[Математическое ожидание времени поглощения]]
  
 
== Источники информации ==
 
== Источники информации ==
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia: Absorbing Markov chain]
+
*[https://en.wikipedia.org/wiki/Absorbing_Markov_chain Wikipedia Absorbing Markov chain]
  
 
[[Категория:Дискретная математика и алгоритмы]]
 
[[Категория:Дискретная математика и алгоритмы]]
 
[[Категория: Марковские цепи ]]
 
[[Категория: Марковские цепи ]]

Версия 23:48, 31 января 2019

Подсчет количества поглощащих состояний

Для хранения переходов марковской цепи создадим структуру [math] \mathtt{jump}[/math].

Введем [math]\mathtt{transition}:[/math] [math] \mathtt{jump}[\mathtt{m}] [/math], где [math]\mathtt{transition}[\mathtt{i}]\mathtt{.prob}[/math] — вероятность перехода из состояния [math]\mathtt{transition}[\mathtt{i}]\mathtt{.from}[/math] в [math]\mathtt{transition}[\mathtt{i}]\mathtt{.to}[/math].

Тогда, по определению поглощающего состояния, если [math]\mathtt{j}[/math] — поглощающее состояние, то [math]\mathtt{transition}[\mathtt{j}]\mathtt{.prob} = 1[/math]. По этому признаку можно определить все поглощающие состояния в цепи.

Псевдокод

  • [math]\mathtt{absorbing}[\mathtt{n}][/math] — массив состояний. Если [math]\mathtt{i}[/math] — посглощающее состояние [math]\mathtt{absorbing}[\mathtt{i}] = true[/math] иначе [math]\mathtt{absorbing}[\mathtt{i}] = false[/math]
  • [math]\mathtt{n}[/math] — количество состояний
  • [math]\mathtt{m}[/math] — количество переходов
boolean[] findAbsorbings(transition: jump[m]):
   boolean absorbing[n] 

   for jump i in transition 
      absorbing[i.from] = i.from == i.to and i.prob == 1

   return absorbing

Построение матриц переходов

Cоздадим сначала массив [math]\mathtt{position}[/math] где [math]\mathtt{i}[/math]-ый элемент указывает под каким номером будет находиться [math]\mathtt{i}[/math]-ое состояние среди существенных если оно существенное или несущественных в обратном случае, и заполним эти массивы.

Псевдокод

  • [math]\mathtt{position}[\mathtt{n}][/math] — массив нумерации состояний относительно существенной/несущественной матрицы.
  • [math]\mathtt{Q}[/math] — матрица перехода мужду несущественными состояниями.
  • [math]\mathtt{R}[/math] — матрица из несущественных состояний в поглощающие.
float[][] buildTransitionMatrix(absorbing: boolean[n], transition: jump[m]):
   int count_q = 0
   int count_r = 0
   float Q[n][n]
   float R[n][n]
   int position[n]

   for i = 0 to n - 1
      if absorbing[i]
         position[i] = count_r
         count_r++
      else 
         position[i] = count_q
         count_q++

   for jump i in transition
      if absorbing[i.to]
         if !absorbing[i.from]
            R[position[i.from]][position[i.to]] = i.prob
      else
         Q[position[i.from]][position[i.to]] = i.prob

   return Q

См. также

Источники информации