Sokoban é japonês para guardião do armazém e um videogame tradicional. O jogo é um quebra -cabeça de transporte, onde o jogador precisa empurrar todas as caixas na sala nos locais/ metas de armazenamento. A possibilidade de cometer erros irreversíveis torna esses quebra -cabeças tão desafiadores, especialmente para algoritmos de aprendizado de reforço, o que não tem a capacidade de pensar no futuro.
O repositório implementa o jogo Sokoban, com base nas regras, apresentou os agentes de imaginação do artigo de DeepMind para o aprendizado de reforço profundo. A geração da sala é aleatória e, portanto, permitirá treinar redes neurais profundas sem ajustar demais um conjunto de salas predefinidas.
| Exemplo de jogo 1 | Exemplo de jogo 2 | Exemplo de jogo 3 |
|---|---|---|
![]() | ![]() | ![]() |
pip install gym-sokobangit clone [email protected]:mpSchrader/gym-sokoban.git
cd gym-sokoban
pip install -e .Confira os exemplos sobre como usar um ambiente de academia externo.
Cada quarto consiste em cinco elementos principais: paredes, piso, caixas, alvos de caixas e um jogador. Eles podem ter estados diferentes, se eles se sobrepõem a um alvo de caixa ou não.
| Tipo | Estado | Gráfico | Tinyworld |
|---|---|---|---|
| Parede | Estático | ![]() | ![]() |
| Chão | Vazio | ![]() | ![]() |
| Alvo de caixa | Vazio | ![]() | ![]() |
| Caixa | Fora do alvo | ![]() | ![]() |
| Caixa | No alvo | ![]() | ![]() |
| Jogador | Fora do alvo | ![]() | ![]() |
| Jogador | No alvo | ![]() | ![]() |
O jogo fornece 9 ações para interagir com o meio ambiente. Empurre e mova as ações para as direções para cima, para baixo, para a esquerda e para a direita. A ação sem operação é uma ação vazia, que não muda nada no ambiente. O mapeamento dos números de ação para as ações reais parecem a seguir
| Ação | EU IA |
|---|---|
| Nenhuma operação | 0 |
| Empurrar para cima | 1 |
| Empurre para baixo | 2 |
| Empurre à esquerda | 3 |
| Empurre à direita | 4 |
| Suba | 5 |
| Mover para baixo | 6 |
| Mover para a esquerda | 7 |
| Mova -se para a direita | 8 |
Mover simplesmente se move se houver um campo livre na direção, o que significa que não há caixa de bloqueio ou parede.
Push tenta mover uma caixa adjacente se o próximo campo atrás da caixa estiver livre. Isso significa que não é possível empurrar em cadeia de caixas. Caso não haja caixa no campo adjacente, a ação de push é tratada da mesma maneira que a ação de mover na mesma direção.
Terminar o jogo empurrando tudo nos alvos dá uma recompensa de 10 na última etapa. Também empurrar uma caixa dentro ou para fora de um alvo fornece uma recompensa de 1, respectivamente, de -1. Além disso, uma recompensa de -0,1 é dada para cada etapa, isso penaliza soluções com muitas etapas.
| Razão | Recompensa |
|---|---|
| Execute a etapa | -0.1 |
| Push Box no alvo | 1.0 |
| Push Box Off Target | -1.0 |
| Empurre todas as caixas nos alvos | 10.0 |
Toda vez que um ambiente de Sokoban é carregado ou redefinir uma nova sala é gerada aleatoriamente. A geração consiste em 3 fases: geração de topologia, colocação de alvos e jogadores e jogo reverso.
Para gerar a topologia básica da sala, consistindo em paredes e piso vazio, é baseado em uma caminhada aleatória, que muda de direção em probabilidade 0,35. A cada passo centrado na posição atual, um padrão de campos está definido para esvaziar espaços. Os padrões utilizados podem ser encontrados na Figura 2.

