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.

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.

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.

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 projeto
agent_loop_guard.py
Carregando o código…
CMakeLists.txt
Carregando o código…
dqn_sim.py
Carregando o código…
engine_world_model.py
Carregando o código…
generate_executor_demos.py
Carregando o código…
generate_pe_recovery_demos.py
Carregando o código…
generate_planner_demos.py
Carregando o código…
generate_teacher_demos.py
Carregando o código…
generate_wm_labels.py
Carregando o código…
local_puzzle_env.py
Carregando o código…
pe_dagger_collect.py
Carregando o código…
pe_nets.py
Carregando o código…
pe_segment_sim.py
Carregando o código…
pe_sim.py
Carregando o código…
pe_targets.py
Carregando o código…
plan_agent.py
Carregando o código…
plan_obs.py
Carregando o código…
plan_puzzle_env.py
Carregando o código…
plan_sim.py
Carregando o código…
planner_obs.py
Carregando o código…
PROJECT_PURPOSE.md
Carregando o código…
puzzle_c_bindings.py
Carregando o código…
qt_dqn_sim.py
Carregando o código…
qt_pe_client.py
Carregando o código…
qt_rl_client.py
Carregando o código…
qt_vlm_client.py
Carregando o código…
qt_vlm_sim.py
Carregando o código…
qt_wm_client.py
Carregando o código…
README.md
Carregando o código…
requirements-vlm.txt
Carregando o código…
requirements.txt
Carregando o código…
segment_plan_ko.py
Carregando o código…
train_bc_from_demos.py
Carregando o código…
train_pe.py
Carregando o código…
train_plan_bc.py
Carregando o código…
train_puzzle_rl.py
Carregando o código…
train_world_model.py
Carregando o código…
wm_nets.py
Carregando o código…
world_model_agent.py
Carregando o código…
world_model_sim.py
Carregando o código…
world_obs.py
Carregando o código…
src/
src/demo_sim.cpp
Carregando o código…
src/main_window.cpp
Carregando o código…
src/main_window.h
Carregando o código…
src/main.cpp
Carregando o código…
src/puzzle_c_api.cpp
Carregando o código…
src/puzzle_engine.cpp
Carregando o código…
src/puzzle_engine.h
Carregando o código…
src/puzzle_executor.cpp
Carregando o código…
src/puzzle_executor.h
Carregando o código…
src/puzzle_plan_log.h
Carregando o código…
src/puzzle_planner.cpp
Carregando o código…
src/puzzle_planner.h
Carregando o código…
src/puzzle_solve_waves.cpp
Carregando o código…
src/puzzle_solve_waves.h
Carregando o código…
src/puzzle_teacher.cpp
Carregando o código…
src/puzzle_teacher.h
Carregando o código…
src/puzzle_tile_action.h
Carregando o código…
src/puzzle_widget.cpp
Carregando o código…
src/puzzle_widget.h
Carregando o código…
web/
web/app/globals.css
Carregando o código…
web/app/layout.tsx
Carregando o código…
web/app/page.module.css
Carregando o código…
web/app/page.tsx
Carregando o código…
web/app/play/page.tsx
Carregando o código…
web/app/play/play.module.css
Carregando o código…
web/components/PuzzleBoard.module.css
Carregando o código…
web/components/PuzzleBoard.tsx
Carregando o código…
web/lib/levels.ts
Carregando o código…
web/lib/progress.ts
Carregando o código…
web/lib/puzzle.ts
Carregando o código…
web/lib/solver.ts
Carregando o código…
web/package.json
Carregando o código…
COMMENTS · CHAPTER 04
O código-fonte completo e os modelos usados 0 comentários
Ainda não há comentários. Deixe uma pergunta ou algo que queira acrescentar.
Para publicar um comentário, comece com o Google e registre um apelido e um e-mail.
Começar com o Google