Objetivo de esta entrada

Publico todo el código fuente usado en los experimentos de IA para el puzzle deslizante. El código solo se carga cuando abres un archivo.

Modelos utilizados

  • DQN: Stable-Baselines3. La observación son los números de las fichas en 4×4, las acciones son los cuatro movimientos de la casilla vacía (arriba, abajo, izquierda, derecha) y la recompensa es el negativo de la suma de la distancia Manhattan que le queda a cada ficha hasta su sitio. La repetición infinita de la entrada 1 salió de esta recompensa.
  • Aprendizaje por imitación (BC): primero se entrenó la política de DQN con registros resueltos por una persona y con soluciones generadas por un profesor en C++ (A*)
  • Planner y Executor: dos CNN de PyTorch (convoluciones de 32→64 canales). El Planner elige la siguiente ficha que hay que colocar y el Executor elige el movimiento que desplaza esa ficha. Los datos se reforzaron con DAgger, que vuelve a etiquetar con la respuesta del profesor las posiciones en las que la política se equivocó.
  • Modelo del mundo: simula las jugadas siguientes con el motor de C++ y elige el movimiento según la puntuación de un ValueNet que predice el progreso del tablero (de 0 a 1).
  • VLM: Qwen2.5-VL-3B-Instruct de Hugging Face. Le dábamos la imagen del tablero del puzzle y la lista de movimientos posibles, y recibíamos el siguiente movimiento en JSON.

Piezas de apoyo

  • Profesor en C++ (PuzzleTeacher, Planner, Executor): generación de demostraciones y referencia de puntuación. En modo de investigación no sobrescribe los movimientos que hace el agente.
  • agent_loop_guard: una protección que, cuando DQN o el VLM repiten el mismo tablero, los saca de ahí con un movimiento que reduce la distancia Manhattan
  • Solucionador de IA del juego web: no es un modelo entrenado, sino una búsqueda A* ponderada que se ejecuta en el navegador (distancia Manhattan + conflicto lineal)

Resultados al volver a ejecutarlos

Incluso tras 40 iteraciones, el aprendizaje por imitación se estancó en un 71,1% de movimientos iguales a los del profesor.

Precisión del aprendizaje por imitación. Soluciones del profesor (A*) 71,1%, soluciones del Executor 63,1%
Precisión del aprendizaje por imitación. Soluciones del profesor (A*) 71,1%, soluciones del Executor 63,1%

Volvimos a ejecutar en las mismas condiciones tableros mezclados con 80 movimientos. Ninguno de los modelos entrenados terminó ni un tablero; solo el Executor en C++, que tiene la regla del bucle escrita en código, los resolvió todos.

Proporción de tableros mezclados con 80 movimientos resueltos hasta el final. DQN, Manhattan y aleatorio 0/50, redes Planner/Executor 0/10, Executor en C++ 50/50
Proporción de tableros mezclados con 80 movimientos resueltos hasta el final. DQN, Manhattan y aleatorio 0/50, redes Planner/Executor 0/10, Executor en C++ 50/50

Las redes Planner/Executor coincidieron con el profesor un 83% al elegir la siguiente ficha y un 40% al elegir un movimiento, y ni siquiera completaron la primera fila. El modelo del mundo resolvió los 10 tableros, pero la secuencia de movimientos era idéntica incluso con el ValueNet desactivado. Lo que resolvió los tableros no fue el ValueNet, sino el Executor en C++ que se ejecuta dentro.

A Qwen2.5-VL-3B le dimos la imagen del tablero y los movimientos posibles y le preguntamos directamente en cada movimiento. No pudo resolver ni siquiera tableros mezclados con solo 4 movimientos. En las 20 partidas, o iba y venía entre dos casillas o giraba sin fin un bloque de 2×2 de cuatro casillas. Sabe girar un bucle, pero no sabe cuándo parar.

Patrones de repetición de Qwen2.5-VL-3B. Tableros mezclados con 4 movimientos: vaivén 4, giro 6; tableros mezclados con 10 movimientos: vaivén 2, giro 8; resueltos 0
Patrones de repetición de Qwen2.5-VL-3B. Tableros mezclados con 4 movimientos: vaivén 4, giro 6; tableros mezclados con 10 movimientos: vaivén 2, giro 8; resueltos 0

Estructura de carpetas

  • src: motor del puzzle en Qt6/C++, API en C para Python, Planner/Executor/Teacher, pantalla Qt y servidor de entrenamiento TCP
  • Archivos .py de la raíz: entorno de Gymnasium, generación de demostraciones, entrenamiento de DQN/BC/Planner-Executor/modelo del mundo, cliente de conexión con Qt, simulaciones de evaluación
  • web: pantalla web del puzzle en Next.js

La configuración de despliegue del servidor, los scripts de monitorización y automatización, los datos de entrenamiento y los pesos de los modelos, y los archivos de imagen del puzzle quedan fuera de lo publicado. También se han omitido el código y los archivos de configuración de operación web como los anuncios, y las herramientas de depuración, por lo que algunos import y las rutas de scripts del README apuntan a archivos no publicados.

Código fuente completo

73 archivos · 19.290 líneas — abre una carpeta y haz clic en un archivo para cargar su código.

Raíz del proyecto41 archivos
agent_loop_guard.pypython · 275 líneas · 9KB

Cargando el código…

CMakeLists.txttext · 64 líneas · 2KB

Cargando el código…

dqn_sim.pypython · 257 líneas · 9KB

Cargando el código…

engine_world_model.pypython · 256 líneas · 8KB

Cargando el código…

generate_executor_demos.pypython · 128 líneas · 4KB

Cargando el código…

generate_pe_recovery_demos.pypython · 199 líneas · 6KB

