คำแนะนำเชิงลึกสำหรับโปรเจ็กต์ที่น่าสนใจนี้โดยใช้ระบบหลายตัวแทน
การแนะนำ
เกี่ยวกับระบบหลายตัวแทน
ระบบหลายตัวแทน (หรือ "ระบบที่จัดการด้วยตนเอง") คือระบบคอมพิวเตอร์ที่ประกอบด้วยตัวแทนอัจฉริยะที่มีการโต้ตอบหลายตัว ระบบหลายตัวแทนสามารถแก้ไขปัญหาที่ยากหรือเป็นไปไม่ได้สำหรับตัวแทนแต่ละรายหรือระบบขนาดใหญ่ที่จะแก้ไข ความฉลาดอาจรวมถึงวิธีการที่มีระเบียบวิธี การทำงาน ขั้นตอน การค้นหาอัลกอริทึม หรือการเรียนรู้แบบเสริมกำลัง วิกิพีเดีย.
อย่างที่คุณเห็น การสร้างระบบหลายตัวแทนเป็นวิธีที่ชาญฉลาดในการจำลองและทำความเข้าใจระบบที่ซับซ้อนซึ่งมีพารามิเตอร์น้อยมาก เอเจนต์แต่ละรายต้องเป็นอิสระ ตระหนักถึงสภาพแวดล้อมภายในเครื่อง และไม่มีอำนาจเหนือเอเจนต์อื่นๆ คุณสามารถพบระบบประเภทนี้ได้ในการซื้อขายออนไลน์ การตอบสนองต่อภัยพิบัติ การเฝ้าระวัง การสร้างแบบจำลองโครงสร้าง และวิดีโอเกม เช่น Sim City
เป้าหมาย
วัตถุประสงค์หลักของบทความนี้คือเพื่อทำความคุ้นเคยกับระบบหลายตัวแทนและทดลองกับ "Flutter Flame" เพื่อทำเช่นนั้น ฉันจึงตัดสินใจจำลองฝูงนก ประการแรก การมองดูเป็นเรื่องที่น่าพึงพอใจมาก และประการที่สอง เราสามารถปรับแต่งพารามิเตอร์ เช่น ความสามารถในการบินหรือขอบเขตการมองเห็น และดูว่ามันส่งผลต่อพฤติกรรมการรับรู้ของพวกเขาอย่างไร
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ใน บทความนี้
TL;DR
รับโปรเจ็กต์เต็มบน GitHub ของฉัน เล่นกับมันหรือ "ดูมันอยู่ที่นั่น"
ภาพรวม
ก่อนที่จะเล่น (สักหน่อย) กับ Flame เราจำเป็นต้องกำหนดโมเดลของเราก่อน มันต้องการพิกัด 2 มิติ, ความเร็ว, ทิศทาง, มุมมองสนาม, ระยะการมองเห็น และข้อจำกัดเพื่อจำกัดความคล่องแคล่ว สิ่งเหล่านี้ทั้งหมดจะแสดงไว้ใน "ระบบหน่วยสากล"
และการใช้ความสามารถเหล่านั้นจะต้องสามารถปฏิบัติตามกฎสามข้อ:
- เคลื่อนตัวเข้าหาศูนย์กลางฝูงเพื่อหลีกเลี่ยงผู้ล่า
- ย้ายออกห่างจากนกตัวอื่นเพื่อหลีกเลี่ยงการชนกัน
- บินไปในทิศทางเดียวกับนกที่ใกล้ที่สุดในขอบเขตการมองเห็น
สุดท้ายนี้ เพื่อให้ใกล้เคียงกับขนาดในโลกแห่งความเป็นจริง การจำลองจะทำงานแบบเต็มหน้าจอ และแต่ละพิกเซลจะเท่ากับหนึ่งเมตร นอกจากนี้ เราจะถือว่าสภาพแวดล้อมเป็น toric ซึ่งหมายความว่ามุมบนซ้ายจะเชื่อมต่อกับมุมล่างขวา
มาเริ่มกันเลย
โดยปกติแล้ว ฉันชอบสร้างข้อมูล environment
ที่จะมอบให้กับ agents
ในระหว่างการจำลอง ในกรณีนี้เราไม่ต้องการอะไรมาก
เพื่อให้ทุกอย่างดูน่าสนใจยิ่งขึ้น เราจะสร้าง Agent
สองประเภทซึ่งเป็นตัวแทนของนกสองสายพันธุ์ที่แตกต่างกัน นกแต่ละตัวบินตามชนิดของมัน
ในระหว่างการคำนวณการเรนเดอร์แต่ละครั้ง นกจะดำเนินการ action
จำลองพฤติกรรมของมัน และ updatePositionInToricSpace
จะจัดการกับข้อจำกัด Toric ของสภาพแวดล้อมของเรา
วิธีการหลักที่ต้องดูคือ action
เมื่อเราไปถึงการใช้งานจริง พฤติกรรมก็จะอยู่ตรงนี้แหละ dt
คือเวลาเดลต้าที่ผ่านไประหว่างสองการกระทำ โดยแสดงเป็นวินาที
การจำลองของเราจะจัดการกับ pigeon
และ sparrow
พวกมันมีลักษณะการบินเหมือนกัน แต่เราจะถือว่านกกระจอกนั้นเร็วกว่าและว่องไวกว่านกพิราบ
วิธีการช่วยเหลือ
เมื่อใดก็ตามที่นกพยายามที่จะบินเกินความเร็วสูงสุด เราจะปรับเวกเตอร์ความเร็วของมัน
วิธีพฤติกรรมควรคำนึงถึงตัวแทนใน
fieldOfView
และdistanceView
ของตัวแทนปัจจุบันเท่านั้น คุณไม่สามารถมองเห็นสิ่งที่อยู่ด้านหลังศีรษะของคุณได้
วิธีการประพฤติตน
กฎข้อแรก เฉลี่ยตำแหน่งของพวกเขา คำนวณเวกเตอร์ใหม่เข้าหาเวกเตอร์ และใช้ปัจจัยการทำงานร่วมกันเพื่อควบคุมความเร็วที่พวกมันมาบรรจบกัน
กฎข้อที่สอง คำนวณเวกเตอร์การหลีกเลี่ยงใหม่ซึ่งแต่ละอันอยู่ใกล้กว่าช่วงการชนกัน และใช้ปัจจัยการแยกเพื่อจัดการกับความเร็วที่พวกมันเปลี่ยนวิถี
กฎข้อที่สาม ความเร็วเพื่อนบ้านโดยเฉลี่ย และใช้ปัจจัยการจัดตำแหน่งเพื่อจัดการกับความเร็วที่เราเปลี่ยนความเร็ว
ในที่สุด
ทั้งหมดนี้นำไปสู่พฤติกรรมที่แสดงในวิธี action
ด้านล่าง เคลื่อนตัวเข้าหาศูนย์กลางฝูง หลีกเลี่ยงการชนกับนกทุกตัว และบินไปในทิศทาง/ความเร็วเดียวกัน เช่นเดียวกับคลาส Sparrow
สุดท้าย เราต้องสร้าง Component
สำหรับนกแต่ละประเภท นี่คือคลาสที่ Flame จะใช้สร้างนกของเรา
action
ถูกแทนที่เพียงเพื่ออัปเดตเวกเตอร์ position
ที่ได้รับจาก PositionComponent
และ dt
เป็นเพียงเวลาเดลต้าระหว่างสองเฟรม และเราทุกคนรู้ดีว่า distance = speed * time
ถ้าอย่างนั้น เราแค่ต้องสุ่มเติมโลกของเราด้วยนก เท่านี้ก็เสร็จเรียบร้อย!
บทสรุป
อย่างที่คุณเห็น ระบบหลายตัวแทนเป็นเครื่องมือที่มีประสิทธิภาพในการทำความเข้าใจพฤติกรรมที่ซับซ้อนด้วยกฎง่ายๆ คุณสามารถขยายตัวอย่างนี้ได้โดยการเพิ่มสัตว์นักล่า สิ่งกีดขวาง ตำแหน่งอาหาร และรูปแบบต่างๆ ในลักษณะเฉพาะของเจ้าหน้าที่แต่ละคน
จินตนาการของคุณมีขีดจำกัด!