この記事の目的
スライドパズルAIの実験に使ったソースコード全体を公開します。ファイルを開いたときだけコードを読み込みます。
使用したモデル
- DQN: Stable-Baselines3。観測は 4×4 のタイル番号、行動は空きマスの上下左右の4種類、報酬はタイルごとに正しい位置まで残ったマンハッタン距離を足した値の負数です。1回目の記事の無限の繰り返しは、この報酬から生まれました。
- 模倣学習(BC): 人が直接解いた記録と、C++ の教師(A*)が作った解答を DQN のポリシーに先に学習
- Planner・Executor: PyTorch の CNN 二つ(畳み込み 32→64 チャネル)。Planner は次にそろえるタイルを、Executor はそのタイルを動かす一手を選びます。ポリシーが間違えた局面を教師の答えでラベル付けし直す DAgger でデータを補強しました。
- ワールドモデル: C++ エンジンで先の手をシミュレーションし、盤の進み具合(0〜1)を予測する ValueNet の点数で手を選びます。
- VLM: Hugging Face の Qwen2.5-VL-3B-Instruct。パズルの盤の画像と打てる手のリストを渡し、次の手をJSONで受け取りました。
補助として使ったもの
- C++ の教師(PuzzleTeacher・Planner・Executor): デモの生成と採点の基準。研究モードでは、エージェントが出した手を上書きしません。
- agent_loop_guard: DQN・VLM が同じ盤を繰り返したら、マンハッタン距離を減らす手で抜け出させる安全装置
- Webゲームのお任せ解答: 学習モデルではなく、ブラウザ内で動く重み付き A* 探索(マンハッタン距離 + 線形衝突)
もう一度動かした結果
模倣学習は40回反復しても、教師と同じ手を選んだ割合が71.1%で止まりました。

80手シャッフルした盤を同じ条件でもう一度解かせました。学習したモデルは1局も終えられず、ループのルールをコードで入れた C++ Executor だけがすべて解きました。

Planner・Executor のニューラルネットは、次のタイル選びで教師と83%、一手選びで40%一致し、1行目すら最後までそろえられませんでした。ワールドモデルは10局すべてを解きましたが、ValueNet を切って動かしても手順はまったく同じでした。盤を解いたのは ValueNet ではなく、内部で動く C++ Executor です。
Qwen2.5-VL-3B には盤の絵と打てる手を渡し、毎手直接尋ねました。4手しかシャッフルしていない盤も解けませんでした。20局すべてで2マスを往復するか、2×2 の4マスを延々と回し続けました。ループの回し方は知っていても、いつ止めるべきかは分かっていません。

