Skip to content

Algoritmo reproductivo que trata de encontrar la solución de un código del juego mastermind.

Notifications You must be signed in to change notification settings

Pistacho14/mastermind

Repository files navigation

Mastermind

Introducción

Este proyecto ha sido creado por Xián Morales y Pablo González, dos alumnos del ciclo de 1º de DAM en centro escolar IES de Teis. Este software crea generaciones de individuos con el objetivo de solucionar un código secreto creado con las reglas del juego Mastermind, que consiste en tratar de adivinar un código secreto compuesto por 4 bolas de colores (a elegir entre 6 o mas) mientras un jugador trata de adivinarlo en un máximo de 14 intentos. En este caso el jugador es reemplazado por el algoritmo genético.

Manual

Requisitos

Los requisitos para el funcionamiento son

Instalación

Linux

Para instalar los requisitos en Linux sigue los siguientes pasos:

Clona el repositorio de github (en caso de no tener Git, debes instalarlo).

git clone https://github.com/Pistacho14/mastermind.git

Instala Python:

$ sudo apt install python3

Instala uv:

curl -LsSf https://astral.sh/uv/install.sh | less

Instala las dependencias:

uv sync --all-groups

Inicia el entorno virtual:

source venv/bin/activate

Windows

Para instalar los requisitos en Windows sigue los siguientes pasos:

Clona el repositorio de github (en caso de no tener Git, debes instalarlo).

git clone https://github.com/Pistacho14/mastermind.git

Para instalar Python puedes instalarlo desde la web de Python y seguir los pasos de la instalación.

Instala uv:

powershell -c "irm https://astral.sh/uv/install.ps1 | more"

Instala las dependencias:

uv sync --all-groups

Instala el entorno virtual:

.\.venv\Scripts\activate.ps1

Uso

Para utilizar este software el usuario debe introducir uno de estos dos comandos:

uv run .\benchmark.py

o bien:

uv run .\benchmark.py

Metodología

Este software se ha desarrollado utilizando TDD (Test Driven Development) que se basa en el uso de casos test para desarrollar los módulos y así minimizar los defectos introducidos en el código. El uso de este método de desarrollo nos ayudó a crear los módulos de forma mas eficiente a pesar de que en algunos de ellos no era posible la implementación debido a su naturaleza aleatoria.

A parte de la TDD la otra metodología utilizada fue el desarrollo en cascada, desarrollando los módulos nuevos de forma lineal y en el orden en el que eran necesarios para la evolución del software. Al principio pensamos en intentar adoptar una metodología prototipada pero creímos que no encajaba en este proyecto ya que el prototipo sería practicamente idéntico al producto final.

Descripción técnica

Diagrama de casos de uso

diagrama de casos de uso

  • Ajustar parámetros: el usuario puede ajustar los parámetros en la el archivo constants.py para modificar el comportamiento del software.
  • Iniciar el software: el usuario puede iniciar el software siguiendo los pasos descritos en el apartado uso.
  • Ver el resultado: el usuario puede comprobar el resultado y los intentos en la consola.
  • Analizar las gráficas: el usuario puede lanzar benchmark y analizar las gráficas para analizar el rendimiento de su configuración.

Arquitectura de la aplicación

arquitectura

El programa consiste de un gran módulo central mastermind, el cual llama a casi todas las demás funciones. El otro componente a destacar es constants que utilizamos para almacenar las constantes. Esto se hizo con el propósito de poder cambiar con facilidad los parámetros mas importantes y hacer el software mas facilmente configurable para el usuario o desarrollador.

Diagrama de dependencias

diagrama de dependencias

Diseño

Al comienzo del desarrollo, tuvimos que elegir que método de reproducción sería el mas eficiente para la tarea a la que someteríamos a los individuos. Para no favorecer unicamente la explotación decidimos dejar de lado el método elitista debido al riesgo de estancamiento al crear individuos muy similares entre si.

Terminamos por decantarnos por la reproducción sexual mixta mediante selección por ruleta que favorece a los individuos con mejores puntuaciones pero da una posibilidad a los individuos con peores puntuaciones de poder reproducirse. Aun así elegimos reproducir solo una parte de la población y conservar otra, dando lugar a algo de exploración.

