Sokoban es japonés para Warehouse Keeper y un videojuego tradicional. El juego es un rompecabezas de transporte, donde el jugador tiene que empujar todas las cajas en la habitación en las ubicaciones/ objetivos de almacenamiento. La posibilidad de cometer errores irreversibles hace que estos rompecabezas sean tan desafiantes, especialmente para los algoritmos de aprendizaje de refuerzo, que en su mayoría carecen de la capacidad de pensar en el futuro.
El repositorio implementa el juego Sokoban basado en las reglas presentó a los agentes aumentados de la imaginación de DeepMind para el aprendizaje de refuerzo profundo. La generación de habitaciones es aleatoria y, por lo tanto, permitirá entrenar redes neuronales profundas sin sobrecargarse en un conjunto de habitaciones predefinidas.
| Ejemplo Juego 1 | Ejemplo Juego 2 | Ejemplo Juego 3 |
|---|---|---|
![]() | ![]() | ![]() |
pip install gym-sokobangit clone [email protected]:mpSchrader/gym-sokoban.git
cd gym-sokoban
pip install -e .Consulte los ejemplos sobre cómo usar un entorno de gimnasio externo.
Cada habitación consta de cinco elementos principales: paredes, piso, cajas, objetivos de caja y un jugador. Pueden tener diferentes estados si se superponen con un objetivo de caja o no.
| Tipo | Estado | Gráfico | Tinyworld |
|---|---|---|---|
| Muro | Estático | ![]() | ![]() |
| Piso | Vacío | ![]() | ![]() |
| Objetivo | Vacío | ![]() | ![]() |
| Caja | Off Target | ![]() | ![]() |
| Caja | En el objetivo | ![]() | ![]() |
| Jugador | Off Target | ![]() | ![]() |
| Jugador | En el objetivo | ![]() | ![]() |
El juego proporciona 9 acciones para interactuar con el medio ambiente. Empuje y mueva acciones hacia las direcciones hacia arriba, hacia abajo, hacia la izquierda y la derecha. La acción de no operación es una acción nula, que no cambia nada en el entorno. El mapeo de los números de acción a las acciones reales se ve de la siguiente manera
| Acción | IDENTIFICACIÓN |
|---|---|
| Sin operación | 0 |
| Hacer subir | 1 |
| Apretar | 2 |
| Empujar a la izquierda | 3 |
| Empujar a la derecha | 4 |
| Subir | 5 |
| Moverse hacia abajo | 6 |
| Mover a la izquierda | 7 |
| Moverse a la derecha | 8 |
Mover simplemente se mueve si hay un campo libre en la dirección, lo que significa que no hay caja o pared de bloqueo.
Push Push intenta mover una caja adyacente si el siguiente campo detrás de la caja es gratuito. Esto significa que no es posible empujar en cadena de cajas. En caso de que no haya un cuadro en el campo adyacente, la acción de empuje se maneja de la misma manera que la acción de movimiento en la misma dirección.
Terminar el juego empujando todos los objetivos da una recompensa de 10 en el último paso. También empujar una caja encendida o apagada de un objetivo da una recompensa de 1 respectivamente de -1. Además, se da una recompensa de -0.1 para cada paso, esto penaliza las soluciones con muchos pasos.
| Razón | Premio |
|---|---|
| Realizar un paso | -0.1 |
| Push Box On Target | 1.0 |
| Empuje el objetivo de la caja | -1.0 |
| Empujar todas las cajas en los objetivos | 10.0 |
Cada vez que se carga un entorno Sokoban o restablece una nueva habitación, se genera aleatoriamente. La generación consta de 3 fases: generación de topología, colocación de objetivos y jugadores, y juego inverso.
Generar la topología básica de la habitación, que consiste en paredes y piso vacío, se basa en una caminata aleatoria, que cambia su dirección a la probabilidad 0.35. En cada paso centrado en la posición actual, se establece un patrón de campos en espacios vacíos. Los patrones utilizados se pueden encontrar en la Figura 2.