Figura 2: máscaras para criar uma topologia
Durante esta fase, o jogador, incluindo todos os alvos da caixa N, é colocado em espaços vazios escolhidos aleatoriamente.
Esta é a fase crucial para garantir uma sala solucionável. Agora, Sokoban é tocado de maneira inversa, onde um jogador pode se mover e puxar caixas. O objetivo desta fase é encontrar o estado da sala, com a pontuação mais alta da sala, com uma primeira pesquisa de profundidade. Para cada quarto explorado durante a pesquisa, uma pontuação da sala é calculada com a equação mostrada abaixo. A equação é uma abordagem heurística para avaliar a dificuldade da sala. BoxSwaps conta o número de vezes que um jogador muda a caixa para puxar. O BoxDisSplacement é a distância de Manhattan entre uma caixa específica e seu alvo da caixa de origem. Enquanto pelo menos uma caixa estiver em um alvo, o quarto de quarto é sempre 0.
Sokoban tem muitas variações diferentes, como: tamanho da sala, número de caixas, modos de renderização ou regras.
Além da renderização regular do Sokoban, cada configuração pode ser renderizada como Tinyworld, que tem um tamanho de pixel igual ao tamanho da grade. Para obter um ambiente renderizado como um mundo minúsculo, apenas adicione tiny_ na frente do modo de renderização. Por exemplo: env.render('tiny_rgb_array', scale=scale_tiny) . A escala permite aumentar o tamanho da pequena observação mundial renderizada. Usando a escala em combinação com os modos de renderização, human ou rgb_array , não influencia o tamanho da saída. Os modos de renderização disponíveis são:
| Modo | Descrição |
|---|---|
| rgb_array | Imagem 2D RGB de boa aparência |
| humano | Exibe o estado atual na tela |
| tiny_rgb_array | Cada pixel descrevendo um elemento na sala |
| tiny_human | Exibe o minúsculo rgb_array na tela |
As configurações de sala disponíveis são mostradas na tabela abaixo.
| ID da sala | Tamanho da grade | Pixels | #Boxes | Exemplo | 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 | ![]() | ![]() |
Observe que os quartos maiores podem levar algum tempo para serem criados, especialmente em um laptop.
Além do jogo regular de Sokoban, este repositório implementa ou implementará variações, o que pode tornar o jogo mais fácil ou mais complicado. Exceto observado de maneira diferente, as variações não implementam uma versão do mundo minúsculo.
| Variação | Resumo | Dificuldade esperada | Exemplo | Mundo minúsculo | Status | Detalhes |
|---|---|---|---|---|---|---|
| Alvos fixos | Cada caixa deve ser empurrada no alvo com a mesma cor. | Mais difícil | ![]() | Sim | implementado | Readme |
| Múltipla jogador | Existem dois jogadores na sala. Toda rodada uma dos dois jogadores pode ser usada. Não há ordem de movimentos entre os dois jogadores. | Mais difícil | ![]() | Sim | implementado | Readme |
| Empurre e puxe | O jogador pode não apenas empurrar as caixas, mas também puxá -las. Portanto, não existem movimentos mais irreversíveis. | Mais fácil | ![]() | Sim | implementado | Readme |
| Boxoban | Usos por quebra -cabeças de Sokoban pré -gerados de DeepMind. | Semelhante | ![]() | Sim | Implementado | Readme |
Se você estiver usando este repositório para sua pesquisa, cite -a com as seguintes informações:
@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}
}
Sinta -se à vontade para entrar em contato comigo para falar sobre este ou outros projetos. Criando um problema ou envie -me no LinkedIn.
Se você chegou ao fim e gostou do projeto, mostre sua apreciação iniciando este projeto .
Sinta -se à vontade para contribuir com este projeto, batendo no repositório e implementando o que estiver faltando. Como alternativa, abra um novo problema, caso você precise de ajuda ou querer adicionar um recurso.