Newer
Older
import numpy as np
class TransitionMatrixCalculator:
def __init__(self):
self.size = 15
self.matrix_safe = np.zeros((self.size , self.size ))
self.matrix_normal = np.zeros((self.size , self.size ))
self.matrix_risky = np.zeros((self.size , self.size ))
def compute_transition_matrix(self, layout : list , circle : bool):
# Compute transition matrices for safe, normal, and risky scenarios
self.matrix_safe = self._compute_safe_matrix()
self.matrix_normal, _ = self._compute_normal_matrix(layout, circle)
self.matrix_risky, _ = self._compute_risky_matrix(layout, circle)
return self.matrix_safe, self.matrix_normal, self.matrix_risky
p = np.zeros((self.size ,self.size ))
for k in range(self.size - 1):
if k == 2:
elif k == 9:
p[k,k+5] = 1/2
else:
p[k,k+1] = 1/2
p[k, k] = 1 - np.sum(p[k])
p[self.size -1,self.size -1] = 1
return p
def _compute_normal_matrix(self, layout : list , circle : bool):
# Compute transition matrix for normal scenario
p = np.zeros((self.size ,self.size ))
jail = np.zeros((self.size ,self.size ))
for k in range(self.size - 1):
if k == 2:
elif k == 8:
p[k,k+1] = 1/3
p[k,k+6] = 1/3
elif k == 9:
p[k,k+1] = 1/3
p[k,k+2] = 1/3
p[k, k] = 1 - np.sum(p[k])
for k in range(self.size - 1):
for j in range(self.size - 1):
s = layout[j]
if s == 1:
p[k,0] += p[k,j]/2
p[k,j] /= 2
elif s == 2:
p[k,j-3 if j-3 >= 0 else 0] += p[k,j]/2
p[k,j] /= 2
elif s == 3:
jail[k,j] = p[k,j]/2
p[self.size -1,self.size -1] = 1
return p, jail
def _compute_risky_matrix(self, layout : list , circle : bool):
# Compute transition matrix for risky scenario
p = np.zeros((self.size ,self.size ))
jail = np.zeros((self.size ,self.size ))
for k in range(self.size -1):
if k == 2:
elif k == 7:
p[k,k+1:k+3] = 1/4
p[k,k+7] = 1/4
elif k == 8:
p[k,k+1] = 1/4
p[k,k+6] = 1/4
p[k,0] = 1/4
p[k,k+1] = 1/4
p[k,k+6] = 1/2
elif k == 9:
p[k,k + 5] = 1/4
p[k,0] = 1/4
p[k,1] = 1/4
p[k,k+1] = 1/4
p[k,k+2] = 1/2
elif k == 13:
p[k,k+1] = 1/4
p[k,0] = 1/4
p[k,1] = 1/4
p[k,k+1:k+4] = 1/4
p[k, k] = 1 - np.sum(p[k])
for k in range(self.size - 1):
for j in range(self.size - 1):
s = layout[j]
if s == 1:
p[k,0] += p[k,j]
p[k,j] = 0
elif s == 2:
p[k,j-3 if j-3 >= 0 else 0] += p[k,j]
p[k,j] = 0
elif s == 3:
jail[k,j] = p[k,j]