Sokoban เป็นชาวญี่ปุ่นสำหรับผู้ดูแลคลังสินค้าและวิดีโอเกมแบบดั้งเดิม เกมดังกล่าวเป็นปริศนาการขนส่งซึ่งผู้เล่นจะต้องผลักดันกล่องทั้งหมดในห้องในสถานที่จัดเก็บ/ เป้าหมาย ความเป็นไปได้ของการทำผิดพลาดที่กลับไม่ได้ทำให้ปริศนาเหล่านี้ท้าทายโดยเฉพาะอย่างยิ่งสำหรับอัลกอริทึมการเรียนรู้การเสริมแรงซึ่งส่วนใหญ่ขาดความสามารถในการคิดล่วงหน้า
ที่เก็บใช้เกม Sokoban ตามกฎที่นำเสนอตัวแทนของ DeepMind Imagination Augmented Agent สำหรับการเรียนรู้การเสริมแรงอย่างลึกซึ้ง การสร้างห้องพักเป็นแบบสุ่มดังนั้นจะช่วยให้สามารถฝึกอบรมเครือข่ายประสาทลึกโดยไม่ต้องใช้งานมากเกินไปในชุดของห้องที่กำหนดไว้ล่วงหน้า
| ตัวอย่างเกม 1 | ตัวอย่างเกม 2 | ตัวอย่างเกม 3 |
|---|---|---|
![]() | ![]() | ![]() |
pip install gym-sokobangit clone [email protected]:mpSchrader/gym-sokoban.git
cd gym-sokoban
pip install -e .ชำระเงินตัวอย่างเกี่ยวกับวิธีการใช้สภาพแวดล้อมโรงยิมภายนอก
ทุกห้องประกอบด้วยองค์ประกอบหลักห้าประการ ได้แก่ ผนังพื้นกล่องเป้าหมายกล่องและผู้เล่น พวกเขาอาจมีสถานะที่แตกต่างกันไม่ว่าพวกเขาจะทับซ้อนกับเป้าหมายกล่องหรือไม่
| พิมพ์ | สถานะ | กราฟิก | tinyworld |
|---|---|---|---|
| กำแพง | คงที่ | ![]() | ![]() |
| พื้น | ว่างเปล่า | ![]() | ![]() |
| เป้าหมายกล่อง | ว่างเปล่า | ![]() | ![]() |
| กล่อง | ปิดเป้าหมาย | ![]() | ![]() |
| กล่อง | ตามเป้าหมาย | ![]() | ![]() |
| ผู้เล่น | ปิดเป้าหมาย | ![]() | ![]() |
| ผู้เล่น | ตามเป้าหมาย | ![]() | ![]() |
เกมนี้มีการกระทำ 9 อย่างเพื่อโต้ตอบกับสภาพแวดล้อม ผลักดันและย้ายการกระทำไปยังทิศทางขึ้นลงซ้ายและขวา การดำเนินการที่ไม่มีการดำเนินการเป็นการกระทำที่เป็นโมฆะซึ่งไม่เปลี่ยนแปลงอะไรในสภาพแวดล้อม การแม็พของหมายเลขการกระทำไปยังการกระทำจริงจะมีดังนี้
| การกระทำ | รหัสประจำตัว |
|---|---|
| ไม่มีการผ่าตัด | 0 |
| ตอกย้ำ | 1 |
| ชุบใจ | 2 |
| ดันซ้าย | 3 |
| ดันขวา | 4 |
| เลื่อนขึ้น | 5 |
| เลื่อนลง | 6 |
| ย้ายไปทางซ้าย | 7 |
| ย้ายไปทางขวา | 8 |
ย้าย เพียงแค่เคลื่อนที่หากมีสนามฟรีในทิศทางซึ่งหมายความว่าไม่มีการปิดกั้นกล่องหรือผนัง
Push Push พยายามย้ายกล่องที่อยู่ติดกันหากฟิลด์ถัดไปด้านหลังกล่องฟรี ซึ่งหมายความว่าไม่มีการผลักดันโซ่ของกล่อง ในกรณีที่ไม่มีกล่องที่สนามที่อยู่ติดกันการดำเนินการผลักดันจะถูกจัดการในลักษณะเดียวกับการกระทำการเคลื่อนไหวในทิศทางเดียวกัน
การจบเกมโดยการผลักดันทั้งหมดในเป้าหมายจะได้รับรางวัล 10 ในขั้นตอนสุดท้าย การผลักดันกล่องเปิดหรือปิดเป้าหมายจะให้รางวัล 1 ตามลำดับ -1 ตามลำดับ นอกจากนี้ยังได้รับรางวัล -0.1 สำหรับทุกขั้นตอนสิ่งนี้ลงโทษโซลูชันด้วยหลายขั้นตอน
| เหตุผล | รางวัล |
|---|---|
| ทำตามขั้นตอน | -0.1 |
| กดกล่องบนเป้าหมาย | 1.0 |
| กด Box Off Target | -1.0 |
| ดันกล่องทั้งหมดไปยังเป้าหมาย | 10.0 |
ทุกครั้งที่สภาพแวดล้อม Sokoban ถูกโหลดหรือรีเซ็ตห้องใหม่จะถูกสร้างขึ้นแบบสุ่ม รุ่นประกอบด้วย 3 ขั้นตอน: การสร้างทอพอโลยีการวางเป้าหมายและผู้เล่นและการเล่นแบบย้อนกลับ
ในการสร้างทอพอโลยีพื้นฐานของห้องซึ่งประกอบด้วยผนังและพื้นว่างจะขึ้นอยู่กับการเดินแบบสุ่มซึ่งเปลี่ยนทิศทางของมันที่ความน่าจะเป็น 0.35 ในทุกขั้นตอนที่อยู่กึ่งกลางที่ตำแหน่งปัจจุบันรูปแบบของฟิลด์ถูกตั้งค่าเป็นพื้นที่ว่าง รูปแบบที่ใช้สามารถพบได้ในรูปที่ 2