Modulos

genes_generator.py: Selecciona entre seis alelos diferentes y genera un gen aleatorio con un tamaño máximo de cuatro colores que se pueden repetir.

initial_population_generator.py: Crea una generación inicial de 100 individuos aleatorios.

check_fitness.py: Calcula el fitness de cada gen.

fitness_rank_assigner.py: Asigna un ranking a cada gen de la población.

population_sorter.py: Crea el diccionario con los genes de la población y sus respectivos rankings.

roulette_selection.py: Elige mediante una ruleta ponderada parta seleccionar los individuos que se van a reproducir.

offspring_generator: Selecciona los padres y las madres y crea la descendencia.

reproduction.py: Con los padres y las madres se reproducen se reproducen nuevos individuos.

mutation.py: Da una probabilidad de mutar a los hijos.

population_mixer.py Crea la nueva generación con los hijos y mediante una rulta ponderada los sobrevivientes de la anterior generación.

constants.py: Archivo con todas las constantes usadas.

print_colors.py: Dibuja cada alelo del gen.

check_winner.py: Comprueba si algún gen es el ganador.

Implementación

En este proyecto se ha usado:

  • Python: Lenguaje utilizado para el software.
  • Pytest: Utilizado para hacer los casos test.
  • Matplotlib: Utilizado para crear las gráficas.
  • Random: Utilizado en la generación de genes, las mutaciones de alelos, la selección de los padres y las ruletas ponderadas.
  • Git: Control de versiones
  • Markdown: Lenguaje usado en la documentación.
  • Ruff: Formateo del código.

Uso de IA

  • ChatGPT: Utilizado para proporcionar ejemplos de pseudo código, explicar concepto de genética y pedir ideas a la hora de refactorizar el código. Se usó para crear el archivo benchmark y print_colors.
  • Copilot: Utilizado para resolver dudas de código y problemas de ruta a la hora de hacer debugging.

Los fragmentos de código utilizados no se implementaron sin previamente saber que ha hacen, a excepción de benchmark.py debido al uso de Matplotlib.

Pruebas

Casos test

Se hicieron casos test para todas las funciones. Actualmente algunos casos test no pasan debido a la inclusión de funciones con componentes aleatorios, pero se comprobaron y testearon antes de añadir dichos elementos.

Coverage

Reporte de coverage

Analisis del tiempo invertido

Se ha invertido en el proyecto al rededor de 42 horas de trabajo sumando el resultado de Wakatime tenemos alrededor de las 42h de trabajo en el proyecto. wakatime1

wakatime2

Este tiempo se invirtió en diferentes funciones (programación, documentación, debugging...) y el trabajo a lo largo del tiempo fue bastante dispar debido a las navidades, ya que a mayores de ser fechas concurridas en cuanto a eventos sociales estábamos un poco quemados de la rutina escolar así que decidimos tomarnos un descanso y retomarlo la semana previa a la entrega.

A pesar de ello, el proyecto se alargó algo mas de lo que estaba planeado en un inicio ya que las primeras iteraciones del software funcionaban con un módulo ruleta diferente al actual que daba muchos problemas y proporcionaba peores resultados.

Posibles mejoras

Entre las posibles mejoras para este software consideramos añadir precondiciones y postcondiciones a las funciones para tener una barricada. Mejorar el rendimiento del código para agilizar la ejecución de la función benchmark. Por último también queremos añadir markers a los casos test para poder hacer testing de manera independiente.

Conclusiones

Este proyecto ha sido una iniciación de lo mas interesante al mundo de los algoritmos reproductivos y aunque hemos tenido que pelearnos bastante con la lógica, estamos muy contentos con el resultado final.

Creemos que ajustando ciertas variables numéricas como los pesos, la probabilidad de mutación o la cantidad de la población que se reproduce frente a la que continua se podría optimizar la media de turnos que lleva encontrar el código secreto.

About

Algoritmo reproductivo que trata de encontrar la solución de un código del juego mastermind.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages