คำแนะนำเชิงลึกสำหรับโปรเจ็กต์ที่น่าสนใจนี้โดยใช้ระบบหลายตัวแทน

การแนะนำ

เกี่ยวกับระบบหลายตัวแทน

ระบบหลายตัวแทน (หรือ "ระบบที่จัดการด้วยตนเอง") คือระบบคอมพิวเตอร์ที่ประกอบด้วยตัวแทนอัจฉริยะที่มีการโต้ตอบหลายตัว ระบบหลายตัวแทนสามารถแก้ไขปัญหาที่ยากหรือเป็นไปไม่ได้สำหรับตัวแทนแต่ละรายหรือระบบขนาดใหญ่ที่จะแก้ไข ความฉลาดอาจรวมถึงวิธีการที่มีระเบียบวิธี การทำงาน ขั้นตอน การค้นหาอัลกอริทึม หรือการเรียนรู้แบบเสริมกำลัง วิกิพีเดีย.

อย่างที่คุณเห็น การสร้างระบบหลายตัวแทนเป็นวิธีที่ชาญฉลาดในการจำลองและทำความเข้าใจระบบที่ซับซ้อนซึ่งมีพารามิเตอร์น้อยมาก เอเจนต์แต่ละรายต้องเป็นอิสระ ตระหนักถึงสภาพแวดล้อมภายในเครื่อง และไม่มีอำนาจเหนือเอเจนต์อื่นๆ คุณสามารถพบระบบประเภทนี้ได้ในการซื้อขายออนไลน์ การตอบสนองต่อภัยพิบัติ การเฝ้าระวัง การสร้างแบบจำลองโครงสร้าง และวิดีโอเกม เช่น 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

ถ้าอย่างนั้น เราแค่ต้องสุ่มเติมโลกของเราด้วยนก เท่านี้ก็เสร็จเรียบร้อย!

บทสรุป

อย่างที่คุณเห็น ระบบหลายตัวแทนเป็นเครื่องมือที่มีประสิทธิภาพในการทำความเข้าใจพฤติกรรมที่ซับซ้อนด้วยกฎง่ายๆ คุณสามารถขยายตัวอย่างนี้ได้โดยการเพิ่มสัตว์นักล่า สิ่งกีดขวาง ตำแหน่งอาหาร และรูปแบบต่างๆ ในลักษณะเฉพาะของเจ้าหน้าที่แต่ละคน

จินตนาการของคุณมีขีดจำกัด!