Sokoban est japonais pour Warehouse Keeper et un jeu vidéo traditionnel. Le jeu est un puzzle de transport, où le joueur doit pousser toutes les cases dans la pièce sur les emplacements / cibles de stockage. La possibilité de faire des erreurs irréversibles rend ces puzzles si difficiles, en particulier pour les algorithmes d'apprentissage du renforcement, qui n'ont généralement pas la capacité de penser à l'avance.
Le référentiel implémente le jeu Sokoban sur la base des règles présentées aux agents augmentés d'imagination de DeepMind pour l'apprentissage en renforcement profond. La génération de chambres est aléatoire et permettra par conséquent de former des réseaux de neurones profonds sans sur-ajustement sur un ensemble de pièces prédéfinies.
| Exemple de jeu 1 | Exemple de jeu 2 | Exemple de jeu 3 |
|---|---|---|
![]() | ![]() | ![]() |
pip install gym-sokobangit clone [email protected]:mpSchrader/gym-sokoban.git
cd gym-sokoban
pip install -e .Découvrez les exemples sur la façon d'utiliser un environnement de gymnase externe.
Chaque pièce se compose de cinq éléments principaux: murs, plancher, boîtes, cibles de boîte et un joueur. Ils pourraient avoir des états différents, qu'ils se chevauchent avec une cible de boîte ou non.
| Taper | État | Graphique | Tinyworld |
|---|---|---|---|
| Mur | Statique | ![]() | ![]() |
| Sol | Vide | ![]() | ![]() |
| Cible de la boîte | Vide | ![]() | ![]() |
| Boîte | Hors cible | ![]() | ![]() |
| Boîte | Sur la cible | ![]() | ![]() |
| Joueur | Hors cible | ![]() | ![]() |
| Joueur | Sur la cible | ![]() | ![]() |
Le jeu fournit 9 actions pour interagir avec l'environnement. Poussez et déplacez les actions dans les directions vers le haut, le bas, la gauche et la droite. L'action sans opération est une action vide, qui ne change rien dans l'environnement. La cartographie des numéros d'action aux actions réelles ressemble à ce qui suit
| Action | IDENTIFIANT |
|---|---|
| Aucune opération | 0 |
| Faire monter | 1 |
| Abaisser | 2 |
| Pousser à gauche | 3 |
| Se redresser | 4 |
| Monter | 5 |
| Descendre | 6 |
| Se déplacer à gauche | 7 |
| Se déplacer à droite | 8 |
Déplacer se déplace simplement s'il y a un champ libre dans la direction, ce qui signifie pas de boîte de blocage ni de mur.
Push Push essaie de déplacer une boîte adjacente si le champ suivant derrière la boîte est gratuit. Cela signifie qu'aucune chaîne qui pousse des boîtes n'est possible. Dans le cas où il n'y a pas de boîte sur le champ adjacent, l'action push est gérée de la même manière que l'action de déplacement dans la même direction.
Terminer le jeu en poussant tout sur les cibles donne une récompense de 10 dans la dernière étape. Pousser également une boîte sur ou sur une cible donne une récompense de 1 respectivement de -1. De plus, une récompense de -0,1 est donnée pour chaque étape, cela pénalise les solutions avec de nombreuses étapes.
| Raison | Récompense |
|---|---|
| Effectuer une étape | -0.1 |
| Push Box sur la cible | 1.0 |
| Push Box Off Target | -1.0 |
| Poussez toutes les cases sur les cibles | 10.0 |
Chaque fois qu'un environnement Sokoban est chargé ou réinitialisé, une nouvelle pièce est générée au hasard. La génération se compose de 3 phases: la génération de topologie, le placement des cibles et les joueurs et le jeu inversé.
Pour générer la topologie de base de la pièce, composée de murs et de plancher vide, est basée sur une marche aléatoire, ce qui modifie sa direction avec une probabilité de 0,35. À chaque étape centrée sur la position actuelle, un modèle de champs est défini sur les espaces vides. Les motifs utilisés peuvent être trouvés dans la figure 2.

