Skip to content
Extraits de code Groupes Projets
markov.py.py 2,82 ko
Newer Older
  • Learn to ignore specific revisions
  • Adrien Payen's avatar
    Adrien Payen a validé
    import numpy as np
    from tmc import TransitionMatrixCalculator as tmc
    
    class MarkovDecisionSolver:
        def __init__(self, layout: list, circle: bool):
            self.Numberk = 15
            self.tmc_instance = tmc()
            self.safe_dice = self.tmc_instance._compute_safe_matrix()
            self.normal_dice = self.tmc_instance._compute_normal_matrix(layout, circle)
            self.risky_dice = self.tmc_instance._compute_risky_matrix(layout, circle)
            self.jail = [i for i, x in enumerate(layout) if x == 3]
            self.Dice = np.zeros(self.Numberk)
    
        def solve(self):
            ValueI = np.zeros(self.Numberk)
            ValueINew = np.array([8.5, 7.5, 6.5, 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, 1, 0])
    
            i = 0
            while i < 1000:  # Limiter le nombre d'itérations pour éviter une boucle infinie
                i += 1
    
                # Copiez la valeur actuelle dans ValueI
                np.copyto(ValueI, ValueINew)
    
                # Mettez à jour les valeurs de ValueINew pour chaque état
                for k in range(self.Numberk - 1):
                    ValueINew[k] = 1 + min(
                        np.dot(self.safe_dice[k], ValueI),
                        np.dot(self.normal_dice[k], ValueI) + np.sum(self.normal_dice[k][self.jail]),
                        np.dot(self.risky_dice[k], ValueI) + np.sum(self.risky_dice[k][self.jail])
                    )
    
                ValueINew[self.Numberk - 1] = min(
                    np.dot(self.safe_dice[self.Numberk - 1], ValueI),
                    np.dot(self.normal_dice[self.Numberk - 1], ValueI),
                    np.dot(self.risky_dice[self.Numberk - 1], ValueI)
                )
    
                # Calculer les actions optimales (indice de l'action + 1)
                for k in range(self.Numberk):
                    self.Dice[k] = np.argmin([
                        np.dot(self.safe_dice[k], ValueI),
                        np.dot(self.normal_dice[k], ValueI) + np.sum(self.normal_dice[k][self.jail]),
                        np.dot(self.risky_dice[k], ValueI) + np.sum(self.risky_dice[k][self.jail]),
                    ]) + 1
    
                # Vérifiez la convergence en utilisant une petite tolérance
                if np.sum(np.abs(ValueINew - ValueI)) < 1e-9:
                    break
    
            # Retourne les valeurs finales de ValueINew et les actions optimales (Dice)
            return ValueINew, self.Dice
    
    
    def markovDecision(layout : list, circle : bool):
        solver = MarkovDecisionSolver(layout, circle)
        return solver.solve()
    
    
    # Exemple d'utilisation de la fonction markovDecision avec les paramètres layout et circle
    layout = [0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 1, 0]
    
    
    # Résolution du problème avec différents modes de jeu
    result_false = markovDecision(layout, circle=False)
    print("\nWin as soon as land on or overstep the final square")
    print(result_false)
    
    result_true = markovDecision(layout, circle=True)
    print("\nStopping on the square to win")
    print(result_true)