Figura 2: Máscaras para crear una topología
Durante esta fase, el jugador, incluidos todos los objetivos de N Box, se colocan en espacios vacíos elegidos al azar.
Esta es la fase crucial para garantizar una habitación solucionable. Ahora Sokoban se juega de manera inversa, donde un jugador puede moverse y tirar de las cajas. El objetivo de esta fase es encontrar el estado de la habitación, con la puntuación de la habitación más alta, con una primera búsqueda de profundidad. Para cada habitación explorada durante la búsqueda se calcula una puntuación de la habitación con la ecuación que se muestra a continuación. La ecuación es un enfoque heurístico para evaluar la dificultad de la sala. BoxSwaps cuenta la cantidad de veces que un jugador cambia la caja para extraer. BoxDsplacement es la distancia de Manhattan entre una caja específica y su objetivo de caja de origen. Mientras al menos una caja esté en un objetivo, el ámbito de la habitación siempre es 0.
Sokoban tiene muchas variaciones diferentes, como el tamaño de la habitación, el número de cajas, los modos de representación o las reglas.
Además de la representación regular de Sokoban, cada configuración se puede representar como TinyWorld, que tiene un tamaño de píxel igual al tamaño de la cuadrícula. Para obtener un entorno presentado como un mundo pequeño, simplemente agregue tiny_ frente al modo de renderizado. Por ejemplo: env.render('tiny_rgb_array', scale=scale_tiny) . La escala permite aumentar el tamaño de la pequeña observación del mundo. El uso de la escala en combinación con los modos de renderizado, human o rgb_array , no influye en el tamaño de la salida. Los modos de renderizado disponibles son:
| Modo | Descripción |
|---|---|
| rgb_array | Imagen de rgb 2d de aspecto bueno |
| humano | Muestra el estado actual en la pantalla |
| tiny_rgb_array | Cada píxel describe un elemento en la habitación |
| Tiny_Human | Muestra el pequeño rgb_array en la pantalla |
Las configuraciones de habitación disponibles se muestran en la tabla a continuación.
| ID de habitación | Tamaño de la cuadrícula | Píxeles | #Boxes | Ejemplo | Tinyworld |
|---|---|---|---|---|---|
| Sokoban-v0 | 10x10 | 160x160 | 3 | ![]() | ![]() |
| Sokoban-V1 | 10x10 | 160x160 | 4 | ![]() | ![]() |
| Sokoban-V2 | 10x10 | 160x160 | 5 | ![]() | ![]() |
| Sokoban-Small-V0 | 7x7 | 112x112 | 2 | ![]() | ![]() |
| Sokoban-Small-V1 | 7x7 | 112x112 | 3 | ![]() | ![]() |
| Sokoban-Large-V0 | 13x11 | 208x176 | 3 | ![]() | ![]() |
| Sokoban-Large-V1 | 13x11 | 208x176 | 4 | ![]() | ![]() |
| Sokoban-Large-V2 | 13x11 | 208x176 | 5 | ![]() | ![]() |
| Sokoban-huge-v0 | 13x13 | 208x208 | 5 | ![]() | ![]() |
Tenga en cuenta que las habitaciones más grandes pueden tardar un tiempo en crearse, especialmente en una computadora portátil.
Además del juego regular de Sokoban, este repositorio implementa o implementará variaciones, lo que podría hacer que el juego sea más fácil o más complicado. Excepto que se note de manera diferente, las variaciones no implementan una versión de mundo pequeño.
| Variación | Resumen | Dificultad esperada | Ejemplo | Pequeño mundo | Estado | Detalles |
|---|---|---|---|---|---|---|
| Objetivos fijos | Cada caja debe ser empujada sobre el objetivo con el mismo color. | Más difícil | ![]() | Sí | implementado | Readme |
| Jugador múltiple | Hay dos jugadores en la habitación. Se puede usar cada ronda de los dos jugadores. No hay orden de movimientos entre los dos jugadores. | Más difícil | ![]() | Sí | implementado | Readme |
| Empuje y tirar | El jugador no solo puede empujar las cajas, sino también tirarlas. Por lo tanto, no existen más movimientos irreversibles. | Más fácil | ![]() | Sí | implementado | Readme |
| Boxoban | Usos de DeepMind Pregenerados rompecabezas Sokoban. | Similar | ![]() | Sí | Implementado | Readme |
Si está utilizando este repositorio para su investigación, cíquelo con la siguiente información:
@misc{SchraderSokoban2018,
author = {Schrader, Max-Philipp B.},
title = {gym-sokoban},
year = {2018},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/mpSchrader/gym-sokoban}},
commit = {#CommitId}
}
Siéntase libre de ponerse en contacto conmigo para hablar sobre este u otros proyectos. Ya sea creando un problema o envíeme un correo electrónico en LinkedIn.
Si llegó al final y le gustó el proyecto, muestre su agradecimiento comenzando este proyecto .
Siéntase libre de contribuir a este proyecto bifurcando el repositorio e implementando lo que sea que se le falte. Alternativamente, abra un nuevo problema en caso de que necesite ayuda o desee agregar una función.