Figure 2: Masques pour créer une topologie
Au cours de cette phase, le lecteur comprenant toutes les cibles de la boîte N est placé sur des espaces vides choisis au hasard.
Il s'agit de la phase cruciale pour assurer une pièce résoluble. Maintenant, Sokoban est joué de manière inverse, où un joueur peut bouger et tirer des boîtes. L'objectif de cette phase est de trouver l'état de la salle, avec le score de la salle le plus élevé, avec une première recherche en profondeur. Pour chaque pièce explorée pendant la recherche est un score de pièce est calculé avec l'équation illustrée ci-dessous. L'équation est une approche heuristique pour évaluer la difficulté de la pièce. BoxSwaps compte le nombre de fois qu'un joueur modifie la boîte pour tirer. BoxDisplacement est la distance de Manhattan entre une boîte spécifique et sa cible d'origine. Tant qu'au moins une boîte est sur une cible, la pièce est toujours 0.
Sokoban a de nombreuses variations différentes, telles que: la taille de la pièce, le nombre de boîtes, les modes de rendu ou les règles.
Outre le rendu Sokoban ordinaire, chaque configuration peut être rendue comme TinyWorld, qui a une taille de pixel égale à la taille de la grille. Pour obtenir un environnement rendu comme un petit monde, ajoutez tiny_ devant le mode de rendu. EG: env.render('tiny_rgb_array', scale=scale_tiny) . L'échelle permet d'augmenter la taille de l'observation du monde minuscule rendu. L'utilisation d'échelle en combinaison avec les modes de rendu, human ou rgb_array , n'influence pas la taille de la sortie. Les modes de rendu disponibles sont:
| Mode | Description |
|---|---|
| rgb_array | Image 2D RVB bien à la recherche |
| humain | Affiche l'état actuel à l'écran |
| tiny_rgb_array | Chaque pixel décrivant un élément de la pièce |
| tiny_human | Affiche le minuscule rgb_array à l'écran |
Les configurations de pièce disponibles sont affichées dans le tableau ci-dessous.
| Pièce d'identité | Grille | Pixels | #Boxes | Exemple | 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 | ![]() | ![]() |
Veuillez noter que les plus grandes pièces pourraient prendre du temps pour être créées, en particulier sur un ordinateur portable.
Outre le jeu régulier de Sokoban, ce référentiel implémente ou implémentera les variations, ce qui pourrait rendre le jeu plus facile ou plus compliqué. Sauf noté différemment, les variations n'implémentent pas une version minuscule du monde.
| Variation | Résumé | Difficulté attendue | Exemple | Petit monde | Statut | Détails |
|---|---|---|---|---|---|---|
| Cibles fixes | Chaque boîte doit être poussée sur la cible avec la même couleur. | Plus difficile | ![]() | Oui | mis en œuvre | Réadmettre |
| Plusieurs joueurs | Il y a deux joueurs dans la pièce. Chaque tour, l'un des deux joueurs peut être utilisé. Il n'y a pas d'ordre de mouvements entre les deux joueurs. | Plus difficile | ![]() | Oui | mis en œuvre | Réadmettre |
| Pousser et tirer | Le joueur peut non seulement pousser les boîtes, mais aussi les tirer. Par conséquent, il n'y a plus de mouvements irréversibles. | Plus facile | ![]() | Oui | mis en œuvre | Réadmettre |
| Boxoban | Utilisations par DeepMind Prégénéré Sokoban Puzzles. | Similaire | ![]() | Oui | Mis en œuvre | Réadmettre |
Si vous utilisez ce référentiel pour vos recherches, veuillez les citer avec les informations suivantes:
@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}
}
N'hésitez pas à me contacter pour parler de ce projets ou d'autres. Soit en créant un problème, soit en m'envoyant un courrier sur LinkedIn.
Si vous avez atteint la fin et que vous avez aimé le projet, veuillez montrer votre appréciation en commençant ce projet .
N'hésitez pas à contribuer à ce projet en fournissant le repo et en mettant en œuvre tout ce qui vous manque. Alternativement, ouvrez un nouveau problème au cas où vous auriez besoin d'aide ou que vous souhaitez ajouter une fonctionnalité.