Objetivo deste post

Este post publica todo o código-fonte usado nos experimentos de IA no quebra-cabeça deslizante. O código só é carregado quando você abre um arquivo.

Modelos usados

  • DQN: Stable-Baselines3. A observação são os números das peças 4×4, as ações são os quatro movimentos da casa vazia (cima, baixo, esquerda, direita), e a recompensa é o negativo da soma das distâncias de Manhattan que faltam para cada peça chegar ao seu lugar. A repetição infinita do post 1 veio dessa recompensa.
  • Aprendizado por imitação (BC): a política da DQN foi treinada primeiro com registros resolvidos por uma pessoa e com soluções geradas por um professor em C++ (A*)
  • Planner e Executor: duas CNNs em PyTorch (convoluções de 32→64 canais). O Planner escolhe a próxima peça a posicionar, e o Executor escolhe a jogada que move essa peça. Os dados foram reforçados com DAgger, que rotula de novo com a resposta do professor as posições em que a política errou.
  • Modelo de mundo: simula as próximas jogadas com o motor em C++ e escolhe a jogada pela pontuação de uma ValueNet que prevê o progresso do tabuleiro (de 0 a 1).
  • VLM: Qwen2.5-VL-3B-Instruct, do Hugging Face. Demos a ele a imagem do tabuleiro do quebra-cabeça e a lista de jogadas possíveis e recebemos a próxima jogada em JSON.

O que usamos como apoio

  • Professor em C++ (PuzzleTeacher, Planner, Executor): geração de demonstrações e referência de avaliação. No modo de pesquisa, ele não sobrescreve as jogadas feitas pelo agente.
  • agent_loop_guard: uma proteção que, quando a DQN ou o VLM repete o mesmo tabuleiro, sai do loop com uma jogada que reduz a distância de Manhattan
  • Solução por IA no jogo da web: não é um modelo treinado, e sim uma busca A* ponderada que roda dentro do navegador (distância de Manhattan + conflito linear)

Resultados ao rodar de novo

Mesmo depois de 40 iterações, o aprendizado por imitação parou em 71,1% de jogadas iguais às do professor.

Precisão do aprendizado por imitação. Soluções do professor (A*) 71,1%, soluções do Executor 63,1%
Precisão do aprendizado por imitação. Soluções do professor (A*) 71,1%, soluções do Executor 63,1%

Rodamos de novo, nas mesmas condições, tabuleiros embaralhados com 80 jogadas. Nenhum dos modelos treinados terminou sequer um tabuleiro; só o Executor em C++, que tem a regra do loop escrita em código, resolveu todos.

Proporção de tabuleiros embaralhados com 80 jogadas resolvidos até o fim. DQN, Manhattan e aleatório 0/50, redes Planner/Executor 0/10, Executor em C++ 50/50
Proporção de tabuleiros embaralhados com 80 jogadas resolvidos até o fim. DQN, Manhattan e aleatório 0/50, redes Planner/Executor 0/10, Executor em C++ 50/50

As redes Planner/Executor concordaram com o professor em 83% das vezes ao escolher a próxima peça e em 40% ao escolher uma jogada, e não conseguiram completar nem a primeira linha. O modelo de mundo resolveu os 10 tabuleiros, mas a sequência de jogadas era idêntica mesmo com a ValueNet desligada. Quem resolveu os tabuleiros não foi a ValueNet, e sim o Executor em C++ que roda dentro dele.

Para o Qwen2.5-VL-3B, demos a imagem do tabuleiro e as jogadas possíveis e perguntamos diretamente a cada jogada. Ele não conseguiu resolver nem tabuleiros embaralhados com apenas 4 jogadas. Nas 20 partidas, ele ficou indo e voltando entre duas casas ou girando sem parar um bloco 2×2 de quatro casas. Ele sabe girar um loop, mas não sabe quando parar.

Padrões de repetição do Qwen2.5-VL-3B. Embaralhados com 4 jogadas: vaivém 4, giro 6; embaralhados com 10 jogadas: vaivém 2, giro 8; resolvidos 0
Padrões de repetição do Qwen2.5-VL-3B. Embaralhados com 4 jogadas: vaivém 4, giro 6; embaralhados com 10 jogadas: vaivém 2, giro 8; resolvidos 0

Estrutura de pastas

  • src: motor do quebra-cabeça em Qt6/C++, API em C para Python, Planner/Executor/Teacher, tela em Qt e servidor de treinamento TCP
  • Arquivos .py na raiz: ambiente Gymnasium, geração de demonstrações, treinamento de DQN/BC/Planner-Executor/modelo de mundo, cliente de conexão com o Qt, simulações de avaliação
  • web: tela do quebra-cabeça na web em Next.js

As configurações de implantação do servidor, os scripts de monitoramento e automação, os dados de treinamento e pesos dos modelos e os arquivos de imagem do quebra-cabeça ficaram de fora da publicação. O código de operação da web, como anúncios, os arquivos de configuração e as ferramentas de depuração também foram retirados, por isso alguns imports e os caminhos de scripts no README apontam para arquivos não publicados.

Código-fonte completo

73 arquivos · 19.290 linhas — abra uma pasta e clique em um arquivo para carregar o código.

Raiz do projeto41 arquivos
agent_loop_guard.pypython · 275 linhas · 9KB

Carregando o código…

CMakeLists.txttext · 64 linhas · 2KB

Carregando o código…

dqn_sim.pypython · 257 linhas · 9KB

Carregando o código…

engine_world_model.pypython · 256 linhas · 8KB

Carregando o código…

generate_executor_demos.pypython · 128 linhas · 4KB

Carregando o código…

generate_pe_recovery_demos.pypython · 199 linhas · 6KB