รูปที่ 2: หน้ากากสำหรับการสร้างโทโพโลยี
ในช่วงนี้ผู้เล่นรวมถึงเป้าหมาย N ทั้งหมดจะถูกวางไว้ในพื้นที่ว่างที่สุ่มเลือก
นี่คือขั้นตอนสำคัญเพื่อให้แน่ใจว่าห้องที่สามารถแก้ไขได้ ตอนนี้ Sokoban เล่นในแบบย้อนกลับซึ่งผู้เล่นสามารถย้ายและดึงกล่องได้ เป้าหมายของขั้นตอนนี้คือการหาสถานะห้องด้วยคะแนนห้องสูงสุดพร้อมการค้นหาครั้งแรกที่ลึก สำหรับทุกห้องที่สำรวจในระหว่างการค้นหาจะคำนวณคะแนนห้องด้วยสมการที่แสดงด้านล่าง สมการเป็นวิธีการแก้ปัญหาในการประเมินความยากลำบากของห้อง BoxSwaps นับจำนวนครั้งที่ผู้เล่นเปลี่ยนกล่องเป็นดึง BoxDisplacement เป็นระยะทางของแมนฮัตตันระหว่างกล่องเฉพาะและเป้าหมายกล่องต้นทาง ตราบใดที่กล่องอย่างน้อยหนึ่งกล่องอยู่ในเป้าหมายที่ห้องพักจะเป็น 0 เสมอ
Sokoban มีรูปแบบที่แตกต่างกันมากมายเช่นขนาดห้องจำนวนกล่องโหมดการแสดงผลหรือกฎ
นอกจากการเรนเดอร์ Sokoban ปกติแต่ละการกำหนดค่าสามารถแสดงผลเป็น 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 ห้องพัก | ขนาดกริด | พิกเซล | #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 | ![]() | ![]() |
โปรดทราบว่าห้องขนาดใหญ่อาจใช้เวลาสักครู่ในการสร้างโดยเฉพาะบนแล็ปท็อป
นอกเหนือจากเกมปกติของ Sokoban ที่เก็บนี้ใช้งานหรือจะใช้การเปลี่ยนแปลงซึ่งอาจทำให้เกมง่ายขึ้นหรือซับซ้อนกว่า ยกเว้นที่ระบุไว้แตกต่างกันความแปรปรวนไม่ได้ใช้เวอร์ชันเล็ก ๆ ในโลก
| การเปลี่ยนแปลง | สรุป | ความยากลำบากที่คาดหวัง | ตัวอย่าง | โลกเล็ก ๆ | สถานะ | รายละเอียด |
|---|---|---|---|---|---|---|
| กำหนดเป้าหมาย | ทุกกล่องจะต้องถูกผลักไปที่เป้าหมายด้วยสีเดียวกัน | ยากขึ้น | ![]() | ใช่ | ดำเนินการ | readme |
| ผู้เล่นหลายคน | มีผู้เล่นสองคนในห้อง ทุกรอบหนึ่งในสองผู้เล่นสามารถใช้งานได้ ไม่มีคำสั่งของการเคลื่อนไหวระหว่างผู้เล่นสองคน | ยากขึ้น | ![]() | ใช่ | ดำเนินการ | readme |
| ดันและดึง | ผู้เล่นไม่เพียง แต่ดันกล่อง แต่ยังดึงพวกเขาด้วย ดังนั้นจึงไม่มีการเคลื่อนไหวที่กลับไม่ได้อีกต่อไป | ง่ายขึ้น | ![]() | ใช่ | ดำเนินการ | readme |
| Boxoban | การใช้งานโดยปริศนา Sokoban แบบ deepmind pregenerated | คล้ายกัน | ![]() | ใช่ | ดำเนินการ | 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
หากคุณถึงจุดสิ้นสุดและชอบโครงการโปรด แสดงความขอบคุณโดยเริ่มโครงการนี้
อย่าลังเลที่จะมีส่วนร่วมในโครงการนี้โดยการหา repo และใช้สิ่งที่คุณขาดหายไป หรือเปิดปัญหาใหม่ในกรณีที่คุณต้องการความช่วยเหลือหรือต้องการเพิ่มคุณสมบัติ