<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alvaroe</id>
	<title>Física Computacional - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alvaroe"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Alvaroe"/>
	<updated>2026-06-14T18:52:45Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2296</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2296"/>
		<updated>2018-01-25T11:20:16Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Contexto Histórico */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alunos: Álvaro Essinger, Pedro Widniczck.&lt;br /&gt;
=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras básicas, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Uma força central, dependente apenas da distância entre o boid e a origem da força:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{r}_j - \vec{r}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^N_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;,  com &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, e &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; sendo o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt;, na componente x &lt;br /&gt;
&lt;br /&gt;
e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;, na componente y.&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boid no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas. Porém também serão acrescentadas uma barreira repulsiva que dificulte a chegada dos boids na fronteira, sendo a constante de proporcionalidade e E o raio de interação da barreira, da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v_{j} = a exp(-(\frac{x_{j} - L}{E})^2) &amp;lt;/math&amp;gt;,  para quando o boid se aproxima da extremidade superior do dominio, idem para componente x,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v_{j} = a exp(-(\frac{x_{j}}{E})^2) &amp;lt;/math&amp;gt;, para quando o boid se aproxima da parte inferior do dominio. Idem para componente x,&lt;br /&gt;
&lt;br /&gt;
para todos os programas se L = 100, então E = 10 e para L = 1000 então E = 50.&lt;br /&gt;
&lt;br /&gt;
Também é feito que, para todos os boids que possuem mais de &amp;lt;math&amp;gt;0.2N&amp;lt;/math&amp;gt; vizinhos, sejam freiados, pois foi observado que peixes quando na presença de vizinhos (semelhantes) diminuem suas velocidades.&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição do k-ésimo predador.&lt;br /&gt;
&lt;br /&gt;
No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas em áreas quadradas de lados &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L = 100&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade está dependo da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
Para melhorar o comportamento do cardume, fora implementada uma barreira fraca nas bordas da região. Isso fará muita diferença na visualização da situação com predadores.&lt;br /&gt;
&lt;br /&gt;
Na situação abaixo foram usados os seguintes parâmetros:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0.05; S =0.3; M=0.15 e B = 0.6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Barreiranaborda.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume e barreira fraca nas bordas. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_barreira_fronteira]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,05; S= 0,3; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:PREDADOR.gif |thumb|none|500px| Animação dos BOIDs na presença de dois predadores. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_predador]]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2256</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2256"/>
		<updated>2018-01-25T08:20:18Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alunos: Álvaro Essinger, Pedro Widniczck.&lt;br /&gt;
=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física. Um exemplo do uso desse modelo é o modelo de Ising[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Ising_2D].&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{r}_j - \vec{r}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
Para melhorar o comportamento do cardume, fora implementada uma barreira fraca nas bordas da região. Isso fará muita diferença na visualização da situação com predadores.&lt;br /&gt;
&lt;br /&gt;
Na situação abaixo foram usados os seguintes parâmetros:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0.05; S =0.3; M=0.15 e B = 0.6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Barreiranaborda.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume e barreira fraca nas bordas. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_barreira_fronteira]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,05; S= 0,3; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:PREDADOR.gif |thumb|none|500px| Animação dos BOIDs na presença de dois predadores. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_predador]]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2254</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2254"/>
		<updated>2018-01-25T08:17:32Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS Adaptados Para Cardume de Peixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física. Um exemplo do uso desse modelo é o modelo de Ising[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Ising_2D].&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{r}_j - \vec{r}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
Para melhorar o comportamento do cardume, fora implementada uma barreira fraca nas bordas da região. Isso fará muita diferença na visualização da situação com predadores.&lt;br /&gt;
&lt;br /&gt;
Na situação abaixo foram usados os seguintes parâmetros:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0.05; S =0.3; M=0.15 e B = 0.6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Barreiranaborda.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume e barreira fraca nas bordas. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_barreira_fronteira]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,05; S= 0,3; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:PREDADOR.gif |thumb|none|500px| Animação dos BOIDs na presença de dois predadores. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_predador]]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2253</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2253"/>
		<updated>2018-01-25T08:16:04Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS Adaptados Para Cardume de Peixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física. Um exemplo do uso desse modelo é o modelo de Ising[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Ising_2D].&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{r}_j - \vec{r}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
Para melhorar o comportamento do cardume, fora implementada uma barreira fraca nas bordas da região. Isso fará muita diferença na visualização da situação com predadores.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Barreiranaborda.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume e barreira fraca nas bordas. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_barreira_fronteira]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,05; S= 0,3; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:PREDADOR.gif |thumb|none|500px| Animação dos BOIDs na presença de dois predadores. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_predador]]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&amp;diff=2252</id>
		<title>Grupo - BOIDS/codigo barreira fronteira</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_barreira_fronteira&amp;diff=2252"/>
		<updated>2018-01-25T08:14:11Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: Criou página com &amp;#039;&amp;lt;br /&amp;gt;  &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt;               #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;time.h&amp;gt;  // programa particulas boids para CC periodica.   #define N 500...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;              &lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// programa particulas boids para CC periodica. &lt;br /&gt;
&lt;br /&gt;
#define N 500 //numero de particulas&lt;br /&gt;
#define T 2400 //numero de passos&lt;br /&gt;
#define C 0.05 //constante de coesao&lt;br /&gt;
#define S 0.3 // constante de separaçao&lt;br /&gt;
#define M 0.15 // media das velocidades&lt;br /&gt;
#define ini 0.1 // valor maximo das componentes da velocidade&lt;br /&gt;
              // valor maximo da velocidade (sqrt(2)*ini)&lt;br /&gt;
#define E 10 // valor de excesso que a barreira trava os BOIDS&lt;br /&gt;
#define EE 0.1 // valor constante barreira nas fronteiras&lt;br /&gt;
#define PI 3.1415926538979 // aprox de pi&lt;br /&gt;
#define I 15 // Quantidade de passos passados para plotar no gif&lt;br /&gt;
 &lt;br /&gt;
double norm(double x, double y){ //funçao norma&lt;br /&gt;
  return sqrt(x*x + y*y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
  &lt;br /&gt;
  double r[N][2], v[N][2], epsilon=0.01, R=20, rmin=3, erre=12, ERRE=5, dt = 0.1;&lt;br /&gt;
  double random;&lt;br /&gt;
  double x=0., y=0., L=100, vmx=0, vmy=0;&lt;br /&gt;
  int i=0, j=0, k=0, l=0, m=0, t=0, a=0, b=0;&lt;br /&gt;
  int cont=0, kont=0; //conta o numero de vizinhos proximos da particula&lt;br /&gt;
  int vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //**********Inicializar Particulas (posicao e velocidade)**********//&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;set terminal gif animate delay 1.0E-5\n&amp;quot;);// Produz arquivo .gif&lt;br /&gt;
  printf(&amp;quot;set output &#039;boidsvelviz.gif&#039;\n&amp;quot;);               //&lt;br /&gt;
  printf(&amp;quot;set size square\n&amp;quot;);                            // caso rode com&lt;br /&gt;
  printf(&amp;quot;set title &#039;Tempo t = 0.0&#039;\n&amp;quot;);                  // |gnuplot apa-&lt;br /&gt;
  printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;, L);                      //  recem os graficos.&lt;br /&gt;
  printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;, L);                      // &lt;br /&gt;
  printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;)\n&amp;quot;); //&lt;br /&gt;
  &lt;br /&gt;
  for(i=0;i&amp;lt;N;i++){&lt;br /&gt;
    r[i][0] = L*rand()/RAND_MAX;            //&lt;br /&gt;
    r[i][1] = L*rand()/RAND_MAX;            // Inicializa as pos e vel&lt;br /&gt;
    v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente&lt;br /&gt;
    v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //&lt;br /&gt;
    printf(&amp;quot;%lf %lf \n&amp;quot;, r[i][0], r[i][1]); // &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;e \n&amp;quot;); // Final da impressao dos BOIDS&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //**********Dinamica das Particulas**********//&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  do{  //inicio do passo de tempo&lt;br /&gt;
    t++;  //passo de tempo&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;set size square\n&amp;quot;);                    //&lt;br /&gt;
      printf(&amp;quot;set title &#039;Tempo t = %.1lf&#039;\n&amp;quot;, t*dt);  // &lt;br /&gt;
      printf(&amp;quot;set xrange [-0:%lf]\n&amp;quot;, L);       // Caso rode com |gnuplot &lt;br /&gt;
      printf(&amp;quot;set yrange [-0:%lf]\n&amp;quot;, L);       // sao gerados os graficos&lt;br /&gt;
      printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;)\n&amp;quot;); // &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for(j=0;j&amp;lt;N;j++){  // dinamica de cada particula&lt;br /&gt;
      &lt;br /&gt;
      cont=0; // contador para coesao das particulass&lt;br /&gt;
      x = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      y = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      &lt;br /&gt;
      kont = 0; // contador para media das velocidades&lt;br /&gt;
      vmx = 0; // media das veloc. das particulas&lt;br /&gt;
      vmy = 0; // media das veloc. das particulas&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Alinhamento**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){        // se eh a mesma particula nao faz nada&lt;br /&gt;
	} else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*vmx/kont; // media para a velocidade&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*vmy/kont; // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem&lt;br /&gt;
	                                            // a uma distancia menor q&lt;br /&gt;
	                                            // &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c poten-&lt;br /&gt;
	                                       // cial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c poten- &lt;br /&gt;
      }                                        // cial de mola na componente y&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas&lt;br /&gt;
	                              // estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente x&lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente y&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Velocidade Pela Densidade de Vizinhos**********//&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      if(cont  + kont &amp;lt; 0.1*N){   // se o numero de vizinhos for menor que 0.1*N&lt;br /&gt;
	vizinhos[j][0] = 1;       // chave 1 fecha&lt;br /&gt;
	vizinhos[j][1] = 0;       // chave 2 abre&lt;br /&gt;
      }else{&lt;br /&gt;
	vizinhos[j][0] = 0;       // chave 1 abre&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(norm(v[j][0],v[j][1]) &amp;gt; 0.5*ini){   // se a velocidade media do passo anterior for maior&lt;br /&gt;
	                                    // que 0.7*ini&lt;br /&gt;
	vizinhos[j][1] = 0; // chave 2 &amp;quot;abre&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(vizinhos[j][0] == 0){        // se chave  1 aberta &lt;br /&gt;
	if(vizinhos[j][1] == 1){      // se chave 2 fechada  entao nao faz nada&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont +kont &amp;gt;0.5*N){ // se vizinhos &amp;gt; 0.5*N entao &lt;br /&gt;
	  v[j][0] = 0.8*v[j][0];     // velocidade reduz 20% &lt;br /&gt;
	  v[j][1] = 0.8*v[j][1];     // velocidade reduz 20%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.4*N){ // se vizinhos 0.5&amp;gt; e &amp;gt;0.4 entao&lt;br /&gt;
	  v[j][0] = 0.85*v[j][0];      // velocidade reduz 15%&lt;br /&gt;
	  v[j][1] = 0.85*v[j][1];      // velocidade reduz 15%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.3*N){ // se vizinhos 0.4&amp;gt; e &amp;gt;0.3 entao&lt;br /&gt;
	  v[j][0] = 0.9*v[j][0];       // velocidade reduz 10%&lt;br /&gt;
	  v[j][1] = 0.9*v[j][1];       // velocidade reduz 10%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.2*N){ // se vizinhos 0.3&amp;gt; e &amp;gt;0.2 entao&lt;br /&gt;
	  v[j][0] = 0.95*v[j][0];      // velocidade reduz 5%&lt;br /&gt;
	  v[j][1] = 0.95*v[j][1];      // velocidade reduz 5%&lt;br /&gt;
	}&lt;br /&gt;
	vizinhos[j][1] = 1; // chave 2 fecha&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Ruido Particulas**********//&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	random = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	random = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(PI*random)*v[j][0] - sin(PI*random)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = sin(PI*random)*v[j][0] + cos(PI*random)*v[j][1]; // rotaçao&lt;br /&gt;
      &lt;br /&gt;
    &lt;br /&gt;
      //*********Um Pouco de Barreira nas Fronteiras**********//&lt;br /&gt;
      &lt;br /&gt;
      if(r[j][0] - L &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] - EE*exp(-pow((L-r[j][0])/E,2));// Atualiza velocidade c &lt;br /&gt;
	// potencial gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][0] &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] + EE*exp(-pow(r[j][0]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] - L &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] - EE*exp(-pow((L-r[j][1])/E,2));// Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] + EE*exp(-pow(r[j][1]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      //**********Passo das particulas com CC periodica**********//&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][0] &amp;lt; epsilon){ // final do dominio na componente x &lt;br /&gt;
	r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x &lt;br /&gt;
      }else if(r[j][0] &amp;lt; 0){    // inicio do dominio na coomponente x&lt;br /&gt;
	r[j][0] =  L + r[j][0]; // recomeça no finaldo dominio em x&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][1] &amp;lt; epsilon){  // final do dominio em y&lt;br /&gt;
	r[j][1] =  L - r[j][1]; // recomeça no inicio do dominio em y&lt;br /&gt;
      }else if(r[j][1] &amp;lt; 0){   // inicio do dominio em y&lt;br /&gt;
	r[j][1] = L + r[j][1]; // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf \n&amp;quot;, r[j][0], r[j][1]); //imprime a posiçao da particula&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;e\n&amp;quot;); // final do grafico para |gnuplot &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }while(t&amp;lt;T);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Barreiranaborda.gif&amp;diff=2251</id>
		<title>Arquivo:Barreiranaborda.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Barreiranaborda.gif&amp;diff=2251"/>
		<updated>2018-01-25T08:11:15Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2249</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2249"/>
		<updated>2018-01-25T08:02:59Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Predador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física. Um exemplo do uso desse modelo é o modelo de Ising[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Ising_2D].&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,05; S= 0,3; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:PREDADOR.gif |thumb|none|500px| Animação dos BOIDs na presença de dois predadores. Código[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_predador]]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2248</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2248"/>
		<updated>2018-01-25T08:01:04Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Predador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física. Um exemplo do uso desse modelo é o modelo de Ising[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Ising_2D].&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,05; S= 0,3; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:PREDADOR.gif |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:PREDADOR.gif&amp;diff=2247</id>
		<title>Arquivo:PREDADOR.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:PREDADOR.gif&amp;diff=2247"/>
		<updated>2018-01-25T07:59:02Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS_predador&amp;diff=2246</id>
		<title>Grupo - BOIDS/codigo BOIDS predador</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS_predador&amp;diff=2246"/>
		<updated>2018-01-25T07:58:32Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: Criou página com &amp;#039;&amp;lt;br /&amp;gt;  &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt;               #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;time.h&amp;gt;  // programa particulas boids para CC periodica.   #define N 500...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;              &lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// programa particulas boids para CC periodica. &lt;br /&gt;