フォルダ構成
- src: Qt6/C++ のパズルエンジン、Python 用の C API、Planner・Executor・Teacher、Qt の画面と TCP 学習サーバー
- ルートの .py: Gymnasium 環境、デモの生成、DQN・BC・Planner/Executor・ワールドモデルの学習、Qt 接続クライアント、評価シミュレーション
- web: Next.js のWebパズル画面
サーバーのデプロイ設定、監視・自動化スクリプト、学習データとモデルの重み、パズルの絵のファイルは公開範囲から除外しました。広告のようなWeb運用のコードと設定ファイル、デバッグ用ツールも除いたため、一部の import と README の scripts のパスは公開していないファイルを指しています。
全ソース
73ファイル · 19,290行 — フォルダを開いてファイルを押すとコードを読み込みます。
プロジェクトルート
agent_loop_guard.py
コードを読み込んでいます…
CMakeLists.txt
コードを読み込んでいます…
dqn_sim.py
コードを読み込んでいます…
engine_world_model.py
コードを読み込んでいます…
generate_executor_demos.py
コードを読み込んでいます…
generate_pe_recovery_demos.py
コードを読み込んでいます…
generate_planner_demos.py
コードを読み込んでいます…
generate_teacher_demos.py
コードを読み込んでいます…
generate_wm_labels.py
コードを読み込んでいます…
local_puzzle_env.py
コードを読み込んでいます…
pe_dagger_collect.py
コードを読み込んでいます…
pe_nets.py
コードを読み込んでいます…
pe_segment_sim.py
コードを読み込んでいます…
pe_sim.py
コードを読み込んでいます…
pe_targets.py
コードを読み込んでいます…
plan_agent.py
コードを読み込んでいます…
plan_obs.py
コードを読み込んでいます…
plan_puzzle_env.py
コードを読み込んでいます…
plan_sim.py
コードを読み込んでいます…
planner_obs.py
コードを読み込んでいます…
PROJECT_PURPOSE.md
コードを読み込んでいます…
puzzle_c_bindings.py
コードを読み込んでいます…
qt_dqn_sim.py
コードを読み込んでいます…
qt_pe_client.py
コードを読み込んでいます…
qt_rl_client.py
コードを読み込んでいます…
qt_vlm_client.py
コードを読み込んでいます…
qt_vlm_sim.py
コードを読み込んでいます…
qt_wm_client.py
コードを読み込んでいます…
README.md
コードを読み込んでいます…
requirements-vlm.txt
コードを読み込んでいます…
requirements.txt
コードを読み込んでいます…
segment_plan_ko.py
コードを読み込んでいます…
train_bc_from_demos.py
コードを読み込んでいます…
train_pe.py
コードを読み込んでいます…
train_plan_bc.py
コードを読み込んでいます…
train_puzzle_rl.py
コードを読み込んでいます…
train_world_model.py
コードを読み込んでいます…
wm_nets.py
コードを読み込んでいます…
world_model_agent.py
コードを読み込んでいます…
world_model_sim.py
コードを読み込んでいます…
world_obs.py
コードを読み込んでいます…
src/
src/demo_sim.cpp
コードを読み込んでいます…
src/main_window.cpp
コードを読み込んでいます…
src/main_window.h
コードを読み込んでいます…
src/main.cpp
コードを読み込んでいます…
src/puzzle_c_api.cpp
コードを読み込んでいます…
src/puzzle_engine.cpp
コードを読み込んでいます…
src/puzzle_engine.h
コードを読み込んでいます…
src/puzzle_executor.cpp
コードを読み込んでいます…
src/puzzle_executor.h
コードを読み込んでいます…
src/puzzle_plan_log.h
コードを読み込んでいます…
src/puzzle_planner.cpp
コードを読み込んでいます…
src/puzzle_planner.h
コードを読み込んでいます…
src/puzzle_solve_waves.cpp
コードを読み込んでいます…
src/puzzle_solve_waves.h
コードを読み込んでいます…
src/puzzle_teacher.cpp
コードを読み込んでいます…
src/puzzle_teacher.h
コードを読み込んでいます…
src/puzzle_tile_action.h
コードを読み込んでいます…
src/puzzle_widget.cpp
コードを読み込んでいます…
src/puzzle_widget.h
コードを読み込んでいます…
web/
web/app/globals.css
コードを読み込んでいます…
web/app/layout.tsx
コードを読み込んでいます…
web/app/page.module.css
コードを読み込んでいます…
web/app/page.tsx
コードを読み込んでいます…
web/app/play/page.tsx
コードを読み込んでいます…
web/app/play/play.module.css
コードを読み込んでいます…
web/components/PuzzleBoard.module.css
コードを読み込んでいます…
web/components/PuzzleBoard.tsx
コードを読み込んでいます…
web/lib/levels.ts
コードを読み込んでいます…
web/lib/progress.ts
コードを読み込んでいます…
web/lib/puzzle.ts
コードを読み込んでいます…
web/lib/solver.ts
コードを読み込んでいます…
web/package.json
コードを読み込んでいます…
COMMENTS · CHAPTER 04
全ソースコードと使用したモデル コメント 0
まだコメントはありません。気になった点や補足があれば残してください。
コメントを登録するには、Googleで始めてニックネームとメールアドレスを登録してください。
Googleで始める