Prediccion de Jugadas en Piedra, Papel o Tijeras usando Cadenas de Markov
Este proyecto implementa un sistema de prediccion de jugadas para el juego Piedra, Papel o Tijeras utilizando cadenas de Markov. El sistema analiza el historial de jugadas del usuario para predecir su siguiente movimiento.
Estructura del Proyecto
El proyecto esta organizado en tres archivos principales:
model_rps_computed.py: Implementa el modelo de cadena de Markovprobabilities_rps_computed.py: Calcula las probabilidades de transicionfile_handler.py: Gestiona el almacenamiento y lectura del historial de jugadas
Implementacion
Modelo de Markov (model_rps_computed.py)
El modelo utiliza la biblioteca pomegranate para implementar una cadena de Markov de orden 1. Las caracteristicas principales son:
-
Representacion de jugadas:
- Piedra (Rock) = 0
- Papel (Paper) = 1
- Tijeras (Scissors) = 2
-
El modelo se inicializa con datos de entrenamiento basicos y se actualiza con el historial de jugadas del usuario.
-
Utiliza tensores de PyTorch para el manejo eficiente de los datos.
Analisis de Probabilidades (probabilities_rps_computed.py)
La clase RPSProbabilityAnalyzer proporciona metodos para analizar las probabilidades de transicion:
transition_probability: Calcula la probabilidad de transicion entre dos jugadasmax_post_action_probability: Obtiene la maxima probabilidad de transicion desde una jugadamost_likely_post_action: Predice la jugada mas probable despues de una jugada dadamost_likely_initial_action: Determina la jugada inicial mas probable
Gestion de Datos (file_handler.py)
El UserActionsFileHandler maneja la persistencia de datos:
- Almacena el historial de jugadas en un archivo de texto
- Lee el historial para entrenar el modelo
- Maneja la creacion del directorio y archivo si no existen
Funcionamiento
- El sistema se inicializa con datos de entrenamiento basicos
- Se cargan las jugadas historicas del usuario
- El modelo se entrena con estos datos
- Se pueden realizar predicciones sobre:
- La probabilidad de transicion entre jugadas
- La jugada mas probable despues de una jugada especifica
- La jugada inicial mas probable
Ejemplo de Uso
# Obtener probabilidad de transicion
prob = analyzer.transition_probability(PAPER, PAPER)
# Obtener la jugada mas probable despues de Papel
next_action = analyzer.most_likely_post_action(PAPER)
# Obtener la probabilidad maxima despues de una jugada
max_prob = analyzer.max_post_action_probability(PAPER)
Instalacion
Es necesario el uso del paquete Pomegranate:
Pomegranate is a python package which implements fast, efficient, and extremely flexible probabilistic models ranging from probability distributions to Bayesian networks to mixtures of hidden Markov models.
python -m venv venv
source venv/bin/activate
Instalar la version estricta de pomegranate v1.0.4:
pip install -r requirements.txt
o
pip install pomegranate
Uso
rps% python3 RPS_spock_lizard.py
Pick a choice (ROCK[0], PAPER[1], SCISSORS[2]): 1
Computer picked SCISSORS.
SCISSORS wins PAPER. You lost!
Another round? (y/n): y
Pick a choice (ROCK[0], PAPER[1], SCISSORS[2]): 0
Computer picked ROCK.
User and computer picked ROCK. Draw game!
Another round? (y/n): y
Pick a choice (ROCK[0], PAPER[1], SCISSORS[2]): 1
Computer picked ROCK.
PAPER wins ROCK. You win!
Another round? (y/n): n
['PAPER', 'PAPER', 'ROCK', 'SCISSORS', 'SCISSORS', 'SCISSORS', 'PAPER']
# historico de partidas guardadas en el fichero user_actions_history.txt
[1, 2, 0, 1, 2, 0]
...