&lt;br /&gt;
#define N 500 //numero de particulas&lt;br /&gt;
#define NUM 4 // numero de predadores&lt;br /&gt;
#define T 2400 //numero de passos&lt;br /&gt;
#define C 0.05 //constante de coesao&lt;br /&gt;
#define S 0.3 // constante de separaçao&lt;br /&gt;
#define M 0.15 // media das velocidades&lt;br /&gt;
#define B 0.6 // constante de repulsao da barreira&lt;br /&gt;
#define ini 0.1 // valor maximo das componentes da velocidade&lt;br /&gt;
              // valor maximo da velocidade (sqrt(2)*ini)&lt;br /&gt;
#define E 10 // valor de excesso que a barreira trava os BOIDS&lt;br /&gt;
#define EE 0.1 // valor constante barreira nas fronteiras&lt;br /&gt;
#define PI 3.1415926538979 // aprox de pi&lt;br /&gt;
#define I 15 // Quantidade de passos passados para plotar no gif&lt;br /&gt;
 &lt;br /&gt;
double norm(double x, double y){ //funçao norma&lt;br /&gt;
  return sqrt(x*x + y*y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
  &lt;br /&gt;
  double r[N][2], v[N][2], epsilon=0.01, R=20, rmin=3, erre=12, ERRE=5, dt = 0.1;&lt;br /&gt;
  double random;&lt;br /&gt;
  double x=0., y=0., L=100, vmx=0, vmy=0, vmed=0, vmedl =0;&lt;br /&gt;
  double bx[NUM], by[NUM], vx[NUM], vy[NUM]; //barreira&lt;br /&gt;
  int i=0, j=0, k=0, l=0, m=0, t=0, a=0, b=0;&lt;br /&gt;
  int cont=0, kont=0; //conta o numero de vizinhos proximos da particula&lt;br /&gt;
  int vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //**********Inicializar Particulas (posicao e velocidade)**********//&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;set terminal gif animate delay 1.0E-5\n&amp;quot;);// Produz arquivo .gif&lt;br /&gt;
  printf(&amp;quot;set output &#039;boidspred.gif&#039;\n&amp;quot;);            //&lt;br /&gt;
  printf(&amp;quot;set size square\n&amp;quot;);                            // caso rode com&lt;br /&gt;
  printf(&amp;quot;set title &#039;Tempo t = 0.0&#039;\n&amp;quot;);                  // |gnuplot apa-&lt;br /&gt;
  printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;, L);                      //  recem os graficos.&lt;br /&gt;
  printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;, L);                      // &lt;br /&gt;
  printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;)\n&amp;quot;); //&lt;br /&gt;
  &lt;br /&gt;
  for(i=0;i&amp;lt;N;i++){&lt;br /&gt;
    r[i][0] = L*rand()/RAND_MAX;            //&lt;br /&gt;
    r[i][1] = L*rand()/RAND_MAX;            // Inicializa as pos e vel&lt;br /&gt;
    v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente&lt;br /&gt;
    v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //&lt;br /&gt;
    printf(&amp;quot;%lf %lf \n&amp;quot;, r[i][0], r[i][1]); // &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;e \n&amp;quot;); // Final da impressao dos BOIDS&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //**********Dinamica das Particulas**********//&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  a=0;&lt;br /&gt;
  do{  //inicio do passo de tempo&lt;br /&gt;
    t++;  //passo de tempo&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;set size square\n&amp;quot;);                    //&lt;br /&gt;
      printf(&amp;quot;set title &#039;Tempo t = %.1lf&#039;\n&amp;quot;, t*dt);  // &lt;br /&gt;
      printf(&amp;quot;set xrange [-0:%lf]\n&amp;quot;, L);       // Caso rode com |gnuplot &lt;br /&gt;
      printf(&amp;quot;set yrange [-0:%lf]\n&amp;quot;, L);       // sao gerados os graficos&lt;br /&gt;
      printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;), &#039;-&#039; w p pt  7 title sprintf(\&amp;quot;Predadores\&amp;quot;)\n&amp;quot;); // &lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      vmed = 0;  // velocidade media das particulas&lt;br /&gt;
      &lt;br /&gt;
    &lt;br /&gt;
    //**********Inicializar Barreiras (Predadores)**********//&lt;br /&gt;
    &lt;br /&gt;
    if(0 == t%700 &amp;amp;&amp;amp; a &amp;lt; NUM){ // Predadores Adicionados de 500 em 500 passos&lt;br /&gt;
      if(a%4 == 0){ // Ou os predadores estao posicionados em cima&lt;br /&gt;
	bx[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L-1;                 // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = -ini*(rand()/RAND_MAX+1); //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = -ini*(rand()/RAND_MAX+1); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 1){ // Ou predadores sao adicionados na lateral&lt;br /&gt;
	bx[a] = 1;                 // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = (ini*rand()/RAND_MAX+1);   //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = -ini*(rand()/RAND_MAX+1); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 2){&lt;br /&gt;
	bx[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = 1; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = ini*(rand()/RAND_MAX+1);   //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = ini*(rand()/RAND_MAX+1); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 3){&lt;br /&gt;
      	bx[a] = L-1; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = -ini*(rand()/RAND_MAX+1);//Inicializar velocidade em x&lt;br /&gt;
	vy[a] = ini*(rand()/RAND_MAX+1); //Inicializar velocidade em y&lt;br /&gt;
      }&lt;br /&gt;
      a++;  // Vai para o proximo contador&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for(j=0;j&amp;lt;N;j++){  // dinamica de cada particula&lt;br /&gt;
      &lt;br /&gt;
      cont=0; // contador para coesao das particulass&lt;br /&gt;
      x = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      y = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      &lt;br /&gt;
      kont = 0; // contador para media das velocidades&lt;br /&gt;
      vmx = 0; // media das veloc. das particulas&lt;br /&gt;
      vmy = 0; // media das veloc. das particulas&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Alinhamento**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){        // se eh a mesma particula nao faz nada&lt;br /&gt;
	} else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*vmx/kont; // media para a velocidade&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*vmy/kont; // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem&lt;br /&gt;
	                                            // a uma distancia menor q&lt;br /&gt;
	                                            // &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c poten-&lt;br /&gt;
	                                       // cial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c poten- &lt;br /&gt;
      }                                        // cial de mola na componente y&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas&lt;br /&gt;
	                              // estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente x&lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente y&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Velocidade Pela Densidade de Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      if(cont  + kont &amp;lt; 0.1*N){   // se o numero de vizinhos for menor que 0.1*N&lt;br /&gt;
	vizinhos[j][0] = 1;       // chave 1 fecha&lt;br /&gt;
	vizinhos[j][1] = 0;       // chave 2 abre&lt;br /&gt;
      }else{&lt;br /&gt;
	vizinhos[j][0] = 0;       // chave 1 abre&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(norm(v[j][0],v[j][1]) &amp;gt; 0.5*ini){   // se a velocidade media do passo anterior for maior&lt;br /&gt;
	                                    // que 0.7*ini&lt;br /&gt;
	vizinhos[j][1] = 0; // chave 2 &amp;quot;abre&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(vizinhos[j][0] == 0){        // se chave  1 aberta &lt;br /&gt;
	if(vizinhos[j][1] == 1){      // se chave 2 fechada  entao nao faz nada&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont +kont &amp;gt;0.5*N){ // se vizinhos &amp;gt; 0.5*N entao &lt;br /&gt;
	  v[j][0] = 0.8*v[j][0];     // velocidade reduz 20% &lt;br /&gt;
	  v[j][1] = 0.8*v[j][1];     // velocidade reduz 20%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.4*N){ // se vizinhos 0.5&amp;gt; e &amp;gt;0.4 entao&lt;br /&gt;
	  v[j][0] = 0.85*v[j][0];      // velocidade reduz 15%&lt;br /&gt;
	  v[j][1] = 0.85*v[j][1];      // velocidade reduz 15%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.3*N){ // se vizinhos 0.4&amp;gt; e &amp;gt;0.3 entao&lt;br /&gt;
	  v[j][0] = 0.9*v[j][0];       // velocidade reduz 10%&lt;br /&gt;
	  v[j][1] = 0.9*v[j][1];       // velocidade reduz 10%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.2*N){ // se vizinhos 0.3&amp;gt; e &amp;gt;0.2 entao&lt;br /&gt;
	  v[j][0] = 0.95*v[j][0];      // velocidade reduz 5%&lt;br /&gt;
	  v[j][1] = 0.95*v[j][1];      // velocidade reduz 5%&lt;br /&gt;
	}&lt;br /&gt;
	vizinhos[j][1] = 1; // chave 2 fecha&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Ruido Particulas**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	random = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	random = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(PI*random)*v[j][0] - sin(PI*random)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = sin(PI*random)*v[j][0] + cos(PI*random)*v[j][1]; // rotaçao&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      &lt;br /&gt;
      for(b=0;b&amp;lt;NUM;b++){&lt;br /&gt;
	if(norm(r[j][0] -bx[b], r[j][1] - by[b]) &amp;lt; ERRE){//se a particula ta a&lt;br /&gt;
	                                                 //menos de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(r[j][0] &amp;lt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;lt; by[b]){ // se estiver atras e abaixo&lt;br /&gt;
	    v[j][0] = v[j][0] - B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] - B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;gt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;lt; by[b]){ // se estiver a frente e abaixo&lt;br /&gt;
	    v[j][0] = v[j][0] + B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] - B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;lt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;gt; by[b]){ // se estiver abaixo e acima&lt;br /&gt;
	    v[j][0] = v[j][0] - B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] + B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;gt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;gt; by[b]){// se estiver a frente e acima&lt;br /&gt;
	    v[j][0] = v[j][0] + B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] + B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      //*********Um Pouco de Barreira nas Fronteiras**********//&lt;br /&gt;
      &lt;br /&gt;
      if(r[j][0] - L &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] - EE*exp(-pow((L-r[j][0])/E,2));// Atualiza velocidade c &lt;br /&gt;
	// potencial gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][0] &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] + EE*exp(-pow(r[j][0]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] - L &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] - EE*exp(-pow((L-r[j][1])/E,2));// Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] + EE*exp(-pow(r[j][1]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      //**********Passo das particulas com CC periodica**********//&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][0] &amp;lt; epsilon){ // final do dominio na componente x &lt;br /&gt;
	r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x &lt;br /&gt;
      }else if(r[j][0] &amp;lt; 0){    // inicio do dominio na coomponente x&lt;br /&gt;
	r[j][0] =  L + r[j][0]; // recomeça no finaldo dominio em x&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][1] &amp;lt; epsilon){  // final do dominio em y&lt;br /&gt;
	r[j][1] =  L - r[j][1]; // recomeça no inicio do dominio em y&lt;br /&gt;
      }else if(r[j][1] &amp;lt; 0){   // inicio do dominio em y&lt;br /&gt;
	r[j][1] = L + r[j][1]; // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf \n&amp;quot;, r[j][0], r[j][1]); //imprime a posiçao da particula&lt;br /&gt;
      }&lt;br /&gt;
      vmed = vmed + norm(v[j][0],v[j][1]); // contador para velocidade media&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;e\n&amp;quot;); // final do grafico para |gnuplot &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //*********Passo da Barreira (Predador)*********//&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for(b=0;b&amp;lt;a;b++){&lt;br /&gt;
      &lt;br /&gt;
      if(L - bx[b] &amp;lt; epsilon){ // final do dominio em x&lt;br /&gt;
	bx[b] = L - bx[b];            // recomeça no inicio do dominio em x&lt;br /&gt;
      }else if(bx[b] &amp;lt; epsilon){ //inicio do dominio em x&lt;br /&gt;
	bx[b] =  L + bx[b];         // recomeça no final do dominio em x&lt;br /&gt;
      } &lt;br /&gt;
      &lt;br /&gt;
      bx[b] = bx[b] + vx[b]*dt; // atualiza posiçao da barreira em x&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      if(L - by[b] &amp;lt; epsilon){ // final do dominio em y &lt;br /&gt;
	by[b] =  L - by[b];           // recommeça no inicio do dominio em y&lt;br /&gt;
      }else if(by[b] &amp;lt; epsilon){  // inicio do dominio em y&lt;br /&gt;
	by[b] = L + by[b];           // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      by[b] = by[b] + vy[b]*dt; // atualiza posiçao da barreira em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf\n&amp;quot;,bx[b], by[b]); // imprime a barreira&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
     if(t%I == 0){&lt;br /&gt;
       printf(&amp;quot;e \n&amp;quot;); // final do grafico no tempo t&lt;br /&gt;
       printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
    vmedl = vmed/N; // media da velocidade das particulas&lt;br /&gt;
  }while(t&amp;lt;T);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2245</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2245"/>
		<updated>2018-01-25T07:52:15Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Contexto Histórico */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds, engenheiro de software, em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
Posteriormente, em 1995, Tamás Vicsek, cientista húngaro, apresentou um modelo simplificado de BOID para o estudo de transições de fase de um sistema desordenado para um estado ordenado de larga escala. Esse tipo de transição espontânea é um exemplo de movimento coletivo. Esse modelo é bastante popular atualmente na área da física. Um exemplo do uso desse modelo é o modelo de Ising[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Ising_2D].&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2238</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2238"/>
		<updated>2018-01-25T06:15:22Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS Adaptados Para Cardume de Peixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros utilizados foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,2; S = 0,3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2237</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2237"/>
		<updated>2018-01-25T06:14:29Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Resultados e Discussão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
Implementação das 2 regras básicas de coesão e separação com a modificação da regra de alinhamento buscando um comportamento de grupo mais real. Note que aqui, ao se juntarem, a velocidade diminui. Pois a velocidade depende da quantidade de vizinhos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2236</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2236"/>
		<updated>2018-01-25T06:12:01Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS Adaptados Para Cardume de Peixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2235</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2235"/>
		<updated>2018-01-25T06:11:12Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS Adaptados Para Cardume de Peixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
[[Arquivo:BoidsMOD.gif |thumb|none|500px| Simulação BOIDS com otimização de velocidade do cardume. Código: [https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS_cardume]]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS_cardume&amp;diff=2234</id>
		<title>Grupo - BOIDS/codigo BOIDS cardume</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS_cardume&amp;diff=2234"/>
		<updated>2018-01-25T06:10:49Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: Criou página com &amp;#039;&amp;lt;br /&amp;gt;  &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt;               #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;time.h&amp;gt;  // programa particulas boids para CC periodica.   #define N 500...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;              &lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// programa particulas boids para CC periodica. &lt;br /&gt;
&lt;br /&gt;
#define N 500 // numero de particulas&lt;br /&gt;
#define T 3200 // numero de passos&lt;br /&gt;
#define C 0.2 // constante de coesao&lt;br /&gt;
#define S 0.3 // constante de separaçao&lt;br /&gt;
#define ini 2 // valor maximo das componentes da velocidade&lt;br /&gt;
                // valor maximo da velocidade (sqrt(2)*ini)&lt;br /&gt;
#define PI 3.1415926538979 //aprox de pi&lt;br /&gt;
#define I 15 // numero de passos entre as plotagens&lt;br /&gt;
#define E 8 // distancia maxima que a barreira afeta os BOIDS&lt;br /&gt;
#define EE 0.01 // barreira dificulta a chegada nas fronteiras&lt;br /&gt;
&lt;br /&gt;
double norm(double x, double y){ //funçao norma&lt;br /&gt;
  return sqrt(x*x + y*y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
  &lt;br /&gt;
  double r[N][2], v[N][2], epsilon=0.00001, R=8, rmin=2, erre=7, dt = 0.1;&lt;br /&gt;
  double randomi=0;&lt;br /&gt;
  double x=0., y=0., vel[N], L=100, vmx=0, vmy=0, vmed=0, vmedl =0;&lt;br /&gt;
  int i=0, j=0, k=0, l=0, m=0, t=0;&lt;br /&gt;
  int cont=0, kont=0; //conta o numero de vizinhos proximos da particula&lt;br /&gt;
  int  vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0&lt;br /&gt;
  &lt;br /&gt;
  //**********inicializar particulas (posicao e velocidade)**********//&lt;br /&gt;
  printf(&amp;quot;set terminal gif animate delay 1.0E-5\n&amp;quot;);// Produz arquivo .gif&lt;br /&gt;
  printf(&amp;quot;set output &#039;boidcgauss.gif&#039;\n&amp;quot;);            //&lt;br /&gt;
  printf(&amp;quot;set title &#039;Tempo t = 0&#039;\n&amp;quot;);      //&lt;br /&gt;
  printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;, L); // caso rode com |gnuplot aparecem &lt;br /&gt;
  printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;, L); // os graficos.&lt;br /&gt;
  printf(&amp;quot;plot &#039;-&#039; w p pt 10\n&amp;quot;);           //&lt;br /&gt;
  &lt;br /&gt;
  for(i=0;i&amp;lt;N;i++){&lt;br /&gt;
    r[i][0] = L*rand()/RAND_MAX;            //&lt;br /&gt;
    r[i][1] = L*rand()/RAND_MAX;            // Inicializa as pos e vel&lt;br /&gt;
    v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente&lt;br /&gt;
    v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //&lt;br /&gt;
    printf(&amp;quot;%lf %lf \n&amp;quot;, r[i][0], r[i][1]); //&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;e \n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //**********Dinamica das Particulas**********//&lt;br /&gt;
  &lt;br /&gt;
  do{  //inicio do passo de tempo&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;set title &#039;Tempo t = %.1lf&#039;\n&amp;quot;, t*dt); // &lt;br /&gt;
      printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;,L);              // Caso rode com |gnuplot &lt;br /&gt;
      printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;,L);              // sao gerados os graficos&lt;br /&gt;
      printf(&amp;quot;plot &#039;-&#039; w p pt 10\n&amp;quot;);                // &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    vmed = 0; // velocidade media das particulas&lt;br /&gt;
    &lt;br /&gt;
    for(j=0;j&amp;lt;N;j++){ // dinamica de cada particula&lt;br /&gt;
      &lt;br /&gt;
      cont=0; // contador para coesao das particulass&lt;br /&gt;
      x = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      y = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      &lt;br /&gt;
      kont = 0; // contador para media das velocidades&lt;br /&gt;
      vmx = 0; // media das veloc. das particulas&lt;br /&gt;
      vmy = 0; // media das veloc. das particulas&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){                 // laço para todas ass particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = vmx/kont; // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = vmy/kont; // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem&lt;br /&gt;
	                                            // a uma distancia menor q&lt;br /&gt;
	                                            // &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c pote-&lt;br /&gt;
	                                       // ncial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c pote- &lt;br /&gt;
      }                                        // ncial de mola na componente y&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2)/L; // Atualiza velocidade c potencial analogo ao gravitacional&lt;br /&gt;
	                // na componente x&lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2)/L; // Atualiza velocidade c potencial analogo ao gravitacional&lt;br /&gt;
      	                // na componente y&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      //**********Velocidade Pela Densidade de Vizinhos**********//&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      if(cont  + kont &amp;lt; 0.1*N){   // se o numero de vizinhos for menor que 0.1*N&lt;br /&gt;
	vizinhos[j][0] = 1;       // chave 1 fecha&lt;br /&gt;
	vizinhos[j][1] = 0;       // chave 2 abre&lt;br /&gt;
      }else{&lt;br /&gt;
	vizinhos[j][0] = 0;       // chave 1 abre&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(norm(v[j][0],v[j][1]) &amp;gt; 0.5*ini){   // se a velocidade media do passo anterior for maior&lt;br /&gt;
	                                    // que 0.7*ini&lt;br /&gt;
	vizinhos[j][1] = 0; // chave 2 &amp;quot;abre&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(vizinhos[j][0] == 0){        // se chave  1 aberta &lt;br /&gt;
	if(vizinhos[j][1] == 1){      // se chave 2 fechada  entao nao faz nada&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont +kont &amp;gt;0.5*N){ // se vizinhos &amp;gt; 0.5*N entao &lt;br /&gt;
	  v[j][0] = 0.85*v[j][0];     // velocidade reduz 20% &lt;br /&gt;
	  v[j][1] = 0.85*v[j][1];     // velocidade reduz 20%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.4*N){ // se vizinhos 0.5&amp;gt; e &amp;gt;0.4 entao&lt;br /&gt;
	  v[j][0] = 0.9*v[j][0];      // velocidade reduz 15%&lt;br /&gt;
	  v[j][1] = 0.9*v[j][1];      // velocidade reduz 15%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.3*N){ // se vizinhos 0.4&amp;gt; e &amp;gt;0.3 entao&lt;br /&gt;
	  v[j][0] = 0.93*v[j][0];       // velocidade reduz 10%&lt;br /&gt;
	  v[j][1] = 0.93*v[j][1];       // velocidade reduz 10%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.2*N){ // se vizinhos 0.3&amp;gt; e &amp;gt;0.2 entao&lt;br /&gt;
	  v[j][0] = 0.97*v[j][0];      // velocidade reduz 5%&lt;br /&gt;
	  v[j][1] = 0.97*v[j][1];      // velocidade reduz 5%&lt;br /&gt;
	}&lt;br /&gt;
	vizinhos[j][1] = 1; // chave 2 fecha&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(PI*randomi)*v[j][0] - sin(PI*randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = sin(PI*randomi)*v[j][0] + cos(PI*randomi)*v[j][1]; // rotaçao&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Passo das particulas com CC periodica**********//&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][0] &amp;lt; epsilon){ // final do dominio na componente x &lt;br /&gt;
	r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x &lt;br /&gt;
      }else if(r[j][0] &amp;lt; 0){    // inicio do dominio na coomponente x&lt;br /&gt;
	r[j][0] =  L + r[j][0]; // recomeça no finaldo dominio em x&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x&lt;br /&gt;
       &lt;br /&gt;
      if(L-r[j][1] &amp;lt; epsilon){  // final do dominio em y&lt;br /&gt;
	r[j][1] =  L - r[j][1]; // recomeça no inicio do dominio em y&lt;br /&gt;
      }else if(r[j][1] &amp;lt; 0){   // inicio do dominio em y&lt;br /&gt;
	r[j][1] = L + r[j][1]; // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf \n&amp;quot;, r[j][0], r[j][1]); // imprime a posiçao da particula&lt;br /&gt;
      }&lt;br /&gt;
      vmed = vmed + norm(v[j][0],v[j][1]); // contador para velocidade media&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;e\n&amp;quot;); // final do grafico para |gnuplot &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    vmedl = vmed/N; // velocidade media no tempo t&lt;br /&gt;
    //printf(&amp;quot;%lf %lf\n&amp;quot;, t*dt, vmed);&lt;br /&gt;
    t++; // contador para o tempo (numero de passos)&lt;br /&gt;
  }while(t&amp;lt;T);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:BoidsMOD.gif&amp;diff=2233</id>
		<title>Arquivo:BoidsMOD.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:BoidsMOD.gif&amp;diff=2233"/>
		<updated>2018-01-25T06:07:27Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2232</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2232"/>
		<updated>2018-01-25T06:05:15Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Conclusão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
O comportamento coletivo sincronizado de animais é muito complexo. O estudo do cardume de peixes num sistema 2D é uma simplificação mas que nos dá ideias boas das regras básicas de comportamento e otimizações posteriores sobre o objeto de estudo. A regra modificada de alinhamento nos trás um comportamento mais real do cardume de peixes. Outras otimizações poderiam inserir diversas outras regras, como por exemplo um sentimento de nervosismo no bando pela presença de muitos predadores pode fazer o grupo se mover mais rápido e etc. Além disso o algoritmo BOID se torna muito intuitivo de ser trabalhado, podendo ser tratado com regras distintas, ligando e desligando como quisermos.&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2231</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2231"/>
		<updated>2018-01-25T05:47:47Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS (3 regras ligadas) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras básicas ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2229</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2229"/>
		<updated>2018-01-25T05:42:47Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS (3 regras ligadas) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras, sem a adaptação de alinhamento de cardume, ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. Código:[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo_BOIDS] ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS&amp;diff=2228</id>
		<title>Grupo - BOIDS/codigo BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS&amp;diff=2228"/>
		<updated>2018-01-25T05:42:24Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: Criou página com &amp;#039;&amp;lt;br /&amp;gt;  &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt;               #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;time.h&amp;gt;  // programa particulas boids para CC periodica.   #define N 300...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;              &lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// programa particulas boids para CC periodica. &lt;br /&gt;
&lt;br /&gt;
#define N 300 //numero de particulas&lt;br /&gt;
#define T 2500 //numero de passos&lt;br /&gt;
#define C 0.1 //constante de coesao&lt;br /&gt;
#define S 0.4 // constante de separaçao&lt;br /&gt;
#define ini 1 // valor maximo das componentes da velocidade&lt;br /&gt;
                //valor maximo da velocidade (sqrt(2)*ini)&lt;br /&gt;
#define PI 3.1415926538979 //aprox de pi&lt;br /&gt;
#define I 15&lt;br /&gt;
&lt;br /&gt;
double norm(double x, double y){ //funçao norma&lt;br /&gt;
  return sqrt(x*x + y*y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
  &lt;br /&gt;
  double r[N][2], v[N][2], epsilon=0.00001, R=13, rmin=2, erre=7, dt = 0.1;&lt;br /&gt;
  double randomi=0;&lt;br /&gt;
  double x=0., y=0., vel[N], L=100, vmx=0, vmy=0, vmed=0, vmedl =0;&lt;br /&gt;
  int i=0, j=0, k=0, l=0, m=0, t=0;&lt;br /&gt;
  int cont=0, kont=0; //conta o numero de vizinhos proximos da particula&lt;br /&gt;
  int  vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0&lt;br /&gt;
  &lt;br /&gt;
  //**********inicializar particulas (posicao e velocidade)**********//&lt;br /&gt;
  printf(&amp;quot;set terminal gif animate delay 1.0E-5\n&amp;quot;);// Produz arquivo .gif&lt;br /&gt;
  printf(&amp;quot;set output &#039;boidsembar.gif&#039;\n&amp;quot;);            //&lt;br /&gt;
  printf(&amp;quot;set title &#039;Tempo t = 0&#039;\n&amp;quot;);      //&lt;br /&gt;
  printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;, L); // caso rode com |gnuplot aparecem &lt;br /&gt;
  printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;, L); // os graficos.&lt;br /&gt;
  printf(&amp;quot;plot &#039;-&#039; w p pt 10\n&amp;quot;);           //&lt;br /&gt;
  &lt;br /&gt;
  for(i=0;i&amp;lt;N;i++){&lt;br /&gt;
    r[i][0] = L*rand()/RAND_MAX;            //&lt;br /&gt;
    r[i][1] = L*rand()/RAND_MAX;            // Inicializa as pos e vel&lt;br /&gt;
    v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente&lt;br /&gt;
    v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //&lt;br /&gt;
    printf(&amp;quot;%lf %lf \n&amp;quot;, r[i][0], r[i][1]); //&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;e \n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //**********Dinamica das Particulas**********//&lt;br /&gt;
  &lt;br /&gt;
  do{  //inicio do passo de tempo&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;set title &#039;Tempo t = %.1lf&#039;\n&amp;quot;, t*dt); // &lt;br /&gt;
      printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;,L);              // Caso rode com |gnuplot &lt;br /&gt;
      printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;,L);              // sao gerados os graficos&lt;br /&gt;
      printf(&amp;quot;plot &#039;-&#039; w p pt 10\n&amp;quot;);                // &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    vmed = 0; // velocidade media das particulas&lt;br /&gt;
    &lt;br /&gt;
    for(j=0;j&amp;lt;N;j++){ // dinamica de cada particula&lt;br /&gt;
      &lt;br /&gt;
      cont=0; // contador para coesao das particulass&lt;br /&gt;
      x = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      y = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      &lt;br /&gt;
      kont = 0; // contador para media das velocidades&lt;br /&gt;
      vmx = 0; // media das veloc. das particulas&lt;br /&gt;
      vmy = 0; // media das veloc. das particulas&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){                 // laço para todas ass particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = vmx/kont; // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = vmy/kont; // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem&lt;br /&gt;
	                                            // a uma distancia menor q&lt;br /&gt;
	                                            // &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c pote-&lt;br /&gt;
	                                       // ncial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c pote- &lt;br /&gt;
      }                                        // ncial de mola na componente y&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2)/L; // Atualiza velocidade c potencial analogo ao gravitacional&lt;br /&gt;
	                // na componente x&lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2)/L; // Atualiza velocidade c potencial analogo ao gravitacional&lt;br /&gt;
      	                // na componente y&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(PI*randomi)*v[j][0] - sin(PI*randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = sin(PI*randomi)*v[j][0] + cos(PI*randomi)*v[j][1]; // rotaçao&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Passo das particulas com CC periodica**********//&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][0] &amp;lt; epsilon){ // final do dominio na componente x &lt;br /&gt;
	r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x &lt;br /&gt;
      }else if(r[j][0] &amp;lt; 0){    // inicio do dominio na coomponente x&lt;br /&gt;
	r[j][0] =  L + r[j][0]; // recomeça no finaldo dominio em x&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x&lt;br /&gt;
       &lt;br /&gt;
      if(L-r[j][1] &amp;lt; epsilon){  // final do dominio em y&lt;br /&gt;
	r[j][1] =  L - r[j][1]; // recomeça no inicio do dominio em y&lt;br /&gt;
      }else if(r[j][1] &amp;lt; 0){   // inicio do dominio em y&lt;br /&gt;
	r[j][1] = L + r[j][1]; // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf \n&amp;quot;, r[j][0], r[j][1]); // imprime a posiçao da particula&lt;br /&gt;
      }&lt;br /&gt;
      vmed = vmed + norm(v[j][0],v[j][1]); // contador para velocidade media&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;e\n&amp;quot;); // final do grafico para |gnuplot &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    vmedl = vmed/N; // velocidade media no tempo t&lt;br /&gt;
    //printf(&amp;quot;%lf %lf\n&amp;quot;, t*dt, vmed);&lt;br /&gt;
    t++; // contador para o tempo (numero de passos)&lt;br /&gt;
  }while(t&amp;lt;T);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2227</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2227"/>
		<updated>2018-01-25T05:40:30Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* BOIDS (3 regras ligadas) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras, sem a adaptação de alinhamento de cardume, ligadas.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros usados nessa simulação foram:&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1 ; S = 0,4&amp;lt;/math&amp;gt;, nesse caso não temos o parâmetro &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; pois só é utilizada a media aritmética das componentes.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2224</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2224"/>
		<updated>2018-01-25T05:38:09Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Resultados e Discussão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS (3 regras ligadas) ==&lt;br /&gt;
Aqui temos a implementação das 3 regras, sem a adaptação de alinhamento de cardume, ligadas.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif |thumb|none|500px| Animação BOIDS sem adaptação de cardume. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:BOIDS.gif&amp;diff=2223</id>
		<title>Arquivo:BOIDS.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:BOIDS.gif&amp;diff=2223"/>
		<updated>2018-01-25T05:36:18Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: Alvaroe enviou uma nova versão de &amp;amp;quot;Arquivo:BOIDS.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2221</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2221"/>
		<updated>2018-01-25T05:34:31Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Predador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2220</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2220"/>
		<updated>2018-01-25T05:32:28Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Predador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
Resultado obtido com as regras de coesão, separação e alinhamento adaptado para cardume de peixes implementadas. Aqui buscamos colocar os predadores em cena depois de algum tempo dos objetos criados para que o cardume se organize.&lt;br /&gt;
&lt;br /&gt;
Os parâmetros melhores ajustados que encontramos para essa situação foram:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = 0,1; S= 0,5; M = 0,15; B = 0,6; L=100&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIF PREDADORES |thumb|none|500px| Animação dos BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2212</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2212"/>
		<updated>2018-01-25T05:26:44Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Alinhamento (vetor velocidade) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo ilustra a influência da regra mostrando o sistema inicialmente com o alinhamento desligado e ligando-o logo após.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Animação da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2210</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2210"/>
		<updated>2018-01-25T05:24:25Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Resultados e Discussão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== BOIDS Adaptados Para Cardume de Peixes ==&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2209</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2209"/>
		<updated>2018-01-25T05:19:12Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Resultados e Discução */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discussão=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um comportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2207</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2207"/>
		<updated>2018-01-25T05:12:29Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Predador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2206</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2206"/>
		<updated>2018-01-25T05:11:35Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Separação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Predador ===&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
A animação abaixo busca ilustrar a dependência do parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; no sistema, aumentando-o progressivamente.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2205</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2205"/>
		<updated>2018-01-25T05:08:31Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Alinhamento (vetor velocidade) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Predador ===&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento 1.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2204</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2204"/>
		<updated>2018-01-25T05:07:52Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Alinhamento (vetor velocidade) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Predador ===&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinha.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Alinhamento_1.gif&amp;diff=2203</id>
		<title>Arquivo:Alinhamento 1.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Alinhamento_1.gif&amp;diff=2203"/>
		<updated>2018-01-25T05:06:54Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2202</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2202"/>
		<updated>2018-01-25T05:04:25Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Desenvolvimento em C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Predador ===&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o código completo[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_BOIDS/codigo].&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo&amp;diff=2201</id>
		<title>Grupo - BOIDS/codigo</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo&amp;diff=2201"/>
		<updated>2018-01-25T05:03:27Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;              &lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// programa particulas boids para CC periodica. &lt;br /&gt;
&lt;br /&gt;
#define N 500 //numero de particulas&lt;br /&gt;
#define NUM 4 // numero de predadores&lt;br /&gt;
#define T 5000 //numero de passos&lt;br /&gt;
#define C 0.05 //constante de coesao&lt;br /&gt;
#define S 0.3 // constante de separaçao&lt;br /&gt;
#define M 0.15 // media das velocidades&lt;br /&gt;
#define B 0.6 // constante de repulsao da barreira&lt;br /&gt;
#define ini 0.1 // valor maximo das componentes da velocidade&lt;br /&gt;
              // valor maximo da velocidade (sqrt(2)*ini)&lt;br /&gt;
#define E 10 // valor de excesso que a barreira trava os BOIDS&lt;br /&gt;
#define EE 0.1 // valor constante barreira nas fronteiras&lt;br /&gt;
#define PI 3.1415926538979 // aprox de pi&lt;br /&gt;
#define I 2 // Quantidade de passos passados para plotar no gif&lt;br /&gt;
 &lt;br /&gt;
double norm(double x, double y){ //funçao norma&lt;br /&gt;
  return sqrt(x*x + y*y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
  &lt;br /&gt;
  double r[N][2], v[N][2], epsilon=0.01, R=20, rmin=3, erre=12, ERRE=10, dt = 0.1;&lt;br /&gt;
  double random;&lt;br /&gt;
  double x=0., y=0., L=100, vmx=0, vmy=0, vmed=0, vmedl =0;&lt;br /&gt;
  double bx[NUM], by[NUM], vx[NUM], vy[NUM]; //barreira&lt;br /&gt;
  int i=0, j=0, k=0, l=0, m=0, t=0, a=0, b=0;&lt;br /&gt;
  int cont=0, kont=0; //conta o numero de vizinhos proximos da particula&lt;br /&gt;
  int vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //**********Inicializar Particulas (posicao e velocidade)**********//&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;set terminal gif animate delay 1.0E-5\n&amp;quot;);// Produz arquivo .gif&lt;br /&gt;
  printf(&amp;quot;set output &#039;boidsbar.gif&#039;\n&amp;quot;);            //&lt;br /&gt;
  printf(&amp;quot;set size square\n&amp;quot;);                            // caso rode com&lt;br /&gt;
  printf(&amp;quot;set title &#039;Tempo t = 0.0&#039;\n&amp;quot;);                  // |gnuplot apa-&lt;br /&gt;
  printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;, L);                      //  recem os graficos.&lt;br /&gt;
  printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;, L);                      // &lt;br /&gt;
  printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;)\n&amp;quot;); //&lt;br /&gt;
  &lt;br /&gt;
  for(i=0;i&amp;lt;N;i++){&lt;br /&gt;
    r[i][0] = L*rand()/RAND_MAX;            //&lt;br /&gt;
    r[i][1] = L*rand()/RAND_MAX;            // Inicializa as pos e vel&lt;br /&gt;
    v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente&lt;br /&gt;
    v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //&lt;br /&gt;
    printf(&amp;quot;%lf %lf \n&amp;quot;, r[i][0], r[i][1]); // &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;e \n&amp;quot;); // Final da impressao dos BOIDS&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //**********Dinamica das Particulas**********//&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  a=0;&lt;br /&gt;
  do{  //inicio do passo de tempo&lt;br /&gt;
    t++;  //passo de tempo&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;set size square\n&amp;quot;);                    //&lt;br /&gt;
      printf(&amp;quot;set title &#039;Tempo t = %.1lf&#039;\n&amp;quot;, t*dt);  // &lt;br /&gt;
      printf(&amp;quot;set xrange [-0:%lf]\n&amp;quot;, L);       // Caso rode com |gnuplot &lt;br /&gt;
      printf(&amp;quot;set yrange [-0:%lf]\n&amp;quot;, L);       // sao gerados os graficos&lt;br /&gt;
      printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;), &#039;-&#039; w p pt  7 title sprintf(\&amp;quot;Predadores\&amp;quot;)\n&amp;quot;); // &lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      vmed = 0;  // velocidade media das particulas&lt;br /&gt;
      &lt;br /&gt;
    &lt;br /&gt;
    //**********Inicializar Barreiras (Predadores)**********//&lt;br /&gt;
    &lt;br /&gt;
    if(0 == t%700 &amp;amp;&amp;amp; a &amp;lt; NUM){ // Predadores Adicionados de 500 em 500 passos&lt;br /&gt;
      if(a%4 == 0){ // Ou os predadores estao posicionados em cima&lt;br /&gt;
	bx[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L;                 // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = -1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = -1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 1){ // Ou predadores sao adicionados na lateral&lt;br /&gt;
	bx[a] = 0;                 // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = 1.3*(ini*rand()/RAND_MAX+0.5);   //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = -1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 2){&lt;br /&gt;
	bx[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = 0; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = 1.3*ini*(rand()/RAND_MAX+0.5);   //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = 1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 3){&lt;br /&gt;
      	bx[a] = L; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = -1.3*ini*(rand()/RAND_MAX+0.5);//Inicializar velocidade em x&lt;br /&gt;
	vy[a] = 1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }&lt;br /&gt;
      a++;  // Vai para o proximo contador&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for(j=0;j&amp;lt;N;j++){  // dinamica de cada particula&lt;br /&gt;
      &lt;br /&gt;
      cont=0; // contador para coesao das particulass&lt;br /&gt;
      x = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      y = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      &lt;br /&gt;
      kont = 0; // contador para media das velocidades&lt;br /&gt;
      vmx = 0; // media das veloc. das particulas&lt;br /&gt;
      vmy = 0; // media das veloc. das particulas&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Alinhamento**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){        // se eh a mesma particula nao faz nada&lt;br /&gt;
	} else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*vmx/kont; // media para a velocidade&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*vmy/kont; // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem&lt;br /&gt;
	                                            // a uma distancia menor q&lt;br /&gt;
	                                            // &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c poten-&lt;br /&gt;
	                                       // cial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c poten- &lt;br /&gt;
      }                                        // cial de mola na componente y&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas&lt;br /&gt;
	                              // estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente x&lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente y&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Velocidade Pela Densidade de Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      if(cont  + kont &amp;lt; 0.1*N){   // se o numero de vizinhos for menor que 0.1*N&lt;br /&gt;
	vizinhos[j][0] = 1;       // chave 1 fecha&lt;br /&gt;
	vizinhos[j][1] = 0;       // chave 2 abre&lt;br /&gt;
      }else{&lt;br /&gt;
	vizinhos[j][0] = 0;       // chave 1 abre&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(norm(v[j][0],v[j][1]) &amp;gt; 0.5*ini){   // se a velocidade media do passo anterior for maior&lt;br /&gt;
	                                    // que 0.7*ini&lt;br /&gt;
	vizinhos[j][1] = 0; // chave 2 &amp;quot;abre&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(vizinhos[j][0] == 0){        // se chave  1 aberta &lt;br /&gt;
	if(vizinhos[j][1] == 1){      // se chave 2 fechada  entao nao faz nada&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont +kont &amp;gt;0.5*N){ // se vizinhos &amp;gt; 0.5*N entao &lt;br /&gt;
	  v[j][0] = 0.8*v[j][0];     // velocidade reduz 20% &lt;br /&gt;
	  v[j][1] = 0.8*v[j][1];     // velocidade reduz 20%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.4*N){ // se vizinhos 0.5&amp;gt; e &amp;gt;0.4 entao&lt;br /&gt;
	  v[j][0] = 0.85*v[j][0];      // velocidade reduz 15%&lt;br /&gt;
	  v[j][1] = 0.85*v[j][1];      // velocidade reduz 15%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.3*N){ // se vizinhos 0.4&amp;gt; e &amp;gt;0.3 entao&lt;br /&gt;
	  v[j][0] = 0.9*v[j][0];       // velocidade reduz 10%&lt;br /&gt;
	  v[j][1] = 0.9*v[j][1];       // velocidade reduz 10%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.2*N){ // se vizinhos 0.3&amp;gt; e &amp;gt;0.2 entao&lt;br /&gt;
	  v[j][0] = 0.95*v[j][0];      // velocidade reduz 5%&lt;br /&gt;
	  v[j][1] = 0.95*v[j][1];      // velocidade reduz 5%&lt;br /&gt;
	}&lt;br /&gt;
	vizinhos[j][1] = 1; // chave 2 fecha&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Ruido Particulas**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	random = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	random = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(PI*random)*v[j][0] - sin(PI*random)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = sin(PI*random)*v[j][0] + cos(PI*random)*v[j][1]; // rotaçao&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      &lt;br /&gt;
      for(b=0;b&amp;lt;NUM;b++){&lt;br /&gt;
	if(norm(r[j][0] -bx[b], r[j][1] - by[b]) &amp;lt; ERRE){//se a particula ta a&lt;br /&gt;
	                                                 //menos de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(r[j][0] &amp;lt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;lt; by[b]){ // se estiver atras e abaixo&lt;br /&gt;
	    v[j][0] = v[j][0] - B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] - B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;gt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;lt; by[b]){ // se estiver a frente e abaixo&lt;br /&gt;
	    v[j][0] = v[j][0] + B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] - B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;lt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;gt; by[b]){ // se estiver abaixo e acima&lt;br /&gt;
	    v[j][0] = v[j][0] - B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] + B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;gt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;gt; by[b]){// se estiver a frente e acima&lt;br /&gt;
	    v[j][0] = v[j][0] + B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] + B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      //*********Um Pouco de Barreira nas Fronteiras**********//&lt;br /&gt;
      &lt;br /&gt;
      if(r[j][0] - L &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] - EE*exp(-pow((L-r[j][0])/E,2));// Atualiza velocidade c &lt;br /&gt;
	// potencial gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][0] &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] + EE*exp(-pow(r[j][0]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] - L &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] - EE*exp(-pow((L-r[j][1])/E,2));// Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] + EE*exp(-pow(r[j][1]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      //**********Passo das particulas com CC periodica**********//&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][0] &amp;lt; epsilon){ // final do dominio na componente x &lt;br /&gt;
	r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x &lt;br /&gt;
      }else if(r[j][0] &amp;lt; 0){    // inicio do dominio na coomponente x&lt;br /&gt;
	r[j][0] =  L + r[j][0]; // recomeça no finaldo dominio em x&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][1] &amp;lt; epsilon){  // final do dominio em y&lt;br /&gt;
	r[j][1] =  L - r[j][1]; // recomeça no inicio do dominio em y&lt;br /&gt;
      }else if(r[j][1] &amp;lt; 0){   // inicio do dominio em y&lt;br /&gt;
	r[j][1] = L + r[j][1]; // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf \n&amp;quot;, r[j][0], r[j][1]); //imprime a posiçao da particula&lt;br /&gt;
      }&lt;br /&gt;
      vmed = vmed + norm(v[j][0],v[j][1]); // contador para velocidade media&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;e\n&amp;quot;); // final do grafico para |gnuplot &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //*********Passo da Barreira (Predador)*********//&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for(b=0;b&amp;lt;a;b++){&lt;br /&gt;
      &lt;br /&gt;
      if(L - bx[b] &amp;lt; epsilon){ // final do dominio em x&lt;br /&gt;
	bx[b] = L - bx[b];            // recomeça no inicio do dominio em x&lt;br /&gt;
      }else if(bx[b] &amp;lt; epsilon){ //inicio do dominio em x&lt;br /&gt;
	bx[b] =  L + bx[b];         // recomeça no final do dominio em x&lt;br /&gt;
      } &lt;br /&gt;
      &lt;br /&gt;
      bx[b] = bx[b] + vx[b]*dt; // atualiza posiçao da barreira em x&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      if(L - by[b] &amp;lt; epsilon){ // final do dominio em y &lt;br /&gt;
	by[b] =  L - by[b];           // recommeça no inicio do dominio em y&lt;br /&gt;
      }else if(by[b] &amp;lt; epsilon){  // inicio do dominio em y&lt;br /&gt;
	by[b] = L + by[b];           // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      by[b] = by[b] + vy[b]*dt; // atualiza posiçao da barreira em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf\n&amp;quot;,bx[b], by[b]); // imprime a barreira&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
     if(t%I == 0){&lt;br /&gt;
       printf(&amp;quot;e \n&amp;quot;); // final do grafico no tempo t&lt;br /&gt;
       printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
    vmedl = vmed/N; // media da velocidade das particulas&lt;br /&gt;
  }while(t&amp;lt;T);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=/codigo&amp;diff=2200</id>
		<title>/codigo</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=/codigo&amp;diff=2200"/>
		<updated>2018-01-25T05:02:28Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;              &lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include&amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// programa particulas boids para CC periodica. &lt;br /&gt;
&lt;br /&gt;
#define N 500 //numero de particulas&lt;br /&gt;
#define NUM 4 // numero de predadores&lt;br /&gt;
#define T 5000 //numero de passos&lt;br /&gt;
#define C 0.05 //constante de coesao&lt;br /&gt;
#define S 0.3 // constante de separaçao&lt;br /&gt;
#define M 0.15 // media das velocidades&lt;br /&gt;
#define B 0.6 // constante de repulsao da barreira&lt;br /&gt;
#define ini 0.1 // valor maximo das componentes da velocidade&lt;br /&gt;
              // valor maximo da velocidade (sqrt(2)*ini)&lt;br /&gt;
#define E 10 // valor de excesso que a barreira trava os BOIDS&lt;br /&gt;
#define EE 0.1 // valor constante barreira nas fronteiras&lt;br /&gt;
#define PI 3.1415926538979 // aprox de pi&lt;br /&gt;
#define I 2 // Quantidade de passos passados para plotar no gif&lt;br /&gt;
 &lt;br /&gt;
double norm(double x, double y){ //funçao norma&lt;br /&gt;
  return sqrt(x*x + y*y);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
main(){&lt;br /&gt;
  &lt;br /&gt;
  double r[N][2], v[N][2], epsilon=0.01, R=20, rmin=3, erre=12, ERRE=10, dt = 0.1;&lt;br /&gt;
  double random;&lt;br /&gt;
  double x=0., y=0., L=100, vmx=0, vmy=0, vmed=0, vmedl =0;&lt;br /&gt;
  double bx[NUM], by[NUM], vx[NUM], vy[NUM]; //barreira&lt;br /&gt;
  int i=0, j=0, k=0, l=0, m=0, t=0, a=0, b=0;&lt;br /&gt;
  int cont=0, kont=0; //conta o numero de vizinhos proximos da particula&lt;br /&gt;
  int vizinhos[N][2]; //nao deixa a velocidade explodir nem tender a 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //**********Inicializar Particulas (posicao e velocidade)**********//&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;set terminal gif animate delay 1.0E-5\n&amp;quot;);// Produz arquivo .gif&lt;br /&gt;
  printf(&amp;quot;set output &#039;boidsbar.gif&#039;\n&amp;quot;);            //&lt;br /&gt;
  printf(&amp;quot;set size square\n&amp;quot;);                            // caso rode com&lt;br /&gt;
  printf(&amp;quot;set title &#039;Tempo t = 0.0&#039;\n&amp;quot;);                  // |gnuplot apa-&lt;br /&gt;
  printf(&amp;quot;set xrange [0:%lf]\n&amp;quot;, L);                      //  recem os graficos.&lt;br /&gt;
  printf(&amp;quot;set yrange [0:%lf]\n&amp;quot;, L);                      // &lt;br /&gt;
  printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;)\n&amp;quot;); //&lt;br /&gt;
  &lt;br /&gt;
  for(i=0;i&amp;lt;N;i++){&lt;br /&gt;
    r[i][0] = L*rand()/RAND_MAX;            //&lt;br /&gt;
    r[i][1] = L*rand()/RAND_MAX;            // Inicializa as pos e vel&lt;br /&gt;
    v[i][0] = ini*(2.*rand()/RAND_MAX - 1); // das particulas aleatoriamente&lt;br /&gt;
    v[i][1] = ini*(2.*rand()/RAND_MAX - 1); //&lt;br /&gt;
    printf(&amp;quot;%lf %lf \n&amp;quot;, r[i][0], r[i][1]); // &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;e \n&amp;quot;); // Final da impressao dos BOIDS&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  //**********Dinamica das Particulas**********//&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  a=0;&lt;br /&gt;
  do{  //inicio do passo de tempo&lt;br /&gt;
    t++;  //passo de tempo&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;set size square\n&amp;quot;);                    //&lt;br /&gt;
      printf(&amp;quot;set title &#039;Tempo t = %.1lf&#039;\n&amp;quot;, t*dt);  // &lt;br /&gt;
      printf(&amp;quot;set xrange [-0:%lf]\n&amp;quot;, L);       // Caso rode com |gnuplot &lt;br /&gt;
      printf(&amp;quot;set yrange [-0:%lf]\n&amp;quot;, L);       // sao gerados os graficos&lt;br /&gt;
      printf(&amp;quot;plot &#039;-&#039; w p pt 3 title sprintf(\&amp;quot;BOIDS\&amp;quot;), &#039;-&#039; w p pt  7 title sprintf(\&amp;quot;Predadores\&amp;quot;)\n&amp;quot;); // &lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      vmed = 0;  // velocidade media das particulas&lt;br /&gt;
      &lt;br /&gt;
    &lt;br /&gt;
    //**********Inicializar Barreiras (Predadores)**********//&lt;br /&gt;
    &lt;br /&gt;
    if(0 == t%700 &amp;amp;&amp;amp; a &amp;lt; NUM){ // Predadores Adicionados de 500 em 500 passos&lt;br /&gt;
      if(a%4 == 0){ // Ou os predadores estao posicionados em cima&lt;br /&gt;
	bx[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L;                 // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = -1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = -1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 1){ // Ou predadores sao adicionados na lateral&lt;br /&gt;
	bx[a] = 0;                 // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = 1.3*(ini*rand()/RAND_MAX+0.5);   //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = -1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 2){&lt;br /&gt;
	bx[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = 0; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = 1.3*ini*(rand()/RAND_MAX+0.5);   //Inicializar velocidade em x&lt;br /&gt;
	vy[a] = 1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }else if(a%4 == 3){&lt;br /&gt;
      	bx[a] = L; // Inicializar barreira na componente x&lt;br /&gt;
	by[a] = L*rand()/RAND_MAX; // Inicializar barreira na componente y&lt;br /&gt;
	vx[a] = -1.3*ini*(rand()/RAND_MAX+0.5);//Inicializar velocidade em x&lt;br /&gt;
	vy[a] = 1.3*ini*(rand()/RAND_MAX+0.5); //Inicializar velocidade em y&lt;br /&gt;
      }&lt;br /&gt;
      a++;  // Vai para o proximo contador&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for(j=0;j&amp;lt;N;j++){  // dinamica de cada particula&lt;br /&gt;
      &lt;br /&gt;
      cont=0; // contador para coesao das particulass&lt;br /&gt;
      x = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      y = 0; // media das particulas vizinhas para coesao&lt;br /&gt;
      &lt;br /&gt;
      kont = 0; // contador para media das velocidades&lt;br /&gt;
      vmx = 0; // media das veloc. das particulas&lt;br /&gt;
      vmy = 0; // media das veloc. das particulas&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Alinhamento**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){        // se eh a mesma particula nao faz nada&lt;br /&gt;
	} else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*vmx/kont; // media para a velocidade&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*vmy/kont; // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem&lt;br /&gt;
	                                            // a uma distancia menor q&lt;br /&gt;
	                                            // &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c poten-&lt;br /&gt;
	                                       // cial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c poten- &lt;br /&gt;
      }                                        // cial de mola na componente y&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas&lt;br /&gt;
	                              // estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente x&lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial na componente y&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Velocidade Pela Densidade de Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      if(cont  + kont &amp;lt; 0.1*N){   // se o numero de vizinhos for menor que 0.1*N&lt;br /&gt;
	vizinhos[j][0] = 1;       // chave 1 fecha&lt;br /&gt;
	vizinhos[j][1] = 0;       // chave 2 abre&lt;br /&gt;
      }else{&lt;br /&gt;
	vizinhos[j][0] = 0;       // chave 1 abre&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(norm(v[j][0],v[j][1]) &amp;gt; 0.5*ini){   // se a velocidade media do passo anterior for maior&lt;br /&gt;
	                                    // que 0.7*ini&lt;br /&gt;
	vizinhos[j][1] = 0; // chave 2 &amp;quot;abre&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(vizinhos[j][0] == 0){        // se chave  1 aberta &lt;br /&gt;
	if(vizinhos[j][1] == 1){      // se chave 2 fechada  entao nao faz nada&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont +kont &amp;gt;0.5*N){ // se vizinhos &amp;gt; 0.5*N entao &lt;br /&gt;
	  v[j][0] = 0.8*v[j][0];     // velocidade reduz 20% &lt;br /&gt;
	  v[j][1] = 0.8*v[j][1];     // velocidade reduz 20%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.4*N){ // se vizinhos 0.5&amp;gt; e &amp;gt;0.4 entao&lt;br /&gt;
	  v[j][0] = 0.85*v[j][0];      // velocidade reduz 15%&lt;br /&gt;
	  v[j][1] = 0.85*v[j][1];      // velocidade reduz 15%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.3*N){ // se vizinhos 0.4&amp;gt; e &amp;gt;0.3 entao&lt;br /&gt;
	  v[j][0] = 0.9*v[j][0];       // velocidade reduz 10%&lt;br /&gt;
	  v[j][1] = 0.9*v[j][1];       // velocidade reduz 10%&lt;br /&gt;
	  &lt;br /&gt;
	}else if(cont + kont &amp;gt; 0.2*N){ // se vizinhos 0.3&amp;gt; e &amp;gt;0.2 entao&lt;br /&gt;
	  v[j][0] = 0.95*v[j][0];      // velocidade reduz 5%&lt;br /&gt;
	  v[j][1] = 0.95*v[j][1];      // velocidade reduz 5%&lt;br /&gt;
	}&lt;br /&gt;
	vizinhos[j][1] = 1; // chave 2 fecha&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //**********Ruido Particulas**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	random = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	random = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(PI*random)*v[j][0] - sin(PI*random)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = sin(PI*random)*v[j][0] + cos(PI*random)*v[j][1]; // rotaçao&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      &lt;br /&gt;
      for(b=0;b&amp;lt;NUM;b++){&lt;br /&gt;
	if(norm(r[j][0] -bx[b], r[j][1] - by[b]) &amp;lt; ERRE){//se a particula ta a&lt;br /&gt;
	                                                 //menos de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(r[j][0] &amp;lt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;lt; by[b]){ // se estiver atras e abaixo&lt;br /&gt;
	    v[j][0] = v[j][0] - B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] - B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;gt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;lt; by[b]){ // se estiver a frente e abaixo&lt;br /&gt;
	    v[j][0] = v[j][0] + B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] - B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;lt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;gt; by[b]){ // se estiver abaixo e acima&lt;br /&gt;
	    v[j][0] = v[j][0] - B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] + B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	  }else if(r[j][0] &amp;gt; bx[b] &amp;amp;&amp;amp; r[j][1] &amp;gt; by[b]){// se estiver a frente e acima&lt;br /&gt;
	    v[j][0] = v[j][0] + B*norm(r[j][0] - bx[b], r[j][0] - bx[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	    v[j][1] = v[j][1] + B*norm(r[j][1] - by[b], r[j][1] - by[b])/pow(norm(r[j][0] - bx[b], r[j][1]- by[b]),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
    &lt;br /&gt;
      //*********Um Pouco de Barreira nas Fronteiras**********//&lt;br /&gt;
      &lt;br /&gt;
      if(r[j][0] - L &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] - EE*exp(-pow((L-r[j][0])/E,2));// Atualiza velocidade c &lt;br /&gt;
	// potencial gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][0] &amp;lt; E){&lt;br /&gt;
	v[j][0] = v[j][0] + EE*exp(-pow(r[j][0]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente x&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] - L &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] - EE*exp(-pow((L-r[j][1])/E,2));// Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      if(r[j][1] &amp;lt; E){&lt;br /&gt;
	v[j][1] = v[j][1] + EE*exp(-pow(r[j][1]/E,2)); // Atualiza velocidade c pot&lt;br /&gt;
	//  gaussiano na componente y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      //**********Passo das particulas com CC periodica**********//&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][0] &amp;lt; epsilon){ // final do dominio na componente x &lt;br /&gt;
	r[j][0] = L - r[j][0]; // recomeça no inicio do dominio em x &lt;br /&gt;
      }else if(r[j][0] &amp;lt; 0){    // inicio do dominio na coomponente x&lt;br /&gt;
	r[j][0] =  L + r[j][0]; // recomeça no finaldo dominio em x&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][0] = r[j][0] + v[j][0]*dt; // atualiza a posiçao da particula em x&lt;br /&gt;
      &lt;br /&gt;
      if(L-r[j][1] &amp;lt; epsilon){  // final do dominio em y&lt;br /&gt;
	r[j][1] =  L - r[j][1]; // recomeça no inicio do dominio em y&lt;br /&gt;
      }else if(r[j][1] &amp;lt; 0){   // inicio do dominio em y&lt;br /&gt;
	r[j][1] = L + r[j][1]; // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      r[j][1] = r[j][1] + v[j][1]*dt; // atualiza a posiçao da particula em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf \n&amp;quot;, r[j][0], r[j][1]); //imprime a posiçao da particula&lt;br /&gt;
      }&lt;br /&gt;
      vmed = vmed + norm(v[j][0],v[j][1]); // contador para velocidade media&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if(t%I == 0){&lt;br /&gt;
      printf(&amp;quot;e\n&amp;quot;); // final do grafico para |gnuplot &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //*********Passo da Barreira (Predador)*********//&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for(b=0;b&amp;lt;a;b++){&lt;br /&gt;
      &lt;br /&gt;
      if(L - bx[b] &amp;lt; epsilon){ // final do dominio em x&lt;br /&gt;
	bx[b] = L - bx[b];            // recomeça no inicio do dominio em x&lt;br /&gt;
      }else if(bx[b] &amp;lt; epsilon){ //inicio do dominio em x&lt;br /&gt;
	bx[b] =  L + bx[b];         // recomeça no final do dominio em x&lt;br /&gt;
      } &lt;br /&gt;
      &lt;br /&gt;
      bx[b] = bx[b] + vx[b]*dt; // atualiza posiçao da barreira em x&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      if(L - by[b] &amp;lt; epsilon){ // final do dominio em y &lt;br /&gt;
	by[b] =  L - by[b];           // recommeça no inicio do dominio em y&lt;br /&gt;
      }else if(by[b] &amp;lt; epsilon){  // inicio do dominio em y&lt;br /&gt;
	by[b] = L + by[b];           // recomeça no final do dominio em y&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      by[b] = by[b] + vy[b]*dt; // atualiza posiçao da barreira em y&lt;br /&gt;
&lt;br /&gt;
      if(t%I == 0){&lt;br /&gt;
	printf(&amp;quot;%lf %lf\n&amp;quot;,bx[b], by[b]); // imprime a barreira&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
     if(t%I == 0){&lt;br /&gt;
       printf(&amp;quot;e \n&amp;quot;); // final do grafico no tempo t&lt;br /&gt;
       printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
    vmedl = vmed/N; // media da velocidade das particulas&lt;br /&gt;
  }while(t&amp;lt;T);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2198</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2198"/>
		<updated>2018-01-25T03:40:32Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Coesão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Predador ===&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif‎ |thumb|none|500px| BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2197</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2197"/>
		<updated>2018-01-25T03:40:05Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Coesão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Algoritmo Para BOIDS =&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = \frac{1}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, com k sendo o número de vizinhos dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão == &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x - \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BOIDS Adaptados Para Cardume de Peixes==&lt;br /&gt;
&lt;br /&gt;
Para a realização da adaptação, utiliza-se outra regra de alinhamento, fazendo uma média ponderada entre a velocidade do boids no tempo t com a velocidade dos vizinhos, da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} =  (1-M) v_{j} +  \frac{M}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&amp;lt;/math&amp;gt;, M sendo o termo da média.&lt;br /&gt;
&lt;br /&gt;
as outras relaçoes, separação e coesão continuam idênticas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Predador ===&lt;br /&gt;
A partícula que representa o predador é como uma barreira repulsiva. Obedecendo a&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  F_{b} = B \frac{r_{j} - b_{k}}{ ||r_{j} - b_{k}||^{1.5} }  &amp;lt;/math&amp;gt;, onde B é o coeficiente da barreira e b é a posição da barreira&lt;br /&gt;
&lt;br /&gt;
. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif|thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhamento.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif‎ |thumb|none|500px| BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Coesas.gif&amp;diff=2195</id>
		<title>Arquivo:Coesas.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Coesas.gif&amp;diff=2195"/>
		<updated>2018-01-25T03:38:21Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: Alvaroe enviou uma nova versão de &amp;amp;quot;Arquivo:Coesas.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1929</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1929"/>
		<updated>2018-01-24T09:35:41Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Coesão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
=O Algoritmo=&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade)==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = (1-M)\vec{V}^{n}_{j} + M \frac{1}{N} \Sigma^{n}_{k=1} \vec{V}_{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão== &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x + \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = - \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como se fosse uma barreira repulsiva. Obedecendo, também, a Lei de Coulomb. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
Na animação abaixo temos o comportamento dinâmico do sistema para o parâmetro &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; crescente. Note que, de fato, a medida que &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; aumenta, também ocorre o aumento da concentração dos BOIDs.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesas.gif‎ |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhadas.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif‎ |thumb|none|500px| BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1928</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1928"/>
		<updated>2018-01-24T09:27:51Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Resultados e Discução */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
=O Algoritmo=&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade)==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = (1-M)\vec{V}^{n}_{j} + M \frac{1}{N} \Sigma^{n}_{k=1} \vec{V}_{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão== &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x + \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = - \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como se fosse uma barreira repulsiva. Obedecendo, também, a Lei de Coulomb. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Repelentes.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
[[Arquivo:Coesas.gif‎ |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
[[Arquivo:Alinhadas.gif‎ |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:BOIDS.gif‎ |thumb|none|500px| BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Repelentes.gif&amp;diff=1927</id>
		<title>Arquivo:Repelentes.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Repelentes.gif&amp;diff=1927"/>
		<updated>2018-01-24T09:25:26Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Coesas.gif&amp;diff=1926</id>
		<title>Arquivo:Coesas.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Coesas.gif&amp;diff=1926"/>
		<updated>2018-01-24T09:24:37Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:BOIDS.gif&amp;diff=1925</id>
		<title>Arquivo:BOIDS.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:BOIDS.gif&amp;diff=1925"/>
		<updated>2018-01-24T09:24:19Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Alinhadas.gif&amp;diff=1924</id>
		<title>Arquivo:Alinhadas.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Alinhadas.gif&amp;diff=1924"/>
		<updated>2018-01-24T09:23:51Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1884</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1884"/>
		<updated>2018-01-23T01:57:58Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Desenvolvimento em C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
=O Algoritmo=&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade)==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = (1-M)\vec{V}^{n}_{j} + M \frac{1}{N} \Sigma^{n}_{k=1} \vec{V}_{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão== &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x + \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = - \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como se fosse uma barreira repulsiva. Obedecendo, também, a Lei de Coulomb. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C utilizados no trabalho para as regras e etapas.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1873</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1873"/>
		<updated>2018-01-23T01:47:45Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Referências */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
=O Algoritmo=&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade)==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = (1-M)\vec{V}^{n}_{j} + M \frac{1}{N} \Sigma^{n}_{k=1} \vec{V}_{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão== &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x + \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = - \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como se fosse uma barreira repulsiva. Obedecendo, também, a Lei de Coulomb. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C para as regras e etapas em questão.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;br /&gt;
*Vicsek, T.; Czirok, A.; Ben-Jacob, E.;; Cohen, I.; Shochet, O. (1995). &amp;quot;Novel type of phase transition in a system of self-driven particles&amp;quot;. Physical Review Letters. 75: 1226–1229. [https://arxiv.org/abs/cond-mat/0611743 arXiv:cond-mat/0611743]&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1871</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1871"/>
		<updated>2018-01-23T01:37:46Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
=O Algoritmo=&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade)==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = (1-M)\vec{V}^{n}_{j} + M \frac{1}{N} \Sigma^{n}_{k=1} \vec{V}_{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão== &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x + \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = - \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como se fosse uma barreira repulsiva. Obedecendo, também, a Lei de Coulomb. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C para as regras e etapas em questão.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1870</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=1870"/>
		<updated>2018-01-23T01:35:47Z</updated>

		<summary type="html">&lt;p&gt;Alvaroe: /* Predador */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Contexto Histórico=&lt;br /&gt;
Desenvolvido por Craig Reynolds em 1986, é um algoritmo que busca, por meio de regras de comportamento, reproduzir o comportamento sincronizado de grupos de animais. Por exemplo manadas de animais terrestres, cardumes de peixes, bando de pássaros e etc. O nome BOID corresponde ao encurtamento da expressão em inglês &#039;&#039;“bird-oid object”&#039;&#039;, que se refere a um objeto “tipo pássaro”. Seu trabalho foi publicado em 87 sob o título original, em inglês, &#039;&#039;&amp;quot;Flocks, herds and schools: A distributed behavioral model&amp;quot;&#039;&#039;.&lt;br /&gt;
O modelo base de Craig já fora utilizado para diversas implementações e estudos. Como estudo comportamental de medo, interação entre animais via olfato modelando feromônios, mudança de liderança de um bando, dentre muitas outras aplicações interessantes.&lt;br /&gt;
&lt;br /&gt;
=Motivação=&lt;br /&gt;
O movimento de animais em sincronia é extremamente complexo e é chave para sua sobrevivência em bando. Peixes, pássaros e mamíferos terrestres tem esse tipo de comportamento principalmente no que diz respeito a defesa em momentos em que sentem em perigo. A concentração intimida e o movimento confunde seus predadores. Além de ser extremamente prazeroso assistir um bando de pássaros ou um cardume de peixes em sua dança sincronizada.&lt;br /&gt;
&lt;br /&gt;
Este trabalho busca, em suas etapas, reproduzir um cardume de peixes em seu padrão síncrono de movimento e, posteriormente, na presença de um ou mais predadores.&lt;br /&gt;
&lt;br /&gt;
=O Algoritmo=&lt;br /&gt;
Inicialmente são sorteadas posições e velocidades aleatórias para os objetos. As regras são então calculadas a cada de passo temporal. Embora cada boid tenha liberdade sobre todo o espaço descrito, o seu comportamento é influenciado apenas por outros dentro de uma região circular centrada no objeto dita &#039;&#039;raio de interação&#039;&#039; (R). Após o cálculo das novas posições e velocidades é somado um incremento de tempo e o algoritmo recomeça.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Interação de repulsão entre os indivíduos para evitar superconcentração local (ou no caso extremo uma superposição). Um potencial análogo à Lei de Coulomb para cargas de mesmo sinal:&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = \frac{S (\vec{p}_j - \vec{p}_k)}{||\vec{r}||^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\vec{r} = (x_j-x_k)\hat{i} + (y_j-y_k)\hat{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; é o coeficiente de separação.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_separation.gif|thumb|none|300px|Fig1. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_separation.gif]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade)==&lt;br /&gt;
A velocidade média dos parceiros próximos influencia o vetor velocidade do objeto, fazendo-o ter um comportamento parecido com sua vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}^{n+1}_{j} = (1-M)\vec{V}^{n}_{j} + M \frac{1}{N} \Sigma^{n}_{k=1} \vec{V}_{k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_alignment.gif|thumb|none|300px|Fig2. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_alignment.gif]]&lt;br /&gt;
&lt;br /&gt;
== Coesão== &lt;br /&gt;
Os BOIDs interagentes tem um potencial de mola entre si, fazendo com que tenham a tendência de mover-se em direção ao centro de massa do grupo. Calculando primeiramente o centro de massa (CM) das partículas vizinhas utiliza-se da força elástica para simular uma mola entre o objeto e o CM da vizinhança.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{CM} = \frac{1}{N}\Sigma^n_{i=1} \vec{r}_i&amp;lt;/math&amp;gt;, N sendo o número de partículas dentro do raio de interação.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{V}_j = C (\vec{r}_j - \vec{r}_{CM})&amp;lt;/math&amp;gt;, C é o coeficiente elástico.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Rule_cohesion.gif|thumb|none|300px|Fig3. link:https://en.wikipedia.org/wiki/Boids#/media/File:Rule_cohesion.gif]]&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
Para reproduzir melhor um ser vivo, um pequeno ruído compõe a velocidade. Isso faz com que tenhamos uma maior flutuação no caminho que os boids traçam.&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;\zeta&amp;lt;/math&amp;gt; um número real aleatório,&lt;br /&gt;
&amp;lt;math&amp;gt;V_x = \cos{(\zeta)} V_x + \sin{(\zeta)} V_y&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;V_y = - \sin{(\zeta)} V_x + \cos{(\zeta)} V_y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
A partícula que representa o predador é como se fosse uma barreira repulsiva. Obedecendo, também, a Lei de Coulomb. No presente trabalho o predador não persegue os BOIDs, apenas se desloca em linha reta no plano com velocidade constante.&lt;br /&gt;
&lt;br /&gt;
Aqui[https://youtu.be/mgg6HhKRwY0?t=41] é possível ver o comportamento de um cardume de peixes na presença de algumas arraias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Predador.jpg |thumb|none|500px| BOIDs na presença de dois predadores.]]&lt;br /&gt;
&lt;br /&gt;
=Resultados e Discução=&lt;br /&gt;
Nosso modelo foi simulado com condições de contorno periódicas numa área quadrada de lado &amp;lt;math&amp;gt;L = 1000&amp;lt;/math&amp;gt;. Abaixo apresentamos os resultados para cada regra isoladamente e ao final todas funcionando simultaneamente com e sem a presença do predador.&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
Aqui temos, como esperado, um corportamento semelhante ao de um gás ideal. Que busca um estado de menor energia ocupando todo o espaço disponível. Note que poucas regiões tem mais de 3 objetos próximos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Separacao.gif‎ |thumb|none|500px| Simulação apenas da regra de separação entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
Para a coesão temos um comportamento semelhante ao condensamento de um gás em gotas ou gotículas. As regiões mais concentradas (círculo verde) perdem um pouco de sua capacidade de mobilidade e se tornam atrativas para partículas vizinhas (círculos azuis). Ao passo que objetos isolados (círculos roxos) se comportam independentemente até encontrarem um, ou mais, vizinhos ou regiões de alta concentração.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Coesao edit.gif |thumb|none|500px| Simulação apenas da regra de coesão entre BOIDS.]]&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor velocidade) ==&lt;br /&gt;
Na regra de alinhamento temos o comportamento do vetor velocidade do objeto sendo influenciado pela velocidade das partículas na vizinhança. Na imagem estática fica difícil de diferenciar da regra de separação, porém, note como aqui há mais regiões com 3 ou mais BOIDs bem próximos. Em alguns casos pode-se notar que quase ocorre uma superposição.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Alinhamento.gif |thumb|none|500px| Simulação apenas da regra de alinhamento entre BOIDS. ]]&lt;br /&gt;
&lt;br /&gt;
= Conclusão =&lt;br /&gt;
&lt;br /&gt;
=Desenvolvimento em C=&lt;br /&gt;
Abaixo verá trechos do código em linguagem de programação C para as regras e etapas em questão.&lt;br /&gt;
&lt;br /&gt;
Link para o [[/codigo]] completo.&lt;br /&gt;
&lt;br /&gt;
== Coesão ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Coesao Entre Particulas e CM**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(m=0;m&amp;lt;N;m++){ // laço das particulas &lt;br /&gt;
	if(norm(r[j][1]-r[m][1],r[j][0]-r[m][0])&amp;lt;R){// se as particulas tiverem a uma distancia menor q &amp;quot;R&amp;quot;&lt;br /&gt;
	  cont++;          // acrescenta no contador &lt;br /&gt;
	  x = x + r[m][0]; // acrescenta na posicao das particulas na comp. x&lt;br /&gt;
	  y = y + r[m][1]; // acrescenta na posicao das particulas na comp. y&lt;br /&gt;
	}	 &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(cont&amp;gt;1){ // se contador for cont &amp;gt; 1&lt;br /&gt;
	x = x/cont;     // media aritmetica na componente x       &lt;br /&gt;
	y = y/cont;     // media aritmetica a componente y&lt;br /&gt;
	&lt;br /&gt;
	v[j][0] = v[j][0] - C*(r[j][0] - x)/L; // atualiza velocidade c potencial de mola na componente x&lt;br /&gt;
	v[j][1] = v[j][1] - C*(r[j][1] - y)/L; // atualiza velocidade c potencial de mola na componente y &lt;br /&gt;
      }   &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Separação ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Separacao Entre Particulas**********//&lt;br /&gt;
      &lt;br /&gt;
      for(l=0;l&amp;lt;N;l++){ //laço para particulas&lt;br /&gt;
	if(l==j){  // se a particula for ela mesma nao faz nada &lt;br /&gt;
	  &lt;br /&gt;
	}else{     // se nao é ela entao&lt;br /&gt;
	  &lt;br /&gt;
	  if(norm(r[j][0]-r[l][0],r[j][1]-r[l][1])&amp;lt;rmin){ // se as particulas estao a uma distancia menor que  &amp;quot;rmin&amp;quot;&lt;br /&gt;
	    v[j][0] = v[j][0] + S*(r[j][0] - r[l][0])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente x&lt;br /&gt;
	            &lt;br /&gt;
	    v[j][1] = v[j][1] + S*(r[j][1] - r[l][1])/pow(norm(r[l][0]-r[j][0],r[l][1]-r[j][1]),2); // Atualiza velocidade c potencial analogo a lei de Coulomb na componente y&lt;br /&gt;
	            &lt;br /&gt;
	  }&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alinhamento (vetor Velocidade) ==&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    //**********Media da Velocidade dos Vizinhos**********//&lt;br /&gt;
      &lt;br /&gt;
      &lt;br /&gt;
      for(k=0;k&amp;lt;N;k++){ // laço para todas as particulas&lt;br /&gt;
	if(k == j){  // se eh a mesma particula nao faz nada&lt;br /&gt;
	}else if(norm(r[j][1]-r[k][1],r[j][0]-r[k][0])&amp;lt;erre){ &lt;br /&gt;
	  kont++;              // se eh outra particula acrescenta no contador&lt;br /&gt;
	  vmx = vmx + v[k][0]; // acrescenta a velocidade na componente x&lt;br /&gt;
	  vmy = vmy + v[k][1]; // acrescenta a velocidade na componente y&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(kont &amp;gt; 1){&lt;br /&gt;
	v[j][0] = (1-M)*v[j][0] + M*(vmx/kont); // media com peso M para a vel.&lt;br /&gt;
	v[j][1] = (1-M)*v[j][1] + M*(vmy/kont); // dos vizinhos e a propria&lt;br /&gt;
      }&lt;br /&gt;
         &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruído ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //**********Ruido**********//&lt;br /&gt;
      if(rand()%2 == 0){ // criterio para decidir a fase&lt;br /&gt;
	randomi = - rand()/RAND_MAX; // fase&lt;br /&gt;
      }else{&lt;br /&gt;
	randomi = rand()/RAND_MAX; // fase&lt;br /&gt;
      }&lt;br /&gt;
      v[j][0] = cos(randomi)*v[j][0] + sin(randomi)*v[j][1];  // rotaçao&lt;br /&gt;
      v[j][1] = - sin(randomi)*v[j][0] + cos(randomi)*v[j][1]; // rotaçao&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Predador ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      //Barreira puntual no centro&lt;br /&gt;
      if(norm(r[j][0] -bx, r[j][1] - by) &amp;lt; ERRE){ // se a particula ta a menos&lt;br /&gt;
	                                          //  de &amp;quot;ERRE&amp;quot; entao&lt;br /&gt;
	&lt;br /&gt;
	if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver atras e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;lt; by){ // se estiver a frente e abaixo&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] - B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;lt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){ // se estiver abaixo e acima&lt;br /&gt;
	  v[j][0] = v[j][0] - B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5);// atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  &lt;br /&gt;
	}else if(r[j][0] &amp;gt; bx &amp;amp;&amp;amp; r[j][1] &amp;gt; by){// se estiver a frente e acima&lt;br /&gt;
	  v[j][0] = v[j][0] + B*norm(r[j][0] - bx, r[j][0] - bx)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	  v[j][1] = v[j][1] + B*norm(r[j][1] - by, r[j][1] - by)/pow(norm(r[j][0] - bx, r[j][1]- by),1.5); // atualiza velocidade com potencial analogo &amp;quot;gravitac&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Referências=&lt;br /&gt;
*https://en.wikipedia.org/wiki/Boids&lt;br /&gt;
*Reynolds, C. W. (1987) Flocks, Herds, and Schools: A Distributed Behavioral Model, in Computer Graphics, 21(4) (SIGGRAPH &#039;87 Conference Proceedings) pages 25-34.&lt;/div&gt;</summary>
		<author><name>Alvaroe</name></author>
	</entry>
</feed>