Giriş
Boids Algoritması Bir gruptaki acil davranış nispeten basit bir göstergesidir. Yaratıcısı Craig Reynolds tarafından açıklandığı gibi üç ana kuralı vardır:
Temel akın modeli, tek bir örgülü manevraların, yakın akrabalarının pozisyonlarına ve hızlarına göre nasıl hareket ettiğini tanımlayan üç basit direksiyon davranışından oluşur:
- Ayrılma : yerel sürüleri önlemek için yönlendirin.
- Hizalama : yerel sürü arkadaşlarının ortalama pozisyonuna yönelir.
- Uyum : yerel sürü arkadaşlarının ortalama konumuna doğru yönelmek.
Her bir satın alma, tüm sahnenin geometrik açıklamasına doğrudan erişime sahiptir, ancak akın, yalnızca etrafındaki belirli bir küçük mahalledeki akın arkadaşlarına tepki vermesini gerektirir. Mahalle, (uçuşun merkezinden ölçülen) bir mesafe ve borunun uçuş yönünden ölçülen bir açı ile karakterize edilir . Bu yerel mahallenin dışındaki sürü arkadaşları yok sayılır. Komşuluk sınırlı bir algı modeli olarak düşünülebilir (bulanık sudaki balıklar gibi), ancak bunu akın arkadaşlarının bir ihale yönlendirmesini etkilediği bölgeyi tanımlamak olarak düşünmek daha doğrudur.
Bir şeyleri açıklarken mükemmel değilim, bu yüzden kaynağı kontrol etmenizi tavsiye ederim . Ayrıca sitesinde süper bilgilendirici resimler var.
Meydan okuma
Teklif sayısı (simüle edilen varlıklar) ve kare sayısı göz önüne alındığında, simülasyonun bir animasyonunu çıktılayın.
- Boids, dairenin içindeki bir çizgi başlığını gösteren, boid'in işaret ettiği yön olan kırmızı bir daire olarak oluşturulmalıdır:
- Her bir örgünün açısı (Reynolds tarafından açıklandığı gibi) tam 300 derece olmalıdır. (360 değil)
- Her bir alımın başlangıç pozisyonu ve pozisyonu, aynı zamanda pozisyonun yanı sıra homojen olarak rastgele olmalıdır (ancak tohumlanmış, böylece çıktı hala belirlenebilir).
- Boid yarıçapı 1 ise, mahallenin yarıçapı 3 olmalıdır.
- Teklif sayısı 2-20 arasında herhangi bir yerde olacaktır.
- Kare sayısı 1-5000 arasında herhangi bir yerde olacaktır
- Animasyon, çerçeve başına minimum 10 milisaniye ve teklif sayısının maksimum 1 saniyesi ile oynatılmalıdır. (2 teklif = maksimum çerçeve başına 2 saniye, 3 teklif = maksimum çerçeve başına 3 saniye, vb)
- Çıktı animasyonu en az 5 boid-radii x 5 boid-radii, boid sayısının yarısı kadardır. Bu nedenle, 2 teklif için minimum boyut 10 boidian yarıçapı ile 10 boid-yarıçap, 3 boid yarıçapı için 15 boid yarıçap, et cetera olacaktır.
- Her bir örgünün yarıçapı en az 5 piksel ve en fazla 50 piksel olmalıdır.
- Her çerçevenin hızı, yarıçapının 1 / 5'inden fazlasını tek bir çerçevede hareket etmeyecek şekilde sınırlanmalıdır.
- Çıktı belirlenmelidir, böylece aynı girdi birden çok kez çalıştırılırsa aynı çıktıyı üretir.
- Bir sınır bir sınıra ulaşırsa, diğer tarafa geri sarılmalıdır. Benzer şekilde, her bir bölgenin etrafındaki mahalle de sınırların etrafına sarılmalıdır.
Algoritma kuralları
Bu durumda, her bir borcun etrafında, borunun istikametini merkez alan 300 dereceyi kapsayan bir sektör vardır. Bu "mahalledeki" diğer tüm teklifler "komşular" veya (Reynolds'un terimini kullanmak için) "sürü arkadaşları" olarak kabul edilir.
Her bir teklif, çarpışmalardan kaçınmak için yönünü ayarlamalı ve komşularıyla birlikte bir sınır yarıçapı arasında rahat bir mesafe bırakmalıdır. (Bu, algoritmanın "Ayırma" yönüdür. Tek yarıçapı atlanabilir, ancak yerine oturan bir lastik bant gibi olmalıdır.)
Her bir teklif, ilk kurala müdahale etmediği sürece, başlığını mahallesindeki diğer tekliflerin ortalama pozisyonuna daha yakın olacak şekilde ayarlamalıdır. (Bu algoritmanın "Hizalama" yönü)
Her bir çarpışma, çarpışmaya neden olmadığı veya ikinci kurala önemli ölçüde müdahale etmediği sürece, sürü arkadaşlarının ortalama konumuna doğru dönmelidir.
Konuyla ilgili makalesinde bunu şöyle açıklıyor:
Simüle edilmiş bir sürü oluşturmak için geometrik uçuşu destekleyen bir modelle başlıyoruz. Çarpışmadan kaçınma karşıt güçlerine ve sürüye katılma isteğine karşılık gelen davranışlar ekliyoruz. Kısaca kural olarak belirtilir ve azalan önceliğe göre, simüle edilmiş akınlara neden olan davranışlar şunlardır:
- Çarpışmadan Kaçınma: Yakındaki sürü arkadaşlarıyla çarpışmalardan kaçının
- Hız Eşleme: hızı, yakın sürü arkadaşlarıyla eşleştirmeye çalışın
- Flok Centering: Flock arkadaşlarına yakın kalmaya çalışın
Hareketin daha ayrıntılı açıklaması:
- Boids Algoritmasının standart uygulaması genellikle kuralların her biri için bir hesaplama yapar ve onu birleştirir.
- İlk kural için, satın alma, komşusu içindeki komşu kazanlar listesinden geçer ve eğer kendisi ile komşu arasındaki mesafe belirli bir değerden daha azsa, sınırı komşu olan bir vektör, komitenin başlığına uygulanır.
- İkinci kural için, teklif komşularının ortalama pozisyonunu hesaplar ve mevcut pozisyonu ile mevcut pozisyonu arasındaki ortalama pozisyon arasındaki farkın küçük bir kısmını (bu zorlukta 1/10 kullanacağız) ekler.
- Üçüncü ve son kural için, komşularının konumlarını ortalar, bu konumu işaret eden bir vektör hesaplar. Bu vektör, kural 2 için kullanılandan daha da küçük bir sayı ile çarpılır (bu zorluk için 1/50 kullanılır) ve başlığa uygulanır.
- Daha sonra bobin istikameti yönünde hareket eder
İşte Boids Algoritmasının yararlı bir sözde kod uygulaması.
Örnek Giriş ve Çıkış
Giriş:Çıktı:5190 (5 boids, 190 çerçeve)
Kazanan kriter
Bu kod golf , bu yüzden bayttaki en küçük çözüm kazanır.