diff --git a/plotting.py b/plotting.py deleted file mode 100644 index 5ce647646ee75ca2845919db6734d4203c2a1ee2..0000000000000000000000000000000000000000 --- a/plotting.py +++ /dev/null @@ -1,41 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -from simulate import Simulate as sim -from tmc import TransitionMatrixCalculator as tmc -from markovDecision import MarkovDecisionSolver as mD - -def get_results(layouts, circle, n_iterations=100): - results_markov = [] - results_safe = [] - results_normal = [] - results_risky = [] - results_random = [] - - for layout in layouts: - # Compute optimal policy - expec, policy = mD(layout, circle).solve() - - # Simulate game using Simulate class - sim_instance = sim(layout, circle) - result_markov = sim_instance.simulate_game(policy, n_iterations) - results_markov.append(result_markov) - - # Simulate with fixed strategies using Simulate class - results_safe.append(sim_instance.simulate_game([1]*15, n_iterations)) - results_normal.append(sim_instance.simulate_game([2]*15, n_iterations)) - results_risky.append(sim_instance.simulate_game([3]*15, n_iterations)) - results_random.append(sim_instance.simulate_game(np.random.randint(1, 4, size=15), n_iterations)) - - return results_markov, results_safe, results_normal, results_risky, results_random - -# Utilisation de la fonction get_results pour obtenir les résultats -layouts = [[0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 1, 0]] # Exemple de layouts à utiliser -circle = True # Exemple de valeur pour circle -results_markov, results_safe, results_normal, results_risky, results_random = get_results(layouts, circle, n_iterations=100) - -# Imprimer les résultats (vous pouvez les enregistrer dans un fichier si nécessaire) -print("Results Markov:", results_markov) -print("Results Safe:", results_safe) -print("Results Normal:", results_normal) -print("Results Risky:", results_risky) -print("Results Random:", results_random) diff --git a/simulate.py b/simulate.py deleted file mode 100644 index bbaa211f8998013a57c5536726a1a0c083a5baf3..0000000000000000000000000000000000000000 --- a/simulate.py +++ /dev/null @@ -1,61 +0,0 @@ -import random as rd -import numpy as np -from tmc import TransitionMatrixCalculator as tmc -from markovDecision import MarkovDecisionSolver as mD - - -class Simulate: - def __init__(self, layout, circle): - self.layout = layout - self.circle = circle - self.tmc_instance = tmc() - self.safe_dice, self.normal_dice, self.risky_dice = self.tmc_instance.compute_transition_matrix(layout, circle) - self.transition_matrices = [self.safe_dice, self.normal_dice, self.risky_dice] - - def simulate_game(self, strategy, n_iterations=10000): - number_turns = [] - for _ in range(n_iterations): - total_turns = 0 - state = 0 # initial state - - while state < len(self.layout) - 1: # until goal state is reached - action = strategy[state] # get action according to strategy - transition_matrix = self.transition_matrices[int(action) - 1] - state = np.random.choice(len(self.layout), p=transition_matrix[state]) - - if self.layout[state] == 3 and action == 2: - total_turns += rd.choice([1, 2], p=[0.5, 0.5]) - elif self.layout[state] == 3 and action == 3: - total_turns += 2 - else: - total_turns += 1 - - number_turns.append(total_turns) - - return np.mean(number_turns) - - def simulate_state(self, strategy, n_iterations=10000): - number_mean = [] - for _ in range(n_iterations): - number_turns = [] - - for state in range(len(self.layout) - 1): - total_turns = 0 - - while state < len(self.layout) - 1: - print("Current state:", state) - print("Transition matrix:", transition_matrix[state]) - state = np.random.choice(len(self.layout), p=transition_matrix[state]) - - if self.layout[state] == 3 and action == 2: - total_turns += rd.choice([1, 2], p=[0.5, 0.5]) - elif self.layout[state] == 3 and action == 3: - total_turns += 2 - else: - total_turns += 1 - - number_turns.append(total_turns) - - number_mean.append(number_turns) - - return np.mean(number_mean, axis=0) diff --git a/simulation.py b/simulation.py new file mode 100644 index 0000000000000000000000000000000000000000..1741debc2017d58f09f24ade194745e2326c59f4 --- /dev/null +++ b/simulation.py @@ -0,0 +1,75 @@ +import numpy as np +import random as rd +import matplotlib.pyplot as plt +from tmc import TransitionMatrixCalculator as tmc +from markovDecision import MarkovDecisionSolver as mD + +class Validation: + def __init__(self): + self.tmc_instance = tmc() + + def simulate_games(self, layout, circle, num_games): + results = [] + + for _ in range(num_games): + result = mD(layout, circle) + # Assuming result is a tuple (costs, path) and you want the last element of 'costs' + results.append(result[0][-1]) # Append the number of turns to reach the goal + + return results + + def compare_strategies(self, layout, circle, num_games): + optimal_results = self.simulate_games(layout, circle, num_games) + + suboptimal_strategies = { + "Dice 1 Only": self.simulate_games(layout, circle, num_games), # Replace with Dice 1 simulation + "Dice 2 Only": self.simulate_games(layout, circle, num_games), # Replace with Dice 2 simulation + "Dice 3 Only": self.simulate_games(layout, circle, num_games), # Replace with Dice 3 simulation + "Mixed Random Strategy": self.simulate_games(layout, circle, num_games), # Replace with mixed random strategy simulation + "Purely Random Choice": self.simulate_games(layout, circle, num_games) # Replace with purely random choice simulation + } + + self.plot_results(optimal_results, suboptimal_strategies) + + def plot_results(self, optimal_results, suboptimal_results): + strategies = ["Optimal Strategy"] + list(suboptimal_results.keys()) + avg_costs = [np.mean(optimal_results)] + [np.mean(suboptimal_results[strategy]) for strategy in suboptimal_results] + + plt.figure(figsize=(10, 6)) + plt.bar(strategies, avg_costs, color=['blue'] + ['orange'] * len(suboptimal_results)) + plt.xlabel("Strategies") + plt.ylabel("Average Cost") + plt.title("Comparison of Strategy Performance") + plt.show() + + def run_validation(self, layout, circle, num_games): + solver = mD(layout, circle) + theoretical_cost, optimal_dice_strategy = solver.solve() + + optimal_results = self.simulate_games(layout, circle, num_games) + optimal_average_cost = np.mean(optimal_results) + + suboptimal_strategies = { + "Dice 1 Only": self.simulate_games(layout, circle, num_games), # Replace with Dice 1 simulation + "Dice 2 Only": self.simulate_games(layout, circle, num_games), # Replace with Dice 2 simulation + "Dice 3 Only": self.simulate_games(layout, circle, num_games), # Replace with Dice 3 simulation + "Mixed Random Strategy": self.simulate_games(layout, circle, num_games), # Replace with mixed random strategy simulation + "Purely Random Choice": self.simulate_games(layout, circle, num_games) # Replace with purely random choice simulation + } + + self.plot_results(optimal_results, suboptimal_strategies) + + print("Theoretical Expected Cost (Value Iteration):", theoretical_cost) + print("Empirical Average Cost (Optimal Strategy):", optimal_average_cost) + + for strategy, results in suboptimal_strategies.items(): + avg_cost = np.mean(results) + print(f"Empirical Average Cost ({strategy}):", avg_cost) + +# Exemple d'utilisation de la classe Validation +layout = [0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 1, 0] +circle = True +num_games = 1000 + +validation = Validation() +validation.run_validation(layout, circle, num_games)