Sokoban是日本倉庫門將和傳統視頻遊戲的日語。該遊戲是一個運輸難題,玩家必須在存儲位置/目標的房間中推動所有盒子。犯不可逆的錯誤的可能性使這些難題變得如此具有挑戰性,尤其是對於強化學習算法而言,這些難題大多缺乏思考的能力。
存儲庫根據呈現DeepMind的紙張想像的規則來實現遊戲,增強了深度加強學習的代理。房間的一代是隨機的,因此將允許訓練深層神經網絡,而不會在一組預定義的房間上過度擬合。
| 示例遊戲1 | 示例遊戲2 | 示例遊戲3 |
|---|---|---|
![]() | ![]() | ![]() |
pip install gym-sokobangit clone [email protected]:mpSchrader/gym-sokoban.git
cd gym-sokoban
pip install -e .結帳有關如何使用外部健身房環境的示例。
每個房間都由五個主要要素組成:牆壁,地板,盒子,盒子目標和一個玩家。無論是否與盒子目標重疊,他們可能都有不同的狀態。
| 類型 | 狀態 | 形象的 | 小世界 |
|---|---|---|---|
| 牆 | 靜止的 | ![]() | ![]() |
| 地面 | 空的 | ![]() | ![]() |
| 盒子目標 | 空的 | ![]() | ![]() |
| 盒子 | 關閉目標 | ![]() | ![]() |
| 盒子 | 在目標上 | ![]() | ![]() |
| 球員 | 關閉目標 | ![]() | ![]() |
| 球員 | 在目標上 | ![]() | ![]() |
該遊戲提供了9種與環境互動的動作。將動作推向向上,向下,左右向方向。無操作行動是一個無效的動作,它不會改變環境中的任何內容。將動作編號映射到實際動作的實際操作如下
| 行動 | ID |
|---|---|
| 沒有操作 | 0 |
| 伏地挺身 | 1 |
| 向下推 | 2 |
| 向左推 | 3 |
| 向右推 | 4 |
| 向上移動 | 5 |
| 向下移動 | 6 |
| 向左移動 | 7 |
| 向右移動 | 8 |
移動只需移動,如果方向上有一個自由場,則意味著沒有阻塞框或牆壁。
如果盒子後面的下一個字段是免費的,則推動嘗試將相鄰盒子移動。這意味著不可能推動盒子的鏈條推動。如果相鄰字段沒有盒子,則推動動作的處理方式與移動動作向相同方向相同。
在最後一步中,通過推動所有目標來完成比賽的獎勵。同樣將目標推入目標或關閉目標的獎勵分別為-1。此外,每個步驟都會給出-0.1的獎勵,這對解決方案進行了許多步驟。
| 原因 | 報酬 |
|---|---|
| 執行步驟 | -0.1 |
| 推箱目標 | 1.0 |
| 關閉目標 | -1.0 |
| 將所有盒子推到目標上 | 10.0 |
每次加載索托班環境或重置新房間時,都會隨機生成新房間。這一代人包括3個階段:拓撲生成,目標和玩家的位置以及反向演奏。
為了生成房間的基本拓撲,由牆壁和空地板組成,是基於隨機步行的,該步行以0.35的概率改變了方向。在以當前位置為中心的每個步驟,都設置為空的空間。可以在圖2中找到所使用的模式。

圖2:用於創建拓撲的面具
在此階段,包括所有n個框目標的播放器都放在隨機選擇的空空間上。
這是確保可解決空間的關鍵階段。現在,索科班以反向播放,玩家可以移動和拉箱子。此階段的目標是找到房間得分最高的房間狀態,並進行了深度搜索。在搜索過程中探索的每個房間是一個房間得分,按照以下方程計算。該方程是一種評估房間難度的啟發式方法。 BoxSwaps計算一個玩家更改盒子要拉的次數。 BoxDisplacement是特定盒子及其原點盒目標之間的曼哈頓距離。只要至少一個盒子在一個目標上,室內鏡頭始終為0。
索科班有許多不同的變化,例如:室大小,框數,渲染模式或規則。
除了常規的索托班渲染外,每種配置都可以呈現為TinyWorld,其像素大小等於網格大小。為了使環境呈現為一個小世界,只需在渲染模式的前面添加tiny_即可。例如: env.render('tiny_rgb_array', scale=scale_tiny) 。比例可以增加渲染的微小世界觀察的大小。將比例與渲染模式結合使用, human或rgb_array不會影響輸出大小。可用的渲染模式是:
| 模式 | 描述 |
|---|---|
| RGB_Array | 好看的2D RGB圖像 |
| 人類 | 在屏幕上顯示當前狀態 |
| tiny_rgb_array | 每個像素描述房間中的一個元素 |
| tiny_human | 在屏幕上顯示微小的RGB_Array |
可用的房間配置如下表所示。
| 房間ID | 網格大小 | 像素 | #框 | 例子 | 小世界 |
|---|---|---|---|---|---|
| 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-buge-V0 | 13x13 | 208x208 | 5 | ![]() | ![]() |
請注意,較大的房間可能需要一些時間才能創建,尤其是在筆記本電腦上。
除了常規的Sokoban遊戲外,該存儲庫實施或將實施變化,這可能會使遊戲更容易或更複雜。除了指出不同之外,變化沒有實現微小的版本。
| 變化 | 概括 | 預期的困難 | 例子 | 微小的世界 | 地位 | 細節 |
|---|---|---|---|---|---|---|
| 固定目標 | 每個盒子都必須用相同的顏色推到目標上。 | 更困難 | ![]() | 是的 | 實施的 | 讀書我 |
| 多個玩家 | 房間裡有兩個玩家。可以使用兩個球員中的每一輪。兩個球員之間沒有移動的順序。 | 更困難 | ![]() | 是的 | 實施的 | 讀書我 |
| 推和拉 | 玩家不僅可以推動盒子,還可以拉它們。因此,不再存在不可逆轉的舉動。 | 更輕鬆 | ![]() | 是的 | 實施的 | 讀書我 |
| Boxoban | 通過深態預生物的索科邦拼圖的用途。 | 相似的 | ![]() | 是的 | 實施的 | 讀書我 |
如果您使用此存儲庫進行研究,請用以下信息引用它:
@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上寄給我。
如果您到達結束並喜歡該項目,請通過啟動此項目來表示感謝。
通過分配存儲庫並實施您所缺少的一切,可以隨意為該項目做出貢獻。另外,請打開一個新問題,以防您需要幫助或想要添加功能。