Carregando o código…

generate_planner_demos.pypython · 77 linhas · 2KB

Carregando o código…

generate_teacher_demos.pypython · 207 linhas · 6KB

Carregando o código…

generate_wm_labels.pypython · 101 linhas · 3KB

Carregando o código…

local_puzzle_env.pypython · 223 linhas · 8KB

Carregando o código…

pe_dagger_collect.pypython · 217 linhas · 8KB

Carregando o código…

pe_nets.pypython · 145 linhas · 5KB

Carregando o código…

pe_segment_sim.pypython · 159 linhas · 5KB

Carregando o código…

pe_sim.pypython · 243 linhas · 8KB

Carregando o código…

pe_targets.pypython · 71 linhas · 2KB

Carregando o código…

plan_agent.pypython · 310 linhas · 11KB

Carregando o código…

plan_obs.pypython · 18 linhas · 661B

Carregando o código…

plan_puzzle_env.pypython · 101 linhas · 4KB

Carregando o código…

plan_sim.pypython · 262 linhas · 8KB

Carregando o código…

planner_obs.pypython · 17 linhas · 556B

Carregando o código…

PROJECT_PURPOSE.mdmarkdown · 149 linhas · 7KB

Carregando o código…

puzzle_c_bindings.pypython · 193 linhas · 7KB

Carregando o código…

qt_dqn_sim.pypython · 293 linhas · 10KB

Carregando o código…

qt_pe_client.pypython · 738 linhas · 23KB

Carregando o código…

qt_rl_client.pypython · 198 linhas · 7KB

Carregando o código…

qt_vlm_client.pypython · 494 linhas · 18KB

Carregando o código…

qt_vlm_sim.pypython · 324 linhas · 11KB

Carregando o código…

qt_wm_client.pypython · 200 linhas · 7KB

Carregando o código…

README.mdmarkdown · 139 linhas · 5KB

Carregando o código…

requirements-vlm.txttext · 8 linhas · 153B

Carregando o código…

requirements.txttext · 4 linhas · 40B

Carregando o código…

segment_plan_ko.pypython · 42 linhas · 2KB

Carregando o código…

train_bc_from_demos.pypython · 145 linhas · 5KB

Carregando o código…

train_pe.pypython · 327 linhas · 11KB

Carregando o código…

train_plan_bc.pypython · 152 linhas · 5KB

Carregando o código…

train_puzzle_rl.pypython · 358 linhas · 13KB

Carregando o código…

train_world_model.pypython · 135 linhas · 5KB

Carregando o código…

wm_nets.pypython · 54 linhas · 2KB

Carregando o código…

world_model_agent.pypython · 183 linhas · 7KB

Carregando o código…

world_model_sim.pypython · 135 linhas · 4KB

Carregando o código…

world_obs.pypython · 38 linhas · 1KB

Carregando o código…

src/19 arquivos
src/demo_sim.cppc++ · 540 linhas · 18KB

Carregando o código…

src/main_window.cppc++ · 2.089 linhas · 66KB

Carregando o código…

src/main_window.hc++ · 196 linhas · 7KB

Carregando o código…

src/main.cppc++ · 68 linhas · 2KB

Carregando o código…

src/puzzle_c_api.cppc++ · 400 linhas · 12KB

Carregando o código…

src/puzzle_engine.cppc++ · 546 linhas · 15KB

Carregando o código…

src/puzzle_engine.hc++ · 110 linhas · 4KB

Carregando o código…

src/puzzle_executor.cppc++ · 519 linhas · 19KB

Carregando o código…

src/puzzle_executor.hc++ · 53 linhas · 2KB

Carregando o código…

src/puzzle_plan_log.hc++ · 24 linhas · 547B

Carregando o código…

src/puzzle_planner.cppc++ · 4.414 linhas · 152KB

Carregando o código…

src/puzzle_planner.hc++ · 53 linhas · 2KB

Carregando o código…

src/puzzle_solve_waves.cppc++ · 110 linhas · 3KB

Carregando o código…

src/puzzle_solve_waves.hc++ · 33 linhas · 1KB

Carregando o código…

src/puzzle_teacher.cppc++ · 748 linhas · 22KB

Carregando o código…

src/puzzle_teacher.hc++ · 31 linhas · 940B

Carregando o código…

src/puzzle_tile_action.hc++ · 95 linhas · 3KB

Carregando o código…

src/puzzle_widget.cppc++ · 148 linhas · 4KB

Carregando o código…

src/puzzle_widget.hc++ · 47 linhas · 1KB

Carregando o código…

web/13 arquivos
web/app/globals.csscss · 50 linhas · 912B

Carregando o código…

web/app/layout.tsxtsx · 33 linhas · 969B

Carregando o código…

web/app/page.module.csscss · 173 linhas · 3KB

Carregando o código…

web/app/page.tsxtsx · 95 linhas · 3KB

Carregando o código…

web/app/play/page.tsxtsx · 338 linhas · 9KB

Carregando o código…

web/app/play/play.module.csscss · 152 linhas · 2KB

Carregando o código…

web/components/PuzzleBoard.module.csscss · 27 linhas · 396B

Carregando o código…

web/components/PuzzleBoard.tsxtsx · 37 linhas · 1KB

Carregando o código…

web/lib/levels.tstypescript · 134 linhas · 4KB

Carregando o código…

web/lib/progress.tstypescript · 37 linhas · 1KB

Carregando o código…

web/lib/puzzle.tstypescript · 145 linhas · 4KB

Carregando o código…

web/lib/solver.tstypescript · 181 linhas · 5KB

Carregando o código…

web/package.jsonjson · 25 linhas · 557B

Carregando o código…