
2026/08/17 22:07
Show HN:ソコバンAIソルバー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このテキストは、1980 年代のパズルゲーム「ソコバン」の高度な Web ベース版について説明しています。目的は全ての箱をゴールマスへ押すことですが、このバリエーションにのみ特徴的に、プレイヤー(「キーパー」と呼ばれる)も指定されたゴールへと導くことです。操作には矢印キー、WASD キー、または画面上のパッドを使用できます。主な目標は可能な限り少ない移動数で勝利することです。
標準的なゲームプレイとは異なり、このシステムは高度な探索アルゴリズムを採用することで、証明可能に最適な解を保証します。それは、Move-optimal マクロ・プッシュ A* に基づくネイティブ C++ ソルバーの純粋な JavaScript ポートを利用しています。大半のレベル(ボード 1–14)でほぼ瞬時のパフォーマンスを実現するために、ソフトウェアはメモリエフィシエンスを高めるために緊密なビットマスク状態、割り当てフリーのハッシュテーブル、ならびにダイアルバケットキューのような専用データ構造を採用しています。さらに、静的デッドマステーブルと壁を考慮したプッシュ距離の下限値を用いて行き止まりを検出することで速度を最適化しています。
ただしボード 15(8 箱の迷路)については重要な例外があります。ライブのブラウザ内での探索を行う場合、約 4900 万の状態を調査し、1 GB を超えるメモリを使用することになり、単一のブラウザタブの限界を超えるためです。したがって、レベル 1 から 14 までは動的に計算されますが、ボード 15 の最適な解(184 の移動が必要)は、オフラインで複数コアを使用するネイティブ C++並列 A*探索により計算され、ページにハードコーディングされています。このアプローチによって、すべてのレベルで検証済みの移動最適解を即座に体験できるようになります。
本文
ソコバナン(倉庫番)とは?ルールと AI ソルバーの仕組み
ゲームの概要
- 登場: 1980 年代に登場したパズルゲームです。
- 役割: プレイヤーは**「キープラー」**となり、すべての箱をゴールのマスへ押し込みます。
- ゴール状態:
- すべての箱とキープラーがゴールのマス上に位置します。
- 重要: 盤面のゴール数は箱の数より1 つ多く設定されており、最後のゴールはプレイヤー自身(キープラー)が占めるためのものです。
ルールと操作方法
- 移動方法:
- 上・下・左・右のいずれか 1 マスずつ移動します。
- 矢印キー、または
キー、または画面内のパッドを使用します。W A S D
- 箱の押し方:
- 壁や箱の上には移動できません。
- 前方(押し込む方向)のマスの裏側が空欄またはゴールであれば、隣にある1 つの箱だけを押すことができます。
- ステップあたり最大 1 つの箱しか動かすことはできません。
- ゴールから箱を再度押し出しても構いません(スペース確保用)。
- 機能:
:操作を巻き戻します。やり直し
:盤面を初期状態に戻します。リセット
- 目的: 全ての物体がゴールに到達した最短の手数でクリアすることです。
- 一部の盤面については最出手順が既知であり、**「Optimal(最適)」**として表示されています。
AI ソルバーの仕組み
このゲームは A* 探索問題ですが、箱が多い場合は計算量が爆発します。ここでは、私が作成したネイティブ C++ の最入手順ソルバーを JavaScript に移植したシステムを使用しています。単なる解法ではなく、証明可能な**「最少数の手順」**を提供します。
技術的特徴
-
移動最優のマクロな箱押し A*
- エッジ(遷移)を「1 つの箱を全体で押す操作」として定義します。
- コストは「キープラーが最短ルートで行く歩数」+「押し込みの 1 回」で計算されます。
- これにより、個々の歩くステップをスキップしつつ、合計コストが真の最少数になるように処理します。
-
緊密なビットマスクによる状態表現
- 箱は到達可能な「生きているマス」に詰め込み、32 ビットの整数として扱います。
- キープラーの状態も 1 つの番号で表されるため、約 1 KB のオブジェクトを単一の文字コード(バイト)で表現できます。
- これにより、数百兆個の状態でも数十 MBのメモリで処理可能です。
-
ダイヤル型バケットキューとオープンアドレス法のハッシュテーブル
- A* のフロンティアはコストでソートされたバケットキューを使用します。
- 既訪問済みセットや親ノードリンクは、メモリの割り当てを行わずキャッシュ効率が高いフラットな配列型ハッシュテーブルとして管理します。
-
デッドロックの剪定
- ゴールから逆方向に到達可能かを示す「死んだマス表」と、動きが止まるかチェックする機構により、解けない位置を早期に排除します。
- 壁を考慮した押し込み距離の下界評価を導入し、探索効率を高めると同時に最良の解を保証しています。
パン面の分類と検証状況
盤面 1〜14:リアルタイム最適解
- これらの盤面は、ミリ秒単位でリアルタイムに最適解を検出します。
- 「Optimal」と表示されている手数は、このソルバーが返す正確な値です。
盤面 15:8 つの箱を含む迷路
- 完全探索の限界:
- 状態数約4900 万。
- メモリ使用量1 GB を超えるため、ブラウザ内でリアルタイム計算は困難です。
- 検証方法:
- 最適解(184 手順)は、ネイティブ C++ ビルド版をオフラインで計算・検証済みです。
- 並列 A* 探索(24 コア使用)で約5 秒の時間で算出されています。
- 表示について:
- ページ上で表示されているのは、あらかじめ計算されたこの解法を順に実行するものであり、リアルタイムな探索ではありません。
- これが盤面 15 の答えがハードコーディングされている理由です。
このソルバーは「ソコバナン求解器」に基づいて構築されています。詳しくは ソコバナンについての情報 を参照してください。