introduzione
L' algoritmo Boids è una dimostrazione relativamente semplice del comportamento emergente in un gruppo. Ha tre regole principali, come descritto dal suo creatore, Craig Reynolds:
Il modello di floccaggio di base consiste in tre semplici comportamenti di governo che descrivono come un individuo fa muovere manovre in base alle posizioni e alle velocità dei suoi vicini compagni di gregge:
- Separazione : sterzare per evitare affollati compagni di gregge locali.
- Allineamento : dirigersi verso la rotta media dei compagni di gregge locali.
- Coesione : sterzare per spostarsi verso la posizione media dei compagni di gregge locali.
Ogni boid ha accesso diretto alla descrizione geometrica dell'intera scena, ma il floccaggio richiede che reagisca solo ai compagni di gregge all'interno di un certo piccolo quartiere attorno a sé. Il vicinato è caratterizzato da una distanza (misurata dal centro del boid) e da un angolo , misurato dalla direzione di volo del boid. I compagni di gruppo fuori da questo quartiere locale vengono ignorati. Il quartiere potrebbe essere considerato un modello di percezione limitata (come da pesci in acque torbide) ma è probabilmente più corretto pensarlo come la definizione della regione in cui i compagni di gregge influenzano uno sterzo a motore.
Non sono perfetto per spiegare le cose, quindi consiglio vivamente di controllare la fonte . Ha anche alcune foto super informative sul suo sito.
Sfida
Dato il numero di boid (entità simulate) e il numero di frame, genera un'animazione della simulazione.
- Le boid dovrebbero essere rese come un cerchio rosso, con una linea all'interno del cerchio che mostra la sua direzione, che è la direzione in cui punta la boid:
- L'angolo di ogni boid (come descritto da Reynolds) dovrebbe essere di 300 gradi. (non 360)
- L'intestazione iniziale e la posizione di ciascun boid dovrebbero essere uniformemente casuali (ma seminate, in modo che l'output sia ancora determinato), così come la posizione.
- Se il raggio del boid è 1, allora il raggio del vicinato dovrebbe essere 3.
- Il numero di boid sarà compreso tra 2 e 20.
- Il numero di fotogrammi sarà ovunque tra 1-5000
- L'animazione deve essere riprodotta con un minimo di 10 millisecondi per fotogramma e un massimo di 1 secondo volte il numero di boid. (2 boids = 2 secondi per frame max, 3 boids = 3 secondi per frame max, eccetera)
- L'animazione di output dovrebbe essere di almeno 5 raggi boid per 5 raggi boid, per metà del numero di boid. Quindi, la dimensione minima per 2 boid sarebbe 10 raggi boid per 10 raggi boid, la minima per 3 boids sarebbe 15 raggi boid per 15 raggi boet, eccetera.
- Il raggio di ogni boid deve essere un minimo di 5 pixel e un massimo di 50 pixel.
- La velocità di ogni boid deve essere limitata in modo che non si sposti più di 1/5 del suo raggio in un frame.
- L'output deve essere determinato, in modo che lo stesso input produca lo stesso output se eseguito più volte.
- Se un boid raggiunge un bordo, dovrebbe tornare dall'altra parte. Allo stesso modo, anche il quartiere intorno a ogni boid dovrebbe avvolgere i confini.
Regole per l'algoritmo
In questo caso, ogni boid ha intorno a sé un settore che si estende per 300 gradi, centrato sulla sua direzione. Qualsiasi altro boid in questo "quartiere" è considerato "vicino", o (per usare il termine di Reynolds) "compagni di gregge".
Ogni boid dovrebbe regolare la sua direzione per evitare collisioni e mantenere una distanza confortevole di un raggio boid con i suoi vicini. (Questo è l'aspetto "Separazione" dell'algoritmo. L'unico raggio di boid può essere bypassato, ma dovrebbe essere come un elastico, che ritorna in posizione.)
Ogni boid dovrebbe inoltre regolare la propria rotta in modo da essere più vicina alla media delle altre boid del vicinato, purché non interferisca con la prima regola. (Questo è l'aspetto "Allineamento" dell'algoritmo)
Ogni boid dovrebbe volgersi verso la posizione media dei suoi compagni di flock, purché ciò non causi collisioni o interferisca significativamente con la seconda regola.
Nel suo articolo sull'argomento , spiega questo come segue:
Per costruire un gregge simulato, iniziamo con un modello boid che supporta il volo geometrico. Aggiungiamo comportamenti che corrispondono alle forze opposte di evitare le collisioni e l'impulso di unirsi al gregge. Dichiarati brevemente come regole, e in ordine di precedenza decrescente, i comportamenti che portano al floccaggio simulato sono:
- Evitare le collisioni: evitare le collisioni con i compagni di gregge vicini
- Corrispondenza di velocità: tenta di abbinare la velocità con i compagni di flock vicini
- Centratura floccata: cerca di stare vicino ai compagni di gregge vicini
Descrizione più dettagliata del movimento:
- L'implementazione standard dell'algoritmo Boids di solito esegue un calcolo per ciascuna delle regole e la unisce.
- Per la prima regola, il boid passa attraverso l'elenco dei boid vicini nel suo vicinato, e se la distanza tra se stesso e il vicino è inferiore a un certo valore, un vettore che spinge il boid lontano dal suo vicino viene applicato alla direzione del boid.
- Per la seconda regola, il boid calcola l'intestazione media dei suoi vicini e aggiunge una piccola porzione (useremo 1/10 in questa sfida) della differenza tra l'intestazione corrente e l'intestazione media nella direzione corrente.
- Per la terza e ultima regola, il boid calcola la media delle posizioni dei suoi vicini, calcola un vettore che punta verso questa posizione. Questo vettore viene moltiplicato per un numero ancora più piccolo di quello utilizzato per la regola 2 (per questa sfida, verrà utilizzato 1/50) e applicato all'intestazione.
- Il boid viene quindi spostato nella direzione della sua direzione
Ecco una utile implementazione dello pseudocodice dell'algoritmo Boids.
Esempio di input e output
Ingresso:Produzione:5, 190 (5 boids, 190 frame)
Criterio vincente
Questo è code-golf , quindi vince la soluzione più piccola in byte.