บทนำ
boids ขั้นตอนวิธีการคือการสาธิตค่อนข้างง่ายของพฤติกรรมฉุกเฉินในกลุ่ม มันมีกฎหลักสามข้อตามที่อธิบายโดยผู้สร้าง Craig Reynolds:
แบบจำลอง flocking ขั้นพื้นฐานประกอบด้วยพฤติกรรมการบังคับเลี้ยวแบบง่าย ๆ สามแบบซึ่งอธิบายถึงวิธีการซ้อมรบของแต่ละบุคคลโดยพิจารณาจากตำแหน่งและความเร็วของฝูงสัตว์ใกล้เคียง:
- การแยก : คัดท้ายเพื่อหลีกเลี่ยงการรวมฝูงเพื่อนในชุมชน
- การจัดตำแหน่ง : คัดท้ายไปยังส่วนหัวเฉลี่ยของฝูงแกะในท้องถิ่น
- การติดต่อกัน : คัดท้ายเพื่อย้ายไปยังตำแหน่งเฉลี่ยของฝูงเพื่อนในท้องถิ่น
แต่ละ boid มีการเข้าถึงโดยตรงกับคำอธิบายทางเรขาคณิตของฉากทั้งหมด แต่ flocking ต้องการให้มันตอบสนองต่อ flockmates ภายในละแวกเล็ก ๆ ที่อยู่รอบตัวเท่านั้น ละแวกใกล้เคียงมีลักษณะระยะทาง (วัดจากศูนย์กลางของ boid) และมุมวัดจากทิศทางการบินของ boid Flockmates ที่อยู่นอกพื้นที่ใกล้เคียงในพื้นที่จะถูกเพิกเฉย บริเวณใกล้เคียงอาจพิจารณารูปแบบของการรับรู้ที่ จำกัด (เช่นปลาในน้ำขุ่น) แต่มันอาจจะถูกต้องมากกว่าที่จะคิดว่ามันเป็นตัวกำหนดภูมิภาคซึ่งฝูงแกะที่มีอิทธิพลต่อการบังคับ boids
ผมไม่ได้สมบูรณ์แบบเมื่ออธิบายสิ่งดังนั้นฉันขอแนะนำให้ตรวจสอบจากแหล่งที่มา เขายังมีรูปภาพที่ให้ข้อมูลบางอย่างในเว็บไซต์ของเขา
ท้าทาย
กำหนดจำนวน boids (เอนทิตีจำลอง) และจำนวนเฟรมส่งออกแอนิเมชั่นของการจำลอง
- boids ควรจะแสดงผลเป็นวงกลมสีแดงโดยมีเส้นด้านในวงกลมแสดงส่วนหัวของมันซึ่งเป็นทิศทางที่ boid ชี้ไป:
- มุมของแต่ละ boid (ตามที่อธิบายโดย Reynolds) ควรเป็น 300 องศาเต็ม (ไม่ใช่ 360)
- ส่วนหัวและตำแหน่งเริ่มต้นของแต่ละ boid ควรสุ่มอย่างสม่ำเสมอ (แต่มีการหว่านเพื่อให้ผลลัพธ์ยังคงถูกกำหนด) เช่นเดียวกับตำแหน่ง
- ถ้ารัศมีของ boid เท่ากับ 1 มากกว่ารัศมีของละแวกนั้นควรเป็น 3
- จำนวน boids จะอยู่ที่ใดก็ได้ 2-20
- จำนวนเฟรมจะอยู่ที่ใดก็ได้ตั้งแต่ 1-5000
- ภาพเคลื่อนไหวควรเล่นด้วยอย่างน้อย 10 มิลลิวินาทีต่อเฟรมและสูงสุด 1 วินาทีคูณจำนวน boids (2 boids = 2 วินาทีต่อเฟรมสูงสุด 3 boids = 3 วินาทีต่อเฟรมสูงสุดและอื่น ๆ )
- แอนิเมชันเอาต์พุตควรมีอย่างน้อย 5 boid-radii โดย 5 boid-radii, คูณครึ่งหนึ่งของจำนวน boids ดังนั้นขนาดขั้นต่ำสำหรับ 2 boids คือ 10 boid-radii โดย 10 boid-radii ขั้นต่ำสำหรับ 3 boids คือ 15 boid-radii โดย 15 boid-radii และ cetera
- รัศมีของแต่ละ boid ต้องมีอย่างน้อย 5 พิกเซลและสูงสุด 50 พิกเซล
- ความเร็วของการเดินเรือแต่ละครั้งจำเป็นต้อง จำกัด เพื่อไม่ให้เคลื่อนที่ได้มากกว่า 1 ใน 5 ของรัศมีในหนึ่งเฟรม
- เอาต์พุตต้องถูกกำหนดเพื่อให้อินพุตเดียวกันจะสร้างเอาต์พุตเดียวกันหากรันหลายครั้ง
- หาก boid มาถึงเส้นขอบมันควรห่อกลับไปด้านอื่น ในทำนองเดียวกันละแวกใกล้เคียงแต่ละ boid ควรห่อรอบชายแดน
กฎสำหรับอัลกอริทึม
ในกรณีนี้แต่ละ boid มีเซกเตอร์อยู่รอบ ๆ ซึ่งประกอบไปด้วย 300 องศาโดยมีศูนย์กลางอยู่ที่ส่วนหัวของ boid boids อื่น ๆ ใน "พื้นที่ใกล้เคียง" นี้ถือเป็น "เพื่อนบ้าน" หรือ (เพื่อใช้คำว่า Reynolds) "flockmates"
ปลาแต่ละตัวควรปรับส่วนหัวเพื่อหลีกเลี่ยงการชนและรักษาระยะห่างจากรัศมี - หนึ่งกับเพื่อนบ้าน (นี่คือแง่มุม "การแยก" ของอัลกอริทึมหนึ่ง boid-radius อาจถูกบายพาส แต่มันควรจะเป็นเหมือนยางรัด
แต่ละ boid ควรปรับหัวเรื่องให้ใกล้เคียงกับส่วนหัวเฉลี่ยของ boids อื่น ๆ ในละแวกนั้นด้วยตราบใดที่มันไม่เข้าไปยุ่งกับกฎข้อแรก (นี่คือส่วน "การจัดตำแหน่ง" ของอัลกอริทึม)
ปลาแต่ละตัวควรหันไปหาตำแหน่งเฉลี่ยของฝูงเพื่อนตราบเท่าที่สิ่งนี้ไม่ทำให้เกิดการชนหรือรบกวนกฎที่สองอย่างมีนัยสำคัญ
ในบทความของเขาเกี่ยวกับเรื่องนี้เขาอธิบายสิ่งต่อไปนี้:
ในการสร้างฝูงจำลองเราเริ่มต้นด้วยรุ่น boid ที่รองรับการบินเชิงเรขาคณิต เราเพิ่มพฤติกรรมที่สอดคล้องกับกองกำลังของฝ่ายตรงข้ามของการหลีกเลี่ยงการชนและการกระตุ้นให้เข้าร่วมฝูง ระบุไว้สั้น ๆ เป็นกฎและเพื่อลดความสำคัญก่อนหน้านี้พฤติกรรมที่นำไปสู่การจำลอง flocking คือ:
- การหลีกเลี่ยงการปะทะกัน: หลีกเลี่ยงการปะทะกับฝูงเพื่อนใกล้เคียง
- การจับคู่ Velocity: พยายามจับคู่ Velocity กับ Flockmate ที่อยู่ใกล้เคียง
- Flock Centering: พยายามอยู่ใกล้กับฝูงแกะที่อยู่ใกล้เคียง
คำอธิบายรายละเอียดเพิ่มเติมของการเคลื่อนไหว:
- การใช้มาตรฐานของอัลกอริทึม Boids จะทำการคำนวณสำหรับแต่ละกฎและผสานเข้าด้วยกัน
- สำหรับกฎข้อแรก boid จะผ่านรายการ boids ที่อยู่ใกล้เคียงภายในละแวกนั้นและถ้าระยะห่างระหว่างตัวมันเองกับเพื่อนบ้านนั้นน้อยกว่าค่าที่แน่นอนเวกเตอร์ที่ผลักให้ boid นั้นออกจากเพื่อนบ้านจะถูกนำไปใช้กับส่วนหัวของ boid
- สำหรับกฎข้อที่สอง boid จะคำนวณส่วนหัวเฉลี่ยของเพื่อนบ้านและเพิ่มส่วนเล็ก ๆ (เราจะใช้ 1/10 ในการท้าทายนี้) ของความแตกต่างระหว่างส่วนหัวปัจจุบันและส่วนหัวเฉลี่ยกับส่วนหัวปัจจุบัน
- สำหรับกฎข้อที่สามและครั้งสุดท้าย boid เฉลี่ยตำแหน่งของเพื่อนบ้านคำนวณเวกเตอร์ที่ชี้ไปยังตำแหน่งนี้ เวกเตอร์นี้ถูกคูณด้วยจำนวนที่น้อยกว่าที่ใช้สำหรับกฎ 2 (สำหรับการท้าทายนี้จะใช้ 1/50) และนำไปใช้กับหัวเรื่อง
- จากนั้น boid จะเคลื่อนที่ไปในทิศทางที่มุ่งหน้าไป
นี่คือการดำเนินการ pseudocode ที่เป็นประโยชน์ของอัลกอริทึม Boids
ตัวอย่างอินพุตและเอาต์พุต
การป้อนข้อมูล:เอาท์พุท:5, 190 (5 boids, 190 เฟรม)
เกณฑ์การชนะ
นี่คือโค้ดกอล์ฟดังนั้นทางออกที่เล็กที่สุดในหน่วยไบต์ชนะ