Skip to content
Extraits de code Groupes Projets
tmc.py 4,49 ko
Newer Older
  • Learn to ignore specific revisions
  • import numpy as np
    
    class TransitionMatrixCalculator:
        def __init__(self):
    
    Adrien Payen's avatar
    Adrien Payen a validé
            # Initialize the size of the transition matrices
    
            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 ))
    
    Adrien Payen's avatar
    Adrien Payen a validé
        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
    
        def _compute_safe_matrix(self):
    
    Adrien Payen's avatar
    Adrien Payen a validé
            # Compute transition matrix for safe scenario
    
            p = np.zeros((self.size ,self.size ))
            for k in range(self.size  - 1):
                if k == 2:
    
    Adrien Payen's avatar
    Adrien Payen a validé
                    p[k,k+1] = 1/4 
                    p[k,k+8] = 1/4  
    
                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
    
    
    Adrien Payen's avatar
    Adrien Payen a validé
        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:
    
    Adrien Payen's avatar
    Adrien Payen a validé
                    p[k,k+1:k+3] = 1/6  
                    p[k,k+8:k+10] = 1/6 
    
                elif k == 8:
                    p[k,k+1] = 1/3
                    p[k,k+6] = 1/3
                elif k == 9:
    
                    if circle:
    
                        p[k,k+5] = 1/3
                        p[k,0] = 1/3
    
                        p[k,k+5] = 2/3
                elif k == 13:
    
                    if circle:
    
                        p[k,k+1] = 1/3
                        p[k,0] = 1/3
    
                    else:
    
                        p[k,k+1] = 2/3
    
                else:
    
                    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:
    
                        if j != 0:
    
                            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
    
    Adrien Payen's avatar
    Adrien Payen a validé
        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:
    
    Adrien Payen's avatar
    Adrien Payen a validé
                    p[k,k+1:k+4] = 1/8
                    p[k,k+8:k+11] = 1/8
    
                elif k == 7:
                    p[k,k+1:k+3] = 1/4
                    p[k,k+7] = 1/4
                elif k == 8:
    
                    if circle:
    
                        p[k,k+1] = 1/4
                        p[k,k+6] = 1/4
                        p[k,0] = 1/4
    
                    else:
    
                        p[k,k+1] = 1/4
                        p[k,k+6] = 1/2
                elif k == 9:
    
                    if circle:
    
                        p[k,k + 5] = 1/4
                        p[k,0] = 1/4
                        p[k,1] = 1/4
    
                    else:
    
                        p[k,k+5] = 3/4
                elif k == 12:
    
                    if circle:
    
                        p[k,k+1:k+3] = 1/4
                        p[k,0] = 1/4
    
                    else:
    
                        p[k,k+1] = 1/4
                        p[k,k+2] = 1/2
                elif k == 13:
    
                    if circle:
    
                        p[k,k+1] = 1/4
                        p[k,0] = 1/4
                        p[k,1] = 1/4
    
                    else:
    
                        p[k,self.size -1] = 3/4
    
                else:
    
                    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:
    
                        if j != 0:
    
                            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]
    
            p[self.size -1,self.size-1] = 1
    
    Adrien Payen's avatar
    Adrien Payen a validé
            return p, jail