Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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)