Sokobanは、倉庫のキーパーと伝統的なビデオゲームの日本語です。ゲームは交通機関のパズルで、プレイヤーはストレージの場所/ターゲットの部屋のすべてのボックスを押す必要があります。不可逆的な間違いを犯す可能性は、これらのパズルが特に強化学習アルゴリズムにとって非常に挑戦的であり、ほとんどが先を考える能力を欠いています。
リポジトリは、深い強化学習のためにディープマインドの論文想像力補強エージェントを提示したルールに基づいて、ソコバンのゲームを実装しています。部屋の生成はランダムであるため、事前定義された部屋のセットに過剰に適合せずに深いニューラルネットワークを訓練できます。
| ゲーム1の例1 | ゲーム2の例 | ゲーム3の例 |
|---|---|---|
![]() | ![]() | ![]() |
pip install gym-sokobangit clone [email protected]:mpSchrader/gym-sokoban.git
cd gym-sokoban
pip install -e .外部ジム環境の使用方法に関する例をチェックアウトします。
すべての部屋は、壁、床、箱、箱のターゲット、プレーヤーの5つの主要な要素で構成されています。ボックスターゲットと重複するかどうかにかかわらず、異なる状態を持っている可能性があります。
| タイプ | 州 | グラフィック | TinyWorld |
|---|---|---|---|
| 壁 | 静的 | ![]() | ![]() |
| 床 | 空の | ![]() | ![]() |
| ボックスターゲット | 空の | ![]() | ![]() |
| 箱 | オフターゲット | ![]() | ![]() |
| 箱 | ターゲットについて | ![]() | ![]() |
| プレーヤー | オフターゲット | ![]() | ![]() |
| プレーヤー | ターゲットについて | ![]() | ![]() |
このゲームは、環境と対話するための9つのアクションを提供します。アクションをプッシュして、方向を上げて、下、左と右に移動します。操作なしアクションは無効なアクションであり、環境では何も変更しません。実際のアクションへのアクション番号のマッピングは次のように見えます
| アクション | id |
|---|---|
| 操作なし | 0 |
| 押し上げます | 1 |
| 押し下げます | 2 |
| 左に押します | 3 |
| 右に押します | 4 |
| 上に移動します | 5 |
| 下に移動します | 6 |
| 左に移動します | 7 |
| 右に移動します | 8 |
移動方向に自由フィールドがある場合は、単純に移動します。つまり、ブロッキングボックスや壁がないことを意味します。
プッシュプッシュは、ボックスの後ろの次のフィールドが無料の場合、隣接するボックスを移動しようとします。これは、箱を押すことができないことを意味します。隣接するフィールドにボックスがない場合、プッシュアクションは同じ方向に移動するように処理されます。
ターゲットにすべてを押してゲームを終了すると、最後のステップで10の報酬が得られます。また、ボックスをターゲットの上またはオフに押し込むと、それぞれ-1の報酬が与えられます。さらに、すべてのステップで-0.1の報酬が与えられます。これは、多くのステップで解決策を罰します。
| 理由 | 褒美 |
|---|---|
| ステップを実行します | -0.1 |
| ターゲットにボックスを押します | 1.0 |
| ターゲットからボックスを押します | -1.0 |
| ターゲットにすべてのボックスを押します | 10.0 |
ソコバン環境がロードまたはリセットされるたびに、新しい部屋がランダムに生成されます。世代は、トポロジの生成、ターゲットとプレイヤーの配置、逆演奏の3つのフェーズで構成されています。
壁と空の床で構成される部屋の基本的なトポロジを生成するために、ランダムウォークに基づいており、確率0.35でその方向が変化します。現在の位置を中心としたすべてのステップで、フィールドのパターンは空のスペースに設定されています。使用されるパターンは、図2にあります。

図2:トポロジを作成するためのマスク
このフェーズ中、すべてのNボックスターゲットを含むプレーヤーは、ランダムに選択された空間に配置されます。
これは、解決可能な部屋を確保するための重要な段階です。現在、Sokobanは逆ファッションで演奏され、プレイヤーは箱を移動してプルすることができます。このフェーズの目標は、部屋のスコアが最も高い部屋の状態を見つけることで、深さの最初の検索です。検索中に探索されたすべての部屋について、以下に示す方程式で部屋のスコアが計算されます。方程式は、部屋の難易度を評価するためのヒューリスティックなアプローチです。 BoxSwapsは、プレーヤーがボックスを変更してプルする回数をカウントします。 BoxDisplacementは、特定のボックスとそのOrigin Boxターゲットの間のマンハッタンの距離です。少なくとも1つのボックスがターゲット上にある限り、ルームスコアは常に0です。
Sokobanには、部屋のサイズ、ボックス数、レンダリングモード、またはルールなど、さまざまなバリエーションがあります。
通常のソコバンレンダリングに加えて、各構成は、グリッドサイズに等しいピクセルサイズを持つTinyWorldとしてレンダリングできます。小さな世界としてレンダリングされる環境を取得するには、レンダリングモードの前にtiny_を追加するだけです。例: env.render('tiny_rgb_array', scale=scale_tiny) 。スケールにより、レンダリングされた小さな世界観察のサイズを増やすことができます。レンダリングモードと組み合わせてスケールを使用して、 humanまたはrgb_arrayは出力サイズに影響しません。利用可能なレンダリングモードは次のとおりです。
| モード | 説明 |
|---|---|
| RGB_ARRAY | よく見える2D RGB画像 |
| 人間 | 画面に現在の状態を表示します |
| tiny_rgb_array | 部屋の1つの要素を説明する各ピクセル |
| tiny_human | 画面に小さなRGB_ARRAYを表示します |
使用可能な部屋の構成は、下の表に示されています。
| 部屋ID | グリッドサイズ | ピクセル | #boxes | 例 | TinyWorld |
|---|---|---|---|---|---|
| Sokoban-V0 | 10x10 | 160x160 | 3 | ![]() | ![]() |
| Sokoban-V1 | 10x10 | 160x160 | 4 | ![]() | ![]() |
| Sokoban-V2 | 10x10 | 160x160 | 5 | ![]() | ![]() |
| Sokoban-Small-V0 | 7x7 | 112x112 | 2 | ![]() | ![]() |
| Sokoban-Small-V1 | 7x7 | 112x112 | 3 | ![]() | ![]() |
| Sokoban-Large-V0 | 13x11 | 208x176 | 3 | ![]() | ![]() |
| Sokoban-Large-V1 | 13x11 | 208x176 | 4 | ![]() | ![]() |
| Sokoban-Large-V2 | 13x11 | 208x176 | 5 | ![]() | ![]() |
| Sokoban-Huge-V0 | 13x13 | 208x208 | 5 | ![]() | ![]() |
特にラップトップでは、大きな部屋が作成されるまでに時間がかかる場合があることに注意してください。
ソコバンの定期的なゲームに加えて、このリポジトリはバリエーションを実装または実装します。これにより、ゲームが容易または複雑になる可能性があります。異なる点を除いて、バリエーションは小さな世界のバージョンを実装していません。
| 変化 | まとめ | 予想される難易度 | 例 | 小さな世界 | 状態 | 詳細 |
|---|---|---|---|---|---|---|
| ターゲットを固定しました | すべてのボックスを同じ色でターゲットに押し込む必要があります。 | もっと難しい | ![]() | はい | 実装 | readme |
| 複数のプレーヤー | 部屋には2人のプレイヤーがいます。すべてのラウンド2人のプレーヤーのうち1人を使用できます。 2人のプレイヤー間で動きの順序はありません。 | もっと難しい | ![]() | はい | 実装 | readme |
| プッシュ&プル | プレイヤーはボックスを押すだけでなく、それらを引くこともできます。したがって、もう不可逆的な動きは存在しません。 | より簡単に | ![]() | はい | 実装 | readme |
| BoxOban | DeepMindが事前に発生したSokoban Puzzlesによる使用。 | 似ている | ![]() | はい | 実装 | readme |
このリポジトリを調査に使用している場合は、次の情報で引用してください。
@misc{SchraderSokoban2018,
author = {Schrader, Max-Philipp B.},
title = {gym-sokoban},
year = {2018},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/mpSchrader/gym-sokoban}},
commit = {#CommitId}
}
このプロジェクトや他のプロジェクトについて話すために、自由に連絡してください。問題を作成するか、LinkedInにメールを送ってください。
あなたが終わりに到達し、プロジェクトに気づいた場合は、このプロジェクトを開始することで感謝を示してください。
このプロジェクトに自由に貢献して、リポジトリを分岐して、欠けているものは何でも実装してください。または、サポートが必要な場合や機能を追加したい場合に備えて、新しい問題を開きます。