Cargando el código…

generate_planner_demos.pypython · 77 líneas · 2KB

Cargando el código…

generate_teacher_demos.pypython · 207 líneas · 6KB

Cargando el código…

generate_wm_labels.pypython · 101 líneas · 3KB

Cargando el código…

local_puzzle_env.pypython · 223 líneas · 8KB

Cargando el código…

pe_dagger_collect.pypython · 217 líneas · 8KB

Cargando el código…

pe_nets.pypython · 145 líneas · 5KB

Cargando el código…

pe_segment_sim.pypython · 159 líneas · 5KB

Cargando el código…

pe_sim.pypython · 243 líneas · 8KB

Cargando el código…

pe_targets.pypython · 71 líneas · 2KB

Cargando el código…

plan_agent.pypython · 310 líneas · 11KB

Cargando el código…

plan_obs.pypython · 18 líneas · 661B

Cargando el código…

plan_puzzle_env.pypython · 101 líneas · 4KB

Cargando el código…

plan_sim.pypython · 262 líneas · 8KB

Cargando el código…

planner_obs.pypython · 17 líneas · 556B

Cargando el código…

PROJECT_PURPOSE.mdmarkdown · 149 líneas · 7KB

Cargando el código…

puzzle_c_bindings.pypython · 193 líneas · 7KB

Cargando el código…

qt_dqn_sim.pypython · 293 líneas · 10KB

Cargando el código…

qt_pe_client.pypython · 738 líneas · 23KB

Cargando el código…

qt_rl_client.pypython · 198 líneas · 7KB

Cargando el código…

qt_vlm_client.pypython · 494 líneas · 18KB

Cargando el código…

qt_vlm_sim.pypython · 324 líneas · 11KB

Cargando el código…

qt_wm_client.pypython · 200 líneas · 7KB

Cargando el código…

README.mdmarkdown · 139 líneas · 5KB

Cargando el código…

requirements-vlm.txttext · 8 líneas · 153B

Cargando el código…

requirements.txttext · 4 líneas · 40B

Cargando el código…

segment_plan_ko.pypython · 42 líneas · 2KB

Cargando el código…

train_bc_from_demos.pypython · 145 líneas · 5KB

Cargando el código…

train_pe.pypython · 327 líneas · 11KB

Cargando el código…

train_plan_bc.pypython · 152 líneas · 5KB

Cargando el código…

train_puzzle_rl.pypython · 358 líneas · 13KB

Cargando el código…

train_world_model.pypython · 135 líneas · 5KB

Cargando el código…

wm_nets.pypython · 54 líneas · 2KB

Cargando el código…

world_model_agent.pypython · 183 líneas · 7KB

Cargando el código…

world_model_sim.pypython · 135 líneas · 4KB

Cargando el código…

world_obs.pypython · 38 líneas · 1KB

Cargando el código…

src/19 archivos
src/demo_sim.cppc++ · 540 líneas · 18KB

Cargando el código…

src/main_window.cppc++ · 2089 líneas · 66KB

Cargando el código…

src/main_window.hc++ · 196 líneas · 7KB

Cargando el código…

src/main.cppc++ · 68 líneas · 2KB

Cargando el código…

src/puzzle_c_api.cppc++ · 400 líneas · 12KB

Cargando el código…

src/puzzle_engine.cppc++ · 546 líneas · 15KB

Cargando el código…

src/puzzle_engine.hc++ · 110 líneas · 4KB

Cargando el código…

src/puzzle_executor.cppc++ · 519 líneas · 19KB

Cargando el código…

src/puzzle_executor.hc++ · 53 líneas · 2KB

Cargando el código…

src/puzzle_plan_log.hc++ · 24 líneas · 547B

Cargando el código…

src/puzzle_planner.cppc++ · 4414 líneas · 152KB

Cargando el código…

src/puzzle_planner.hc++ · 53 líneas · 2KB

Cargando el código…

src/puzzle_solve_waves.cppc++ · 110 líneas · 3KB

Cargando el código…

src/puzzle_solve_waves.hc++ · 33 líneas · 1KB

Cargando el código…

src/puzzle_teacher.cppc++ · 748 líneas · 22KB

Cargando el código…

src/puzzle_teacher.hc++ · 31 líneas · 940B

Cargando el código…

src/puzzle_tile_action.hc++ · 95 líneas · 3KB

Cargando el código…

src/puzzle_widget.cppc++ · 148 líneas · 4KB

Cargando el código…

src/puzzle_widget.hc++ · 47 líneas · 1KB

Cargando el código…

web/13 archivos
web/app/globals.csscss · 50 líneas · 912B

Cargando el código…

web/app/layout.tsxtsx · 33 líneas · 969B

Cargando el código…

web/app/page.module.csscss · 173 líneas · 3KB

Cargando el código…

web/app/page.tsxtsx · 95 líneas · 3KB

Cargando el código…

web/app/play/page.tsxtsx · 338 líneas · 9KB

Cargando el código…

web/app/play/play.module.csscss · 152 líneas · 2KB

Cargando el código…

web/components/PuzzleBoard.module.csscss · 27 líneas · 396B

Cargando el código…

web/components/PuzzleBoard.tsxtsx · 37 líneas · 1KB

Cargando el código…

web/lib/levels.tstypescript · 134 líneas · 4KB

Cargando el código…

web/lib/progress.tstypescript · 37 líneas · 1KB

Cargando el código…

web/lib/puzzle.tstypescript · 145 líneas · 4KB

Cargando el código…

web/lib/solver.tstypescript · 181 líneas · 5KB

Cargando el código…

web/package.jsonjson · 25 líneas · 557B

Cargando el código…