Pode-se dizer que se trata de um “sistema multiagente┮": cada coralista recebe informações sobre o mundo e sobre os demais coralistas, e deve decidir para qual direção ele quer ir. Esse processo acontece iterativamente, para cada bolinha, 30 vezes por segundo.
Seja \(n \in \mathbb{N}\), e \(V\) um conjunto. Defina uma família de digrafos \( \{G_k\}_{k \in \mathbb{N}} \) tal que, para todo \(k \in \mathbb{N}\), tem-se \(G_k := (V, A_k)\) para algum \(A_k \subseteq V^2\). Ainda para cada \(k \in \mathbb{N}\), existe \(p_k(v) \in \mathbb{R}^n\), dita a posição de \(v\) no instante \(k\) (no algoritmo, \(p_0(v)\) é sorteado para todo \(v\)).
Defina
Isso é, \(\angle\) dá o ângulo entre dois vetores. Seja \(\alpha \in [0, 2\pi]\). Para todo \(k \in \mathbb{N}\), tem-se que \( vu \in A_k \) se e somente se não existe nenhum \(w \in V\) tal que
e
Ou seja, só há um vértice de \(v\) para \(u\) se não existir nenhum outro vértice mais próximo de \(v\) e “angularmente próximo” de \(u\).
Defina agora a função \(r : \mathbb{R}^n \rightarrow \mathbb{R}^n\), que associa cada ponto ao vetor que leva desse ponto até o ponto mais próximo na formação (arco, círculo, etc) desejada. Por exemplo, se \(n = 2\) e a formação desejada é um círculo de raio \(R\) de centro \(c\), então, para todo \(x \in \mathbb{R}^2\), com \(x \neq c\),
Seja agora, para todo \(k \in \mathbb{N} \setminus\{1\}\), a função \(d_{k}: V \rightarrow \mathbb{R}^n\), definida para todo \(v \in V\) por
sendo \(N^{\out}_G(v)\) o conjunto dos vizinhos de saída (out-neigbors) de \(v\), para todo \(v\) vértice de algum digrafo \(G\).
Essa equação pode ser entendida como o vetor que leva ao destino de um cantor para um instante \(k \in \mathbb{N} \setminus \{ 0 \}\). É nela que estão definidas, ao mesmo tempo, a primeira e a segunda regra. O cantor vai afastar-se de todos os demais cantores, o mais rapidamente quanto mais estiver próximo deles. Ao mesmo tempo, vai aproximar-se da formação desejada, e quanto mais longe estiver dessa formação, menos os outros cantores vão ter impacto sobre a sua posição.
No entanto, os cantores têm velocidade limitada. Sua posição final é dada, para todo \(k \in \mathbb{N}\setminus \{0\}\) por
Na implementação usamos \(n = 2\) e \(\alpha = 2\pi/3 \). Omitimos aqui algumas constantes usadas nela (a velocidade de cada cantor, por exemplo), mas o espírito da coisa é esse. Para mais detalhes, a implementação pode ser vista e melhorada aqui✚.