<?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=Pedrow7</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=Pedrow7"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Pedrow7"/>
	<updated>2026-06-12T14:33:11Z</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=2283</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2283"/>
		<updated>2018-01-25T09:31:23Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Resultados e Discussão */&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. 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). 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2282</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2282"/>
		<updated>2018-01-25T09:30:37Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Resultados e Discussão */&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. 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). 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 numa área quadrada de lado &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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2281</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2281"/>
		<updated>2018-01-25T09:30:01Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Predador */&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. 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). 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 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2280</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2280"/>
		<updated>2018-01-25T09:28:43Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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 é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2279</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2279"/>
		<updated>2018-01-25T09:28:31Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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 é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2278</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2278"/>
		<updated>2018-01-25T09:27:53Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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 é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2277</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2277"/>
		<updated>2018-01-25T09:26:51Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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,&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.&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 é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2276</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2276"/>
		<updated>2018-01-25T09:26:34Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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_{i}_{j} - L}{E})^2) &amp;lt;/math&amp;gt;,  para quando o boid se aproxima da extremidade superior do dominio,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v_{j} = a exp(-(\frac{x_{i}_{j}}{E})^2) &amp;lt;/math&amp;gt;, para quando o boid se aproxima da parte inferior do dominio.&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 é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2275</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2275"/>
		<updated>2018-01-25T09:24:18Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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, da 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;, sendo a constante de proporcionalidade e E o raio de interação da barreira &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 é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2274</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2274"/>
		<updated>2018-01-25T09:14:10Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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.&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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2273</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2273"/>
		<updated>2018-01-25T09:13:54Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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. 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). 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 dos 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;
== 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2272</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2272"/>
		<updated>2018-01-25T09:13:14Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2271</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2271"/>
		<updated>2018-01-25T09:12:59Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;
e&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 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2270</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2270"/>
		<updated>2018-01-25T09:12:19Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;
 e&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 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2269</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2269"/>
		<updated>2018-01-25T09:12:05Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;
 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 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2268</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2268"/>
		<updated>2018-01-25T09:11:32Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;,&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;,&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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2267</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2267"/>
		<updated>2018-01-25T09:11:16Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;,&lt;br /&gt;
 e,&lt;br /&gt;
 &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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2266</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2266"/>
		<updated>2018-01-25T09:11:03Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;,&lt;br /&gt;
 e&lt;br /&gt;
 &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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2265</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2265"/>
		<updated>2018-01-25T09:10:46Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;&lt;br /&gt;
 e&lt;br /&gt;
 &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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2264</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2264"/>
		<updated>2018-01-25T09:10:31Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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. 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). 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;&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;&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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2263</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2263"/>
		<updated>2018-01-25T09:10:12Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Coesão */&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. 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). 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;
&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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2262</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2262"/>
		<updated>2018-01-25T09:09:31Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Coesão */&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. 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). 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;, &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;, &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2261</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2261"/>
		<updated>2018-01-25T09:08:59Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Coesão */&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. 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). 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;, &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;, &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; é 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2260</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2260"/>
		<updated>2018-01-25T09:08:01Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Alinhamento (vetor velocidade) */&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. 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). 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;, 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2259</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2259"/>
		<updated>2018-01-25T09:07:35Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Separação */&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. 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). 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 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2258</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2258"/>
		<updated>2018-01-25T09:01:37Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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. 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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2257</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2257"/>
		<updated>2018-01-25T08:20:57Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* BOIDS Adaptados Para Cardume de Peixes */&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 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS/codigo_BOIDS_cardume&amp;diff=2255</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=2255"/>
		<updated>2018-01-25T08:20:11Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: &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;boidcvel.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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2250</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2250"/>
		<updated>2018-01-25T08:04:29Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Separação */&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;
== 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2199</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2199"/>
		<updated>2018-01-25T03:43:11Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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.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 [[/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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2194</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2194"/>
		<updated>2018-01-25T03:37:55Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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 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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2191</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2191"/>
		<updated>2018-01-25T03:33:45Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: &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;&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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2189</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2189"/>
		<updated>2018-01-25T03:30:25Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: &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;
== 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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2179</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2179"/>
		<updated>2018-01-25T02:51:00Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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} = \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;
[[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;
== 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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2178</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2178"/>
		<updated>2018-01-25T02:50:24Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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} = \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;
[[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;
== 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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2177</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2177"/>
		<updated>2018-01-25T02:46:22Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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} = \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;
[[Arquivo:alinhamento.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;
== 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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Alinhamento.gif&amp;diff=2176</id>
		<title>Arquivo:Alinhamento.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Alinhamento.gif&amp;diff=2176"/>
		<updated>2018-01-25T02:45:56Z</updated>

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

		<summary type="html">&lt;p&gt;Pedrow7: /* 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} = \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;
[[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;
== 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:|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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2174</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2174"/>
		<updated>2018-01-25T02:38:52Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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} = \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;
[[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;
== 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: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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2173</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2173"/>
		<updated>2018-01-25T02:38:08Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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}{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;
[[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;
== 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: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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2171</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2171"/>
		<updated>2018-01-25T02:37:40Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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}{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;, 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;
== 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: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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2170</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2170"/>
		<updated>2018-01-25T02:37:27Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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}{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;, 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;
== 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: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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2168</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2168"/>
		<updated>2018-01-25T02:32:10Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Ruído */&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}{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;, 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;
== 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2167</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2167"/>
		<updated>2018-01-25T02:31:26Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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}{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;, 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2166</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2166"/>
		<updated>2018-01-25T02:31:12Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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 (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;) 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}{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;, 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2165</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2165"/>
		<updated>2018-01-25T02:30:56Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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 (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;) 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}{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;, 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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2164</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2164"/>
		<updated>2018-01-25T02:29:43Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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 (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;) 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}{k} \Sigma^{k}_{i=1} \vec{V}_{i}&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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2162</id>
		<title>Grupo - BOIDS</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo_-_BOIDS&amp;diff=2162"/>
		<updated>2018-01-25T02:29:03Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* 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;
=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 (&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;) 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}{k} \Sigma^{k}_{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>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo1_-_Dif_em_2D&amp;diff=1186</id>
		<title>Grupo1 - Dif em 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo1_-_Dif_em_2D&amp;diff=1186"/>
		<updated>2017-12-02T16:18:45Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: /* Método da Super Relaxação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A equação de Poisson:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta u = \frac{\partial ^{2} u }{\partial x^2} + \frac{\partial ^{2} u }{\partial y^2} = -g(x,y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
é uma equação do tipo Elíptica que representa fenômenos físicos estácionarios relacionados a Eletrostatica, Dinâmica de Fluídos e Transferência de Calor. Se &amp;lt;math&amp;gt; g(x,y) \equiv 0 &amp;lt;/math&amp;gt; a equação passa a ser chamada de Equação de Laplace. Os problemas relacionados a equação de Laplace são estudados pela &amp;quot;Teoria do Potencial&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
As soluções &amp;lt;math&amp;gt; u = u(x,y) &amp;lt;/math&amp;gt; da Equação de Laplace são denominadas funções Harmônicas. Os problemas mais habituais na vida de um físico, engenheiro ou matemático ao se depararem com uma EDP,  são os problemas com Condições de Contorno em um dominío &amp;lt;math&amp;gt; \Omega \in \mathbb{R}^2&amp;lt;/math&amp;gt;, essencialmente será trabalhada a Condição de Dirichlet, que possui fronteiras (&amp;lt;math&amp;gt; \partial \Omega &amp;lt;/math&amp;gt;) conhecidas, tendo o seguinte formato:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
	\Delta u =  0 &amp;amp; \text{para } (x,y) \in \Omega, \\&lt;br /&gt;
	u = f(x,y)  &amp;amp; \text{para } (x,y) \in \partial \Omega. &lt;br /&gt;
\end{cases}  &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A equação de Poisson possui forma parecida para o Problema de Dirichlet, que fica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
	\Delta u =  - g(x) &amp;amp; \text{para } (x,y) \in \Omega, \\&lt;br /&gt;
	u = f(x,y)  &amp;amp; \text{para } (x,y) \in \partial \Omega. &lt;br /&gt;
\end{cases}  &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para tais problemas, estudaremos os métodos de Relaxação e Super-Relaxação para encontrar as soluções da Equação de Laplace na região de Quadrado de Lado &amp;lt;math&amp;gt;L &amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt; ( \{ \Omega = (0,L)\times (0,L) \} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
== Dominio Quadrado de Lado &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== Solução Analítica da Equação de Laplace  ===&lt;br /&gt;
&lt;br /&gt;
Seja o problema em &amp;lt;math&amp;gt;\Omega = (0, L) \times (0, L)&amp;lt;/math&amp;gt;, temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u(x,y) = 0 \text{ em } \Omega \\&lt;br /&gt;
u(x, y) = f(x) \text{ em } \partial \Omega &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sendo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
f(x) =  &lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(0,y) = f_{1}(y); \\&lt;br /&gt;
f(L,y) = f_{2}(y); \\&lt;br /&gt;
f(x,0) = f_{3}(x); \\&lt;br /&gt;
f(x,L) = f_{4}(x). &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Separamos o problema geral de Dirchlet em 4 problemas &amp;quot;menores&amp;quot;, com condições de contorno diferentes de zero em apenas um trecho da fronteira, de modo que obtemos desde:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u_{1}(x,y) = 0 \text{ em } \Omega; \\&lt;br /&gt;
u_{1}(0,y) = f_{1}(y)  \text{ para }  y \in (0, L); \\&lt;br /&gt;
u_{1}(L,y) = u_{1}(x,0) = u_{1}(x,L) =0,&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
até: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u_{4}(x,y) = 0 \text{ em } \Omega; \\&lt;br /&gt;
u_{4}(x,L) = f_{4}(x)  \text{ para } x \in (0, L); \\&lt;br /&gt;
u_{4}(0,y) = u_{4}(L,y) = u_{4}(x,0) =0.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos então utilizar o Método da Separação de Variáveis para resolver os 4 problemas e, como a Equação de Laplace é linear, sua soma será a solução completa do Problema de Dirichlet. O método consiste em supor &amp;lt;math&amp;gt; u(x, y) = \phi(x)\theta(y)&amp;lt;/math&amp;gt;, para então, ao substituirmos na equação obtermos a seguinte expressão:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \Delta u_{i} = \ddot{\phi_{i}}(x)\theta_{i}(y) + \phi_{i}(x) \ddot{\theta_{i}}(y) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos isolar as funções &amp;lt;math&amp;gt;\phi_{i}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\theta_{i}&amp;lt;/math&amp;gt;, de fato ficamos com com duas relações que dependem ou apenas de &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; portanto para elas serem sempre iguais, é necessário que sejam constantes (&amp;lt;math&amp;gt; = \lambda&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{\ddot{\phi_{i}}}{\phi_{i}} = -\frac{\ddot{\theta_{i}}}{\theta_{i}} = \lambda &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos 2 EDOs de segunda ordem, que podem ser resolvidas pelo Método dos Coeficientes a Determinar. Como não é objetivo aqui realizar cálculos analíticos (especialmente &amp;quot;na mão&amp;quot;) apenas será resolvido o primeiro problema (&amp;lt;math&amp;gt;u_{1}(x, y)&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
As condições de contorno mostram que &amp;lt;math&amp;gt; \phi(L)\theta(y) = 0  \Rightarrow \phi(L) = 0 &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \phi(x)\theta(0) = 0 \Rightarrow \theta(0) = 0 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \phi(x)\theta(L) = 0 \Rightarrow \theta(L) = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo o problema, temos a parte de &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\ddot{\phi_{1}}(y) - \lambda \phi_{1} =0; \\&lt;br /&gt;
\phi_{1} (L) = 0; \\&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supondo uma solução da forma &amp;lt;math&amp;gt; \phi_{1}(x) = Ae^{sx}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \ddot{\phi_{1}} - \lambda \phi_{1} = s^{2}Ae^{sx} - \lambda Ae^{sx} = 0 \Longrightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; s = \pm \sqrt{\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, temos a solução de &amp;lt;math&amp;gt;\phi_{1}&amp;lt;/math&amp;gt; sendo &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \phi_{1}(x) = A_{1}e^{\sqrt{\lambda} x} + A_{2}e^{- \sqrt{\lambda} x} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Partindo para a segunda equação &amp;lt;math&amp;gt; \theta_{1}(y) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\ddot{\theta_{1}}(x) + \lambda \theta_{1} =0; \\&lt;br /&gt;
\theta_{1} (0) = 0 \\&lt;br /&gt;
\theta_{1} (L) = 0;&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
supondo solução do tipo &amp;lt;math&amp;gt; \theta_{1} (y) = Be^{i\omega y} &amp;lt;/math&amp;gt; temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \ddot{\theta_{1}} + \theta_{1} = -\omega^2 Be^{i\omega y} + \lambda Be^{i\omega y} = 0 \Longrightarrow &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \omega = \pm \sqrt{\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, temos solução &amp;lt;math&amp;gt; \theta_{1}(y) = B_{1}e^{i\sqrt{\lambda} y} + B_{2}e^{-i\sqrt{\lambda} y} &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Utilizando a primeira C.C. obtemos &amp;lt;math&amp;gt;B_{1} = - B_{2} = B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou seja, temos que &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\theta_{1}(y) = B sen(\sqrt{\lambda} y ). &amp;lt;/math&amp;gt; Utilizando a segunda C.C. temos &amp;lt;math&amp;gt; 0 = sen(\sqrt{\lambda} y)  \Rightarrow \lambda = \frac{n^2 \pi^2}{L^2}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou seja, existem infinitos &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;\theta_{1}&amp;lt;/math&amp;gt; é solução. &lt;br /&gt;
&lt;br /&gt;
Voltando a &amp;lt;math&amp;gt;\phi_{1}&amp;lt;/math&amp;gt;, temos &amp;lt;math&amp;gt; \phi_{1}(x) = senh(\frac{n\pi (L-x)}{L}). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente unindo as respostas, temos &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{1}(x, y) = \phi_{1}(x) \theta_{1}(y) = \sum C_{1n} \frac{senh(\frac{n \pi(L- x)}{L})}{senh(n\pi)}sen(\frac{n \pi y}{L})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;C_{1n} = \frac{2}{L}\int_{0}^{L} f_{1}(y) sen(\frac{n \pi y}{L}) dy&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para os outros problemas, temos soluções parecidas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{2}(x, y) = \phi_{2}(x) \theta_{2}(y) = \sum C_{2n} \frac{senh(\frac{n \pi x}{L})}{senh(n\pi)}sen(\frac{n \pi y}{L});&amp;lt;/math&amp;gt; sendo &amp;lt;math&amp;gt; C_{2n} = \frac{2}{L}\int_{0}^{L} f_{2}(x) sen(\frac{n \pi y}{L}) dy,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{3}(x, y) = \phi_{3}(x) \theta_{3}(y) = \sum C_{3n} \frac{senh(\frac{n \pi(L- y)}{L})}{senh(n\pi)}sen(\frac{n \pi x}{L});&amp;lt;/math&amp;gt; sendo &amp;lt;math&amp;gt;C_{3n} = \frac{2}{L}\int_{0}^{L} f_{3}(y) sen(\frac{n \pi x}{L}) dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{4}(x, y) = \phi_{4}(x) \theta_{4}(y) = \sum C_{4n} \frac{senh(\frac{n \pi y}{L})}{senh(n\pi)}sen(\frac{n \pi x}{L});&amp;lt;/math&amp;gt; sendo &amp;lt;math&amp;gt;C_{4n} = \frac{2}{L}\int_{0}^{L} f_{4}(x) sen(\frac{n \pi x}{L}) dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A solução completa do problema de Dirichlet no quadrado de Lado &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; é a soma das quatro soluções parciais: &amp;lt;math&amp;gt; u(x, y) = u_{1}(x, y) + u_{2}(x, y) + u_{3}(x, y) + u_{4}(x, y) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Método da Relaxação ===&lt;br /&gt;
&lt;br /&gt;
O Método da Relaxação é um método iterativo utilizado para obter a solução numérica para a equação de Laplace e Poisson. A ideia do método é de, utilizando a vizinhança iterar os pontos da malha até que convirjam para uma solução.&lt;br /&gt;
&lt;br /&gt;
Discretizando a equação temos &amp;lt;math&amp;gt;x\mapsto x_{i}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y\mapsto y_{j}&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j = 1, ..., N&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; h = \Delta x = \Delta y = N/L&amp;lt;/math&amp;gt; a função &amp;lt;math&amp;gt; g(x, y) = g_{ij}&amp;lt;/math&amp;gt;, nos deparamos com uma matriz &amp;lt;math&amp;gt;\mathcal{M}_{i j} = u(x_{i},y_{j}) = u_{i j}&amp;lt;/math&amp;gt; quadrada sendo as bordas &amp;lt;math&amp;gt;\mathcal{M}_{1 j} = f(0, y) = u_{1 j}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\mathcal{M}_{N j} = f(L, y) = u_{N j}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\mathcal{M}_{i 1} = f(x, 0) = u_{i 1}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\mathcal{M}_{i N} = f(x, L) = u_{i N}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Realizando-se a discretização, podemos tomar as derivadas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{\partial^2 u}{\partial x^2} = \frac{u_{(i+1) j} + u_{(i-1) j} -2u_{i j}}{h^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
e &lt;br /&gt;
&amp;lt;math&amp;gt; \frac{\partial^2 u}{\partial y^2} = \frac{u_{i (j+1)} + u_{i (j-1)} -2u_{i j}}{h^2} &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Substituindo na Equação, temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{u_{(i+1) j} + u_{(i-1) j} -2u_{i j}}{h^2}  + \frac{u_{i (j+1)} + u_{i (j-1)} -2u_{i j}}{h^2} = - g_{ij} &amp;lt;/math&amp;gt;, &lt;br /&gt;
ou seja:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j} = \frac{u_{(i-1) j} + u_{(i+1) j} + u_{i (j-1)} + u_{i (j+1)} + h^{2}g_{ij}}{4}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &lt;br /&gt;
ou mais geralmente (supondo &amp;lt;math&amp;gt;\Delta x \neq \Delta y&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j} = \frac{(\Delta y)^{2}(u_{(i-1) j} + u_{(i+1) j}) + (\Delta x)^2(u_{i (j-1)} + u_{i (j+1)}) + (\Delta y \Delta x)^2 g_{ij}}{2((\Delta x)^2 + (\Delta y)^2)}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
para &amp;lt;math&amp;gt; i, j = 2, ..., N+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condição de parada, foi convencionado tomar o erro relativo entre as iterações &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;, para estimar o erro, se optou por tomar como valores, o ponto médio da malha (já que é o ultimo ponto a ser alcançado nas iterações, portanto, quando sua variação diminuir é sinal de que a solução já está convergindo), para observarmos a evolução em relação a outros pontos que variam desde o inicio, foram utilizados as diagonais interiores, tal que o erro relativo é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \epsilon = \Big|\frac{v^{k} - v^{k+1}}{v^{k}}\Big|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fazendo a média ponderada com peso 4 para o ponto médio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^{k} = \frac{1}{8} (u_{2 2} + u_{2 (N+1)} + u_{(N+1) 2} + 4u_{\frac{(N+2)}{2}  \frac{(N+2)}{2}}+u_{(N+1) (N+1)}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Método da Super Relaxação (SOR) ===&lt;br /&gt;
&lt;br /&gt;
Podemos também realizar uma média entre os valores já calculados e os ainda não calculados na iteração, o método da Super Relaxação ou Sobrerrelaxação (SOR) é da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{ij}^{k+1} = u_{i j}^{k}(1 - \omega) + \omega u_{ij}^{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tal que &amp;lt;math&amp;gt; u_{ij}^{R} &amp;lt;/math&amp;gt; é o valor calculado através do método da Relaxação e &amp;lt;math&amp;gt; \omega \in [0:2]&amp;lt;/math&amp;gt; é o fator de relaxamento, se &amp;lt;math&amp;gt; \omega = 1 &amp;lt;/math&amp;gt; temos a Relaxação normal.&lt;br /&gt;
&lt;br /&gt;
=== Estabilidade ===&lt;br /&gt;
&lt;br /&gt;
==== Relaxação ====&lt;br /&gt;
[[Arquivo:erro2.png|thumb|400px| Erro relativo (método da Relaxação) em função da quantidade de iterações]]&lt;br /&gt;
&lt;br /&gt;
A relaxação é um método Iterativo sobre os pontos vizinhos que pode ser feita de 2 modos, pelo Algoritmo de Jacobi, e pelo de Gauss-Seidel. &lt;br /&gt;
&lt;br /&gt;
O algoritmo de Jacobi pega valores &amp;quot;antigos&amp;quot; para a iteração e possui convergencia muito lenta, por isso não é muito utilizado. Já o algoritmo de Gauss-Seidel pega os valores &amp;quot;novos&amp;quot; (que ja foram calculados na iteração) e os &amp;quot;antigos&amp;quot; (que não foram calculados na iteração &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;), possui convergência mais rapida, porém ainda é lenta. &lt;br /&gt;
&lt;br /&gt;
Como a média definida anteriormente foi feita utilizando o ponto médio do domínio, o erro cresce após decair, pois é quando efetivamente ocorrem variações maiores no ponto médio. &lt;br /&gt;
&lt;br /&gt;
Para a relaxação, o algoritmo de Jacobi faz o seguinte cálculo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j}^{k+1} = \frac{u_{(i-1) j}^{k} + u_{(i+1) j}^{k} + u_{i (j-1)}^{k} + u_{i (j+1)}^{k} + h^{2}g_{ij}}{4}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
já o algoritmo de Gauss-Seidel faz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j}^{k+1} = \frac{u_{(i-1) j}^{k+1} + u_{(i+1) j}^{k} + u_{i (j-1)}^{k+1} + u_{i (j+1)}^{k} + h^{2}g_{ij}}{4}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Algoritmos iterativos tendem a convergir para solução unica, se a matriz que as representa for Diagonal Dominante, ou seja:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |a_{ii}| \ge \sum_{j=1 (i\neq j)}^{N} |a_{ij}| &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sendo &amp;lt;math&amp;gt; a_{ii} = u_{ii} &amp;lt;/math&amp;gt; e  &amp;lt;math&amp;gt; a_{ij} = u_{ij} &amp;lt;/math&amp;gt;, então  &amp;lt;math&amp;gt; |u_{ii}| = 4 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; |u_{ij}| = 1 &amp;lt;/math&amp;gt; e &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  \sum_{j=1 (i\neq j)}^{N+2} |a_{ij}| = 4 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt; 4 = 4 &amp;lt;/math&amp;gt;, a desigualdade vale e o método converge. &lt;br /&gt;
&lt;br /&gt;
De fato, podemos ver que a equação de Laplace respeita tal desigualdade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Caso façamos um retangulo &amp;lt;math&amp;gt; L_{x} \neq L_{y} &amp;lt;/math&amp;gt; com &amp;lt;math&amp;gt; \Delta x \neq \Delta y &amp;lt;/math&amp;gt;, obtemos os erros da imagem a seguir, feito utilizando &amp;lt;math&amp;gt; L_{x} =1 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{y} = 5 &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; L_{x} =2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{y} = 4 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{x} =1.5 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{y} = 4.5 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:erro.png|frameless|400px|Erro obtido para diferentes comprimentos do retangulo]]&lt;br /&gt;
&lt;br /&gt;
==== Super Relaxação ====&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:errooverr.png|thumb|400px|Grafico mostra a quantidades de Iterações para convergência do exemplo 1 em função de omega]]&lt;br /&gt;
&lt;br /&gt;
Como o método depende de &amp;lt;math&amp;gt; \omega  &amp;lt;/math&amp;gt;, e se &amp;lt;math&amp;gt; \omega = 1 &amp;lt;/math&amp;gt; temos a Relaxação normal, então podemos já observar que a convergência será mais demorada se &amp;lt;math&amp;gt; \omega &amp;lt; 1 &amp;lt;/math&amp;gt;, já quando maior que 1, a solução sempre converge mais rápido até um &amp;lt;math&amp;gt; \omega_{otimo} &amp;lt;/math&amp;gt; após o valor ótimo o valor cresce até 2, valor que diverge para o SOR.&lt;br /&gt;
&lt;br /&gt;
Usaremos &amp;lt;math&amp;gt; \omega = \frac{2}{1+sen(\pi \Delta x)} &amp;lt;/math&amp;gt; que é o valor ótimo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemplos ===&lt;br /&gt;
&lt;br /&gt;
Foram realizados 5 exemplos, 2 sobre a equação de Laplace e 3 sobre a equação de Poisson.&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 1 ====&lt;br /&gt;
&lt;br /&gt;
O primeiro problema,que pode ser descrito como a temperatura &amp;lt;math&amp;gt; T = T(x, y)&amp;lt;/math&amp;gt; de uma chapa que está em equilíbrio térmico com um dos lados a temperatura &amp;lt;math&amp;gt;T(x, 0) = L&amp;lt;/math&amp;gt;, todos os outros lados iguais com temperatura 0 e sem geração. Para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;, tal problema é descrito pela seguinte expressão:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = 0  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = L  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = 0 \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = 0 \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = 0 \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A solução analítica para o problema é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u(x, y) = \frac{4L}{\pi}\sum_{n=0}^{\infty} \frac{sen(\frac{(2n+1) \pi x}{L})}{2n+1} \frac{senh\Big(\frac{(2n+1) \pi (L-y)}{L}\Big)}{ senh((2n+1)\pi)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foi possível obter o gráfico da função analítica aproximada com os 110 primeiros termos parciais e estimar o erro entre a solução numérica e a solução analítica, que foi alto devido ao truncamento da série que forma a solução analítica.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:solucaoanalitica1.png|450px|thumb|Solução analítica do Problema de Contorno 1]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:erroanalitico1.png|450px|thumb|Erro entre solução numérica e solução analítica em função do número de iterações]]&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel, no caso da relaxação foram necessárias 1471 iterações para a solução convergir, já SOR levou 1000.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:relaxacao1k1471.png|450px|Solução do Problema de Contorno através do Método de Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
[[Arquivo:sol1k1001.png|450px|Solução do Problema de Contorno através do Método de Super Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 2 ====&lt;br /&gt;
&lt;br /&gt;
O segundo problema é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = 0  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = Lsin(\frac{\pi x}{L})  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = Lcos(\frac{\pi x}{L}) \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = \frac{x^{2}}{L} \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = \frac{(L-x)^{2}}{L} \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as seguintes soluções mostradas nos gráficos, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:relaxacao2k2122.png|300px|Solução do Problema de Contorno através do Método de Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
[[Arquivo:relaxacao2k1001.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 3 ====&lt;br /&gt;
&lt;br /&gt;
O primeiro problema sobre a equação de Poisson , possui contornos fixos e uma gaussiana, pode ser considerado um problema de eletrostática com distribuição de carga &amp;lt;math&amp;gt; \frac{\rho}{\epsilon_{0}} = xy e^{-(x^2+ y^2)} &amp;lt;/math&amp;gt; . Tal problema é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = -g(x, y) = -xye^{-(x^2 + y^2)}  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = 0  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = 0 \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = 0 \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = 0 \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:poisson0.png|300px|Solução do Problema de Contorno através do Método de Relaxação]]&lt;br /&gt;
[[Arquivo:overrP0.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 4 ====&lt;br /&gt;
&lt;br /&gt;
O segundo problema sobre a equação de Poisson, que é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = -g(x, y) = -xye^{-(x^2 + y^2)}  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = 0  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = L \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = 0 \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = 0 \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:poisson1r.png|300px|Solução do Problema de Contorno através do Método de Relaxação]]&lt;br /&gt;
[[Arquivo:poisson1sor.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 5 ====&lt;br /&gt;
&lt;br /&gt;
O segundo problema sobre a equação de Poisson, que é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = -g(x, y) = -xye^{-(x^2 + y^2)}  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = Lsin(\frac{\pi x}{L})  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = Lcos(\frac{\pi x}{L}) \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = \frac{x^{2}}{L} \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = \frac{(L-x)^{2}}{L} \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:poisson2r.png|300px|Solução do Problema de Contorno através do Método de Relaxação]]&lt;br /&gt;
[[Arquivo:poisson2sor.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação]]&lt;br /&gt;
&lt;br /&gt;
O programa utilizado para gerar as soluçoes e erros foi o seguir (ou com pequenas alteraçoes):&lt;br /&gt;
&lt;br /&gt;
==== Programa ====&lt;br /&gt;
Trechos do programa realizado para os exemplos acima.&lt;br /&gt;
&lt;br /&gt;
Programa para o método de Relaxação (Equação de Laplace):&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;
 #define N 1000&lt;br /&gt;
 #define M 70&lt;br /&gt;
 #define P 1&lt;br /&gt;
 #define PI 3.141529&lt;br /&gt;
 void gaussseidelL(){  &lt;br /&gt;
  double u[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0;&lt;br /&gt;
  double L=5., parada=0, erro=0.00001, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
  dx = L/(M+1);&lt;br /&gt;
  dy = L/(M+1);&lt;br /&gt;
  for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
    for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
      u[i][j] = 1.;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /* Primeira Solução, GaussSeidel1  */&lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = L;&lt;br /&gt;
    u[M+1][i] = 0.0;&lt;br /&gt;
    u[i][0] = 0.0;&lt;br /&gt;
    u[i][M+1] = 0.0;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  /* Segunda Solução, GaussSeidel2&lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
    u[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
    u[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
    u[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  */&lt;br /&gt;
  do{&lt;br /&gt;
    up = (u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3;&lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	u[i][j] = (u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1])/4;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    k++;&lt;br /&gt;
    parada = fabs((up-(u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3)/up);&lt;br /&gt;
    if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N/5){&lt;br /&gt;
      a = 1;&lt;br /&gt;
    }else{&lt;br /&gt;
      a = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }while(a == 0);&lt;br /&gt;
  for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
    for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
      printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, u[i][j]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
  return;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segundo trecho para método de Relaxação, Equação de Poisson&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;
#define N 1000&lt;br /&gt;
#define M 70&lt;br /&gt;
#define P 1&lt;br /&gt;
#define PI 3.141529&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void gaussseidelP(){&lt;br /&gt;
  &lt;br /&gt;
  double u[M+2][M+2], F[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0;&lt;br /&gt;
  double L=5., parada=0, erro=0.00001, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
&lt;br /&gt;
  dx = L/(M+1);&lt;br /&gt;
  dy = L/(M+1);&lt;br /&gt;
  &lt;br /&gt;
  for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
    for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
      u[i][j] = 0.;&lt;br /&gt;
      F[i][j] = i*dx*j*dy*exp(-(pow(i*dx,2) + pow(j*dy,2))/L);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 /* Solução Zero, Poisson0  */&lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = 0;&lt;br /&gt;
    u[M+1][i] = 0.0;&lt;br /&gt;
    u[i][0] = 0.0;&lt;br /&gt;
    u[i][M+1] = 0.0;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = 0;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  /* Primeira Solução, PoissonGS1 &lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = L;&lt;br /&gt;
    u[M+1][i] = 0.0;&lt;br /&gt;
    u[i][0] = 0.0;&lt;br /&gt;
    u[i][M+1] = 0.0;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  /* Segunda Solução, PoissonGS2 &lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
  u[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
  u[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
  u[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
  u[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  do{    &lt;br /&gt;
    up = (u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3;&lt;br /&gt;
    &lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	u[i][j] = (u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1] + 4*dx*dx*F[i][j])/4;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    k++;&lt;br /&gt;
    parada = fabs((up-(u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3)/up);&lt;br /&gt;
    if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N/5){&lt;br /&gt;
      a = 1;&lt;br /&gt;
    }else{&lt;br /&gt;
      a = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }while(a == 0);&lt;br /&gt;
&lt;br /&gt;
  for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
    for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
      printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, u[i][j]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trecho de programa que utiliza o método de Super Relaxação para Equação de Laplace:&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;
#define N 1000&lt;br /&gt;
#define M 70&lt;br /&gt;
#define P 1&lt;br /&gt;
#define PI 3.141529&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void overrelaxationL(){&lt;br /&gt;
  &lt;br /&gt;
  double u[M+2][M+2], un[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0, omega=1.;&lt;br /&gt;
  double L=5., parada=0, erro=0.00005, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
  &lt;br /&gt;
  omega = 2/(1+PI*dx);&lt;br /&gt;
&lt;br /&gt;
    k = 0;&lt;br /&gt;
    &lt;br /&gt;
    dx = L/(M+1);&lt;br /&gt;
    dy = L/(M+1);&lt;br /&gt;
    &lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	un[i][j] = 1.;&lt;br /&gt;
	u[i][j] = un[i][j];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    /*&lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = 0.0;&lt;br /&gt;
      un[M+1][i] = L;&lt;br /&gt;
      un[i][0] = 0.0;&lt;br /&gt;
      un[i][M+1] = 0.0;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = 0.0;&lt;br /&gt;
    un[M+1][M+1] = L;&lt;br /&gt;
    */&lt;br /&gt;
    &lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
      un[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
      un[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
      un[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = L;&lt;br /&gt;
    un[M+1][M+1] = 0.0;   &lt;br /&gt;
    &lt;br /&gt;
    do{&lt;br /&gt;
      &lt;br /&gt;
      up = (un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8;&lt;br /&gt;
      &lt;br /&gt;
      for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
	for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	  un[i][j] = (un[i+1][j] + un[i-1][j] + un[i][j+1] + un[i][j-1])/4;&lt;br /&gt;
	  u[i][j] = u[i][j]*(1 - omega) + omega*un[i][j];&lt;br /&gt;
	  un[i][j] = u[i][j];&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      k++;&lt;br /&gt;
      parada = fabs((up-(un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8)/up);&lt;br /&gt;
      if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N){&lt;br /&gt;
	a = 1;&lt;br /&gt;
      }else{&lt;br /&gt;
	a = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }while(a == 0);&lt;br /&gt;
    &lt;br /&gt;
    for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
      for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
	printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, un[i][j]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trecho de programa do algoritmo de Super Relaxação para Equação de Poisson:&lt;br /&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;
#define N 1000&lt;br /&gt;
#define M 70&lt;br /&gt;
#define P 1&lt;br /&gt;
#define PI 3.141529&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void overrelaxationP(){&lt;br /&gt;
  &lt;br /&gt;
  double u[M+2][M+2], un[M+2][M+2], F[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0, omega=1.;&lt;br /&gt;
  double L=5., parada=0, erro=0.00005, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
  &lt;br /&gt;
  omega = 2/(1+PI*dx);&lt;br /&gt;
&lt;br /&gt;
    k = 0;&lt;br /&gt;
    &lt;br /&gt;
    dx = L/(M+1);&lt;br /&gt;
    dy = L/(M+1);&lt;br /&gt;
    &lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	un[i][j] = 1.;&lt;br /&gt;
	u[i][j] = un[i][j];&lt;br /&gt;
	F[i][j] = i*dx*j*dy*exp(-(pow(i*dx,2) + pow(j*dy,2))/L);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = 0.0;&lt;br /&gt;
      un[M+1][i] = 0.0;&lt;br /&gt;
      un[i][0] = 0.0;&lt;br /&gt;
      un[i][M+1] = 0.0;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = 0.0;&lt;br /&gt;
    un[M+1][M+1] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
      un[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
      un[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
      un[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = L;&lt;br /&gt;
    un[M+1][M+1] = 0.0;   &lt;br /&gt;
    */&lt;br /&gt;
    &lt;br /&gt;
    do{&lt;br /&gt;
      &lt;br /&gt;
      up = (un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8;&lt;br /&gt;
      &lt;br /&gt;
      for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
	for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	  un[i][j] = (un[i+1][j] + un[i-1][j] + un[i][j+1] + un[i][j-1] + 4*dx*dx*F[i][j])/4;&lt;br /&gt;
	  u[i][j] = u[i][j]*(1 - omega) + omega*un[i][j];&lt;br /&gt;
	  un[i][j] = u[i][j];&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      k++;&lt;br /&gt;
      parada = fabs((up-(un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8)/up);&lt;br /&gt;
      if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N){&lt;br /&gt;
	a = 1;&lt;br /&gt;
      }else{&lt;br /&gt;
	a = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }while(a == 0);&lt;br /&gt;
    &lt;br /&gt;
    for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
      for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
	printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, un[i][j]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
#[[http://www.mat.ufmg.br/~rodney/notas_de_aula/metodos_numericos_EDPs_elipticas.pdf]] Biezuner, Rodney Josué,&#039;&#039;Notas de Aula Métodos Numéricos para Equações Diferenciais Parciais Elípticas&#039;&#039; (UFMG, 2007)&lt;br /&gt;
#[[http://www.mat.ufmg.br/~rodney/notas_de_aula/iedp.pdf]] Biezuner, Rodney Josué,&#039;&#039;Introdução às Equações Diferenciais Parciais&#039;&#039; (UFMG, 2007)&lt;br /&gt;
#Jianping Zhu, &#039;&#039;Solving Partial Differential Equations on Parallel Computers&#039;&#039; (World Scientific, 1994)&lt;br /&gt;
&lt;br /&gt;
Grupo: Pedro Barbisan Widniczck&lt;/div&gt;</summary>
		<author><name>Pedrow7</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Grupo1_-_Dif_em_2D&amp;diff=1012</id>
		<title>Grupo1 - Dif em 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Grupo1_-_Dif_em_2D&amp;diff=1012"/>
		<updated>2017-10-31T01:22:10Z</updated>

		<summary type="html">&lt;p&gt;Pedrow7: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A equação de Poisson:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta u = \frac{\partial ^{2} u }{\partial x^2} + \frac{\partial ^{2} u }{\partial y^2} = -g(x,y)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
é uma equação do tipo Elíptica que representa fenômenos físicos estácionarios relacionados a Eletrostatica, Dinâmica de Fluídos e Transferência de Calor. Se &amp;lt;math&amp;gt; g(x,y) \equiv 0 &amp;lt;/math&amp;gt; a equação passa a ser chamada de Equação de Laplace. Os problemas relacionados a equação de Laplace são estudados pela &amp;quot;Teoria do Potencial&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
As soluções &amp;lt;math&amp;gt; u = u(x,y) &amp;lt;/math&amp;gt; da Equação de Laplace são denominadas funções Harmônicas. Os problemas mais habituais na vida de um físico, engenheiro ou matemático ao se depararem com uma EDP,  são os problemas com Condições de Contorno em um dominío &amp;lt;math&amp;gt; \Omega \in \mathbb{R}^2&amp;lt;/math&amp;gt;, essencialmente será trabalhada a Condição de Dirichlet, que possui fronteiras (&amp;lt;math&amp;gt; \partial \Omega &amp;lt;/math&amp;gt;) conhecidas, tendo o seguinte formato:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
	\Delta u =  0 &amp;amp; \text{para } (x,y) \in \Omega, \\&lt;br /&gt;
	u = f(x,y)  &amp;amp; \text{para } (x,y) \in \partial \Omega. &lt;br /&gt;
\end{cases}  &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A equação de Poisson possui forma parecida para o Problema de Dirichlet, que fica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}&lt;br /&gt;
	\Delta u =  - g(x) &amp;amp; \text{para } (x,y) \in \Omega, \\&lt;br /&gt;
	u = f(x,y)  &amp;amp; \text{para } (x,y) \in \partial \Omega. &lt;br /&gt;
\end{cases}  &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para tais problemas, estudaremos os métodos de Relaxação e Super-Relaxação para encontrar as soluções da Equação de Laplace na região de Quadrado de Lado &amp;lt;math&amp;gt;L &amp;lt;/math&amp;gt;  &amp;lt;math&amp;gt; ( \{ \Omega = (0,L)\times (0,L) \} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
== Dominio Quadrado de Lado &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== Solução Analítica da Equação de Laplace  ===&lt;br /&gt;
&lt;br /&gt;
Seja o problema em &amp;lt;math&amp;gt;\Omega = (0, L) \times (0, L)&amp;lt;/math&amp;gt;, temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u(x,y) = 0 \text{ em } \Omega \\&lt;br /&gt;
u(x, y) = f(x) \text{ em } \partial \Omega &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sendo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
f(x) =  &lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(0,y) = f_{1}(y); \\&lt;br /&gt;
f(L,y) = f_{2}(y); \\&lt;br /&gt;
f(x,0) = f_{3}(x); \\&lt;br /&gt;
f(x,L) = f_{4}(x). &lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Separamos o problema geral de Dirchlet em 4 problemas &amp;quot;menores&amp;quot;, com condições de contorno diferentes de zero em apenas um trecho da fronteira, de modo que obtemos desde:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u_{1}(x,y) = 0 \text{ em } \Omega; \\&lt;br /&gt;
u_{1}(0,y) = f_{1}(y)  \text{ para }  y \in (0, L); \\&lt;br /&gt;
u_{1}(L,y) = u_{1}(x,0) = u_{1}(x,L) =0,&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
até: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u_{4}(x,y) = 0 \text{ em } \Omega; \\&lt;br /&gt;
u_{4}(x,L) = f_{4}(x)  \text{ para } x \in (0, L); \\&lt;br /&gt;
u_{4}(0,y) = u_{4}(L,y) = u_{4}(x,0) =0.&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podemos então utilizar o Método da Separação de Variáveis para resolver os 4 problemas e, como a Equação de Laplace é linear, sua soma será a solução completa do Problema de Dirichlet. O método consiste em supor &amp;lt;math&amp;gt; u(x, y) = \phi(x)\theta(y)&amp;lt;/math&amp;gt;, para então, ao substituirmos na equação obtermos a seguinte expressão:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \Delta u_{i} = \ddot{\phi_{i}}(x)\theta_{i}(y) + \phi_{i}(x) \ddot{\theta_{i}}(y) = 0 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos isolar as funções &amp;lt;math&amp;gt;\phi_{i}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\theta_{i}&amp;lt;/math&amp;gt;, de fato ficamos com com duas relações que dependem ou apenas de &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; portanto para elas serem sempre iguais, é necessário que sejam constantes (&amp;lt;math&amp;gt; = \lambda&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{\ddot{\phi_{i}}}{\phi_{i}} = -\frac{\ddot{\theta_{i}}}{\theta_{i}} = \lambda &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim obtemos 2 EDOs de segunda ordem, que podem ser resolvidas pelo Método dos Coeficientes a Determinar. Como não é objetivo aqui realizar cálculos analíticos (especialmente &amp;quot;na mão&amp;quot;) apenas será resolvido o primeiro problema (&amp;lt;math&amp;gt;u_{1}(x, y)&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
As condições de contorno mostram que &amp;lt;math&amp;gt; \phi(L)\theta(y) = 0  \Rightarrow \phi(L) = 0 &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \phi(x)\theta(0) = 0 \Rightarrow \theta(0) = 0 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \phi(x)\theta(L) = 0 \Rightarrow \theta(L) = 0 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dividindo o problema, temos a parte de &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\ddot{\phi_{1}}(y) - \lambda \phi_{1} =0; \\&lt;br /&gt;
\phi_{1} (L) = 0; \\&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supondo uma solução da forma &amp;lt;math&amp;gt; \phi_{1}(x) = Ae^{sx}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \ddot{\phi_{1}} - \lambda \phi_{1} = s^{2}Ae^{sx} - \lambda Ae^{sx} = 0 \Longrightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; s = \pm \sqrt{\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, temos a solução de &amp;lt;math&amp;gt;\phi_{1}&amp;lt;/math&amp;gt; sendo &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \phi_{1}(x) = A_{1}e^{\sqrt{\lambda} x} + A_{2}e^{- \sqrt{\lambda} x} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Partindo para a segunda equação &amp;lt;math&amp;gt; \theta_{1}(y) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\ddot{\theta_{1}}(x) + \lambda \theta_{1} =0; \\&lt;br /&gt;
\theta_{1} (0) = 0 \\&lt;br /&gt;
\theta_{1} (L) = 0;&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
supondo solução do tipo &amp;lt;math&amp;gt; \theta_{1} (y) = Be^{i\omega y} &amp;lt;/math&amp;gt; temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \ddot{\theta_{1}} + \theta_{1} = -\omega^2 Be^{i\omega y} + \lambda Be^{i\omega y} = 0 \Longrightarrow &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; \omega = \pm \sqrt{\lambda} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou seja, temos solução &amp;lt;math&amp;gt; \theta_{1}(y) = B_{1}e^{i\sqrt{\lambda} y} + B_{2}e^{-i\sqrt{\lambda} y} &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Utilizando a primeira C.C. obtemos &amp;lt;math&amp;gt;B_{1} = - B_{2} = B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou seja, temos que &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\theta_{1}(y) = B sen(\sqrt{\lambda} y ). &amp;lt;/math&amp;gt; Utilizando a segunda C.C. temos &amp;lt;math&amp;gt; 0 = sen(\sqrt{\lambda} y)  \Rightarrow \lambda = \frac{n^2 \pi^2}{L^2}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou seja, existem infinitos &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;\theta_{1}&amp;lt;/math&amp;gt; é solução. &lt;br /&gt;
&lt;br /&gt;
Voltando a &amp;lt;math&amp;gt;\phi_{1}&amp;lt;/math&amp;gt;, temos &amp;lt;math&amp;gt; \phi_{1}(x) = senh(\frac{n\pi (L-x)}{L}). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente unindo as respostas, temos &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{1}(x, y) = \phi_{1}(x) \theta_{1}(y) = \sum C_{1n} \frac{senh(\frac{n \pi(L- x)}{L})}{senh(n\pi)}sen(\frac{n \pi y}{L})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sendo &amp;lt;math&amp;gt;C_{1n} = \frac{2}{L}\int_{0}^{L} f_{1}(y) sen(\frac{n \pi y}{L}) dy&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para os outros problemas, temos soluções parecidas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{2}(x, y) = \phi_{2}(x) \theta_{2}(y) = \sum C_{2n} \frac{senh(\frac{n \pi x}{L})}{senh(n\pi)}sen(\frac{n \pi y}{L});&amp;lt;/math&amp;gt; sendo &amp;lt;math&amp;gt; C_{2n} = \frac{2}{L}\int_{0}^{L} f_{2}(x) sen(\frac{n \pi y}{L}) dy,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{3}(x, y) = \phi_{3}(x) \theta_{3}(y) = \sum C_{3n} \frac{senh(\frac{n \pi(L- y)}{L})}{senh(n\pi)}sen(\frac{n \pi x}{L});&amp;lt;/math&amp;gt; sendo &amp;lt;math&amp;gt;C_{3n} = \frac{2}{L}\int_{0}^{L} f_{3}(y) sen(\frac{n \pi x}{L}) dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{4}(x, y) = \phi_{4}(x) \theta_{4}(y) = \sum C_{4n} \frac{senh(\frac{n \pi y}{L})}{senh(n\pi)}sen(\frac{n \pi x}{L});&amp;lt;/math&amp;gt; sendo &amp;lt;math&amp;gt;C_{4n} = \frac{2}{L}\int_{0}^{L} f_{4}(x) sen(\frac{n \pi x}{L}) dx.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A solução completa do problema de Dirichlet no quadrado de Lado &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; é a soma das quatro soluções parciais: &amp;lt;math&amp;gt; u(x, y) = u_{1}(x, y) + u_{2}(x, y) + u_{3}(x, y) + u_{4}(x, y) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Método da Relaxação ===&lt;br /&gt;
&lt;br /&gt;
O Método da Relaxação é um método iterativo utilizado para obter a solução numérica para a equação de Laplace e Poisson. A ideia do método é de, utilizando a vizinhança iterar os pontos da malha até que convirjam para uma solução.&lt;br /&gt;
&lt;br /&gt;
Discretizando a equação temos &amp;lt;math&amp;gt;x\mapsto x_{i}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y\mapsto y_{j}&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j = 1, ..., N&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; h = \Delta x = \Delta y = N/L&amp;lt;/math&amp;gt; a função &amp;lt;math&amp;gt; g(x, y) = g_{ij}&amp;lt;/math&amp;gt;, nos deparamos com uma matriz &amp;lt;math&amp;gt;\mathcal{M}_{i j} = u(x_{i},y_{j}) = u_{i j}&amp;lt;/math&amp;gt; quadrada sendo as bordas &amp;lt;math&amp;gt;\mathcal{M}_{1 j} = f(0, y) = u_{1 j}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\mathcal{M}_{N j} = f(L, y) = u_{N j}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\mathcal{M}_{i 1} = f(x, 0) = u_{i 1}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\mathcal{M}_{i N} = f(x, L) = u_{i N}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Realizando-se a discretização, podemos tomar as derivadas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{\partial^2 u}{\partial x^2} = \frac{u_{(i+1) j} + u_{(i-1) j} -2u_{i j}}{h^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
e &lt;br /&gt;
&amp;lt;math&amp;gt; \frac{\partial^2 u}{\partial y^2} = \frac{u_{i (j+1)} + u_{i (j-1)} -2u_{i j}}{h^2} &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Substituindo na Equação, temos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{u_{(i+1) j} + u_{(i-1) j} -2u_{i j}}{h^2}  + \frac{u_{i (j+1)} + u_{i (j-1)} -2u_{i j}}{h^2} = - g_{ij} &amp;lt;/math&amp;gt;, &lt;br /&gt;
ou seja:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j} = \frac{u_{(i-1) j} + u_{(i+1) j} + u_{i (j-1)} + u_{i (j+1)} + h^{2}g_{ij}}{4}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &lt;br /&gt;
ou mais geralmente (supondo &amp;lt;math&amp;gt;\Delta x \neq \Delta y&amp;lt;/math&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j} = \frac{(\Delta y)^{2}(u_{(i-1) j} + u_{(i+1) j}) + (\Delta x)^2(u_{i (j-1)} + u_{i (j+1)}) + (\Delta y \Delta x)^2 g_{ij}}{2((\Delta x)^2 + (\Delta y)^2)}, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
para &amp;lt;math&amp;gt; i, j = 2, ..., N+1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condição de parada, foi convencionado tomar o erro relativo entre as iterações &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;, para estimar o erro, se optou por tomar como valores, o ponto médio da malha (já que é o ultimo ponto a ser alcançado nas iterações, portanto, quando sua variação diminuir é sinal de que a solução já está convergindo), para observarmos a evolução em relação a outros pontos que variam desde o inicio, foram utilizados as diagonais interiores, tal que o erro relativo é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \epsilon = \Big|\frac{v^{k} - v^{k+1}}{v^{k}}\Big|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fazendo a média ponderada com peso 4 para o ponto médio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; v^{k} = \frac{1}{8} (u_{2 2} + u_{2 (N+1)} + u_{(N+1) 2} + 4u_{\frac{(N+2)}{2}  \frac{(N+2)}{2}}+u_{(N+1) (N+1)}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Método da Super Relaxação ===&lt;br /&gt;
&lt;br /&gt;
Podemos também realizar uma média entre os valores já calculados e os ainda não calculados na iteração, o método da Super Relaxação ou Sobrerrelaxação (SOR) é da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{ij}^{k+1} = u_{i j}^{k}(1 - \omega) + \omega u_{ij}^{R} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tal que &amp;lt;math&amp;gt; u_{ij}^{R} &amp;lt;/math&amp;gt; é o valor calculado através do método da Relaxação e &amp;lt;math&amp;gt; \omega \in [0:2]&amp;lt;/math&amp;gt; é o fator de relaxamento, se &amp;lt;math&amp;gt; \omega = 1 &amp;lt;/math&amp;gt; temos a Relaxação normal.&lt;br /&gt;
&lt;br /&gt;
=== Estabilidade ===&lt;br /&gt;
&lt;br /&gt;
==== Relaxação ====&lt;br /&gt;
[[Arquivo:erro2.png|thumb|400px| Erro relativo (método da Relaxação) em função da quantidade de iterações]]&lt;br /&gt;
&lt;br /&gt;
A relaxação é um método Iterativo sobre os pontos vizinhos que pode ser feita de 2 modos, pelo Algoritmo de Jacobi, e pelo de Gauss-Seidel. &lt;br /&gt;
&lt;br /&gt;
O algoritmo de Jacobi pega valores &amp;quot;antigos&amp;quot; para a iteração e possui convergencia muito lenta, por isso não é muito utilizado. Já o algoritmo de Gauss-Seidel pega os valores &amp;quot;novos&amp;quot; (que ja foram calculados na iteração) e os &amp;quot;antigos&amp;quot; (que não foram calculados na iteração &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;), possui convergência mais rapida, porém ainda é lenta. &lt;br /&gt;
&lt;br /&gt;
Como a média definida anteriormente foi feita utilizando o ponto médio do domínio, o erro cresce após decair, pois é quando efetivamente ocorrem variações maiores no ponto médio. &lt;br /&gt;
&lt;br /&gt;
Para a relaxação, o algoritmo de Jacobi faz o seguinte cálculo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j}^{k+1} = \frac{u_{(i-1) j}^{k} + u_{(i+1) j}^{k} + u_{i (j-1)}^{k} + u_{i (j+1)}^{k} + h^{2}g_{ij}}{4}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
já o algoritmo de Gauss-Seidel faz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u_{i j}^{k+1} = \frac{u_{(i-1) j}^{k+1} + u_{(i+1) j}^{k} + u_{i (j-1)}^{k+1} + u_{i (j+1)}^{k} + h^{2}g_{ij}}{4}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Algoritmos iterativos tendem a convergir para solução unica, se a matriz que as representa for Diagonal Dominante, ou seja:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |a_{ii}| \ge \sum_{j=1 (i\neq j)}^{N} |a_{ij}| &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sendo &amp;lt;math&amp;gt; a_{ii} = u_{ii} &amp;lt;/math&amp;gt; e  &amp;lt;math&amp;gt; a_{ij} = u_{ij} &amp;lt;/math&amp;gt;, então  &amp;lt;math&amp;gt; |u_{ii}| = 4 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; |u_{ij}| = 1 &amp;lt;/math&amp;gt; e &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;  \sum_{j=1 (i\neq j)}^{N+2} |a_{ij}| = 4 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como &amp;lt;math&amp;gt; 4 = 4 &amp;lt;/math&amp;gt;, a desigualdade vale e o método converge. &lt;br /&gt;
&lt;br /&gt;
De fato, podemos ver que a equação de Laplace respeita tal desigualdade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Caso façamos um retangulo &amp;lt;math&amp;gt; L_{x} \neq L_{y} &amp;lt;/math&amp;gt; com &amp;lt;math&amp;gt; \Delta x \neq \Delta y &amp;lt;/math&amp;gt;, obtemos os erros da imagem a seguir, feito utilizando &amp;lt;math&amp;gt; L_{x} =1 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{y} = 5 &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; L_{x} =2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{y} = 4 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{x} =1.5 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; L_{y} = 4.5 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:erro.png|frameless|400px|Erro obtido para diferentes comprimentos do retangulo]]&lt;br /&gt;
&lt;br /&gt;
==== Super Relaxação ====&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:errooverr.png|thumb|400px|Grafico mostra a quantidades de Iterações para convergência do exemplo 1 em função de omega]]&lt;br /&gt;
&lt;br /&gt;
Como o método depende de &amp;lt;math&amp;gt; \omega  &amp;lt;/math&amp;gt;, e se &amp;lt;math&amp;gt; \omega = 1 &amp;lt;/math&amp;gt; temos a Relaxação normal, então podemos já observar que a convergência será mais demorada se &amp;lt;math&amp;gt; \omega &amp;lt; 1 &amp;lt;/math&amp;gt;, já quando maior que 1, a solução sempre converge mais rápido até um &amp;lt;math&amp;gt; \omega_{otimo} &amp;lt;/math&amp;gt; após o valor ótimo o valor cresce até 2, valor que diverge para o SOR.&lt;br /&gt;
&lt;br /&gt;
Usaremos &amp;lt;math&amp;gt; \omega = \frac{2}{1+sen(\pi \Delta x)} &amp;lt;/math&amp;gt; que é o valor ótimo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exemplos ===&lt;br /&gt;
&lt;br /&gt;
Foram realizados 5 exemplos, 2 sobre a equação de Laplace e 3 sobre a equação de Poisson.&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 1 ====&lt;br /&gt;
&lt;br /&gt;
O primeiro problema,que pode ser descrito como a temperatura &amp;lt;math&amp;gt; T = T(x, y)&amp;lt;/math&amp;gt; de uma chapa que está em equilíbrio térmico com um dos lados a temperatura &amp;lt;math&amp;gt;T(x, 0) = L&amp;lt;/math&amp;gt;, todos os outros lados iguais com temperatura 0 e sem geração. Para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;, tal problema é descrito pela seguinte expressão:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = 0  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = L  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = 0 \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = 0 \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = 0 \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A solução analítica para o problema é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; u(x, y) = \frac{4L}{\pi}\sum_{n=0}^{\infty} \frac{sen(\frac{(2n+1) \pi x}{L})}{2n+1} \frac{senh\Big(\frac{(2n+1) \pi (L-y)}{L}\Big)}{ senh((2n+1)\pi)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foi possível obter o gráfico da função analítica aproximada com os 110 primeiros termos parciais e estimar o erro entre a solução numérica e a solução analítica, que foi alto devido ao truncamento da série que forma a solução analítica.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:solucaoanalitica1.png|450px|thumb|Solução analítica do Problema de Contorno 1]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:erroanalitico1.png|450px|thumb|Erro entre solução numérica e solução analítica em função do número de iterações]]&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel, no caso da relaxação foram necessárias 1471 iterações para a solução convergir, já SOR levou 1000.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:relaxacao1k1471.png|450px|Solução do Problema de Contorno através do Método de Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
[[Arquivo:sol1k1001.png|450px|Solução do Problema de Contorno através do Método de Super Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 2 ====&lt;br /&gt;
&lt;br /&gt;
O segundo problema é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = 0  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = Lsin(\frac{\pi x}{L})  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = Lcos(\frac{\pi x}{L}) \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = \frac{x^{2}}{L} \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = \frac{(L-x)^{2}}{L} \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as seguintes soluções mostradas nos gráficos, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:relaxacao2k2122.png|300px|Solução do Problema de Contorno através do Método de Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
[[Arquivo:relaxacao2k1001.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação (utilizando o algoritmo de Gauss-Seidel)]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 3 ====&lt;br /&gt;
&lt;br /&gt;
O primeiro problema sobre a equação de Poisson , possui contornos fixos e uma gaussiana, pode ser considerado um problema de eletrostática com distribuição de carga &amp;lt;math&amp;gt; \frac{\rho}{\epsilon_{0}} = xy e^{-(x^2+ y^2)} &amp;lt;/math&amp;gt; . Tal problema é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = -g(x, y) = -xye^{-(x^2 + y^2)}  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = 0  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = 0 \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = 0 \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = 0 \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:poisson0.png|300px|Solução do Problema de Contorno através do Método de Relaxação]]&lt;br /&gt;
[[Arquivo:overrP0.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 4 ====&lt;br /&gt;
&lt;br /&gt;
O segundo problema sobre a equação de Poisson, que é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = -g(x, y) = -xye^{-(x^2 + y^2)}  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = 0  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = L \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = 0 \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = 0 \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:poisson1r.png|300px|Solução do Problema de Contorno através do Método de Relaxação]]&lt;br /&gt;
[[Arquivo:poisson1sor.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação]]&lt;br /&gt;
&lt;br /&gt;
==== Exemplo 5 ====&lt;br /&gt;
&lt;br /&gt;
O segundo problema sobre a equação de Poisson, que é descrito pela seguinte expressão, para o domínio &amp;lt;math&amp;gt; \Omega = (0;L) \times (0;L) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\Delta u = -g(x, y) = -xye^{-(x^2 + y^2)}  \forall x,y \in \Omega \\ &lt;br /&gt;
u(x,0) = Lsin(\frac{\pi x}{L})  \big( \forall x \in [0;L] \big)  \\ &lt;br /&gt;
u(x, L) = Lcos(\frac{\pi x}{L}) \big( \forall x \in [0;L] \big) \\&lt;br /&gt;
u(0, y) = \frac{x^{2}}{L} \big( \forall y \in [0;L] \big) \\&lt;br /&gt;
u(L, y) = \frac{(L-x)^{2}}{L} \big( \forall y \in [0;L] \big) .&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foram obtidas as soluções mostradas nos gráficos a seguir, através do algoritmo de Gauss-Seidel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:poisson2r.png|300px|Solução do Problema de Contorno através do Método de Relaxação]]&lt;br /&gt;
[[Arquivo:poisson2sor.png|300px|Solução do Problema de Contorno através do Método de Super Relaxação]]&lt;br /&gt;
&lt;br /&gt;
O programa utilizado para gerar as soluçoes e erros foi o seguir (ou com pequenas alteraçoes):&lt;br /&gt;
&lt;br /&gt;
==== Programa ====&lt;br /&gt;
Trechos do programa realizado para os exemplos acima.&lt;br /&gt;
&lt;br /&gt;
Programa para o método de Relaxação (Equação de Laplace):&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;
 #define N 1000&lt;br /&gt;
 #define M 70&lt;br /&gt;
 #define P 1&lt;br /&gt;
 #define PI 3.141529&lt;br /&gt;
 void gaussseidelL(){  &lt;br /&gt;
  double u[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0;&lt;br /&gt;
  double L=5., parada=0, erro=0.00001, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
  dx = L/(M+1);&lt;br /&gt;
  dy = L/(M+1);&lt;br /&gt;
  for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
    for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
      u[i][j] = 1.;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  /* Primeira Solução, GaussSeidel1  */&lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = L;&lt;br /&gt;
    u[M+1][i] = 0.0;&lt;br /&gt;
    u[i][0] = 0.0;&lt;br /&gt;
    u[i][M+1] = 0.0;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  /* Segunda Solução, GaussSeidel2&lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
    u[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
    u[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
    u[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  */&lt;br /&gt;
  do{&lt;br /&gt;
    up = (u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3;&lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	u[i][j] = (u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1])/4;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    k++;&lt;br /&gt;
    parada = fabs((up-(u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3)/up);&lt;br /&gt;
    if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N/5){&lt;br /&gt;
      a = 1;&lt;br /&gt;
    }else{&lt;br /&gt;
      a = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }while(a == 0);&lt;br /&gt;
  for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
    for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
      printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, u[i][j]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
  return;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segundo trecho para método de Relaxação, Equação de Poisson&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;
#define N 1000&lt;br /&gt;
#define M 70&lt;br /&gt;
#define P 1&lt;br /&gt;
#define PI 3.141529&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void gaussseidelP(){&lt;br /&gt;
  &lt;br /&gt;
  double u[M+2][M+2], F[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0;&lt;br /&gt;
  double L=5., parada=0, erro=0.00001, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
&lt;br /&gt;
  dx = L/(M+1);&lt;br /&gt;
  dy = L/(M+1);&lt;br /&gt;
  &lt;br /&gt;
  for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
    for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
      u[i][j] = 0.;&lt;br /&gt;
      F[i][j] = i*dx*j*dy*exp(-(pow(i*dx,2) + pow(j*dy,2))/L);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 /* Solução Zero, Poisson0  */&lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = 0;&lt;br /&gt;
    u[M+1][i] = 0.0;&lt;br /&gt;
    u[i][0] = 0.0;&lt;br /&gt;
    u[i][M+1] = 0.0;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = 0;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  /* Primeira Solução, PoissonGS1 &lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
    u[0][i] = L;&lt;br /&gt;
    u[M+1][i] = 0.0;&lt;br /&gt;
    u[i][0] = 0.0;&lt;br /&gt;
    u[i][M+1] = 0.0;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  /* Segunda Solução, PoissonGS2 &lt;br /&gt;
  for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
  u[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
  u[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
  u[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
  u[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
  }&lt;br /&gt;
  u[0][M+1] = L;&lt;br /&gt;
  u[M+1][M+1] = 0.0;&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  do{    &lt;br /&gt;
    up = (u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3;&lt;br /&gt;
    &lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	u[i][j] = (u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1] + 4*dx*dx*F[i][j])/4;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    k++;&lt;br /&gt;
    parada = fabs((up-(u[1][1] + u[M/2+1][M/2+1] + u[M][M])/3)/up);&lt;br /&gt;
    if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N/5){&lt;br /&gt;
      a = 1;&lt;br /&gt;
    }else{&lt;br /&gt;
      a = 0;&lt;br /&gt;
    }&lt;br /&gt;
  }while(a == 0);&lt;br /&gt;
&lt;br /&gt;
  for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
    for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
      printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, u[i][j]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trecho de programa que utiliza o método de Super Relaxação para Equação de Laplace:&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;
#define N 1000&lt;br /&gt;
#define M 70&lt;br /&gt;
#define P 1&lt;br /&gt;
#define PI 3.141529&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void overrelaxationL(){&lt;br /&gt;
  &lt;br /&gt;
  double u[M+2][M+2], un[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0, omega=1.;&lt;br /&gt;
  double L=5., parada=0, erro=0.00005, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
  &lt;br /&gt;
  omega = 2/(1+PI*dx);&lt;br /&gt;
&lt;br /&gt;
    k = 0;&lt;br /&gt;
    &lt;br /&gt;
    dx = L/(M+1);&lt;br /&gt;
    dy = L/(M+1);&lt;br /&gt;
    &lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	un[i][j] = 1.;&lt;br /&gt;
	u[i][j] = un[i][j];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    /*&lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = 0.0;&lt;br /&gt;
      un[M+1][i] = L;&lt;br /&gt;
      un[i][0] = 0.0;&lt;br /&gt;
      un[i][M+1] = 0.0;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = 0.0;&lt;br /&gt;
    un[M+1][M+1] = L;&lt;br /&gt;
    */&lt;br /&gt;
    &lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
      un[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
      un[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
      un[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = L;&lt;br /&gt;
    un[M+1][M+1] = 0.0;   &lt;br /&gt;
    &lt;br /&gt;
    do{&lt;br /&gt;
      &lt;br /&gt;
      up = (un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8;&lt;br /&gt;
      &lt;br /&gt;
      for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
	for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	  un[i][j] = (un[i+1][j] + un[i-1][j] + un[i][j+1] + un[i][j-1])/4;&lt;br /&gt;
	  u[i][j] = u[i][j]*(1 - omega) + omega*un[i][j];&lt;br /&gt;
	  un[i][j] = u[i][j];&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      k++;&lt;br /&gt;
      parada = fabs((up-(un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8)/up);&lt;br /&gt;
      if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N){&lt;br /&gt;
	a = 1;&lt;br /&gt;
      }else{&lt;br /&gt;
	a = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }while(a == 0);&lt;br /&gt;
    &lt;br /&gt;
    for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
      for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
	printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, un[i][j]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trecho de programa do algoritmo de Super Relaxação para Equação de Poisson:&lt;br /&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;
#define N 1000&lt;br /&gt;
#define M 70&lt;br /&gt;
#define P 1&lt;br /&gt;
#define PI 3.141529&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void overrelaxationP(){&lt;br /&gt;
  &lt;br /&gt;
  double u[M+2][M+2], un[M+2][M+2], F[M+2][M+2];&lt;br /&gt;
  double dx=0, dy=0, omega=1.;&lt;br /&gt;
  double L=5., parada=0, erro=0.00005, up=0;&lt;br /&gt;
  int i=0, j=0, k=1, a=0;&lt;br /&gt;
  &lt;br /&gt;
  omega = 2/(1+PI*dx);&lt;br /&gt;
&lt;br /&gt;
    k = 0;&lt;br /&gt;
    &lt;br /&gt;
    dx = L/(M+1);&lt;br /&gt;
    dy = L/(M+1);&lt;br /&gt;
    &lt;br /&gt;
    for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
      for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	un[i][j] = 1.;&lt;br /&gt;
	u[i][j] = un[i][j];&lt;br /&gt;
	F[i][j] = i*dx*j*dy*exp(-(pow(i*dx,2) + pow(j*dy,2))/L);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
       &lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = 0.0;&lt;br /&gt;
      un[M+1][i] = 0.0;&lt;br /&gt;
      un[i][0] = 0.0;&lt;br /&gt;
      un[i][M+1] = 0.0;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = 0.0;&lt;br /&gt;
    un[M+1][M+1] = 0.0;&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
    for(i=0;i&amp;lt;M+1;i++){&lt;br /&gt;
      un[0][i] = L*pow(cos(i*dx*PI/L),2);&lt;br /&gt;
      un[M+1][i] = L*pow(sin(i*dx*PI/L),2);&lt;br /&gt;
      un[i][0] = L -  pow(i*dx,2)/L;&lt;br /&gt;
      un[i][M+1] = pow(((M+1)-i)*dx,2)/L;&lt;br /&gt;
    }&lt;br /&gt;
    un[0][M+1] = L;&lt;br /&gt;
    un[M+1][M+1] = 0.0;   &lt;br /&gt;
    */&lt;br /&gt;
    &lt;br /&gt;
    do{&lt;br /&gt;
      &lt;br /&gt;
      up = (un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8;&lt;br /&gt;
      &lt;br /&gt;
      for(i=1;i&amp;lt;M+1;i++){&lt;br /&gt;
	for(j=1;j&amp;lt;M+1;j++){&lt;br /&gt;
	  un[i][j] = (un[i+1][j] + un[i-1][j] + un[i][j+1] + un[i][j-1] + 4*dx*dx*F[i][j])/4;&lt;br /&gt;
	  u[i][j] = u[i][j]*(1 - omega) + omega*un[i][j];&lt;br /&gt;
	  un[i][j] = u[i][j];&lt;br /&gt;
	}&lt;br /&gt;
      }&lt;br /&gt;
      k++;&lt;br /&gt;
      parada = fabs((up-(un[1][1] + 4*un[M/2+1][M/2+1] + un[M][M] + un[1][M] + un[M][1])/8)/up);&lt;br /&gt;
      if(parada &amp;lt; erro &amp;amp;&amp;amp; k&amp;gt;N){&lt;br /&gt;
	a = 1;&lt;br /&gt;
      }else{&lt;br /&gt;
	a = 0;&lt;br /&gt;
      }&lt;br /&gt;
    }while(a == 0);&lt;br /&gt;
    &lt;br /&gt;
    for(i=0;i&amp;lt;M+2;i++){&lt;br /&gt;
      for(j=0;j&amp;lt;M+2;j++){&lt;br /&gt;
	printf(&amp;quot;%lf %lf %lf \n&amp;quot;,i*dx, j*dy, un[i][j]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&lt;br /&gt;
#[[http://www.mat.ufmg.br/~rodney/notas_de_aula/metodos_numericos_EDPs_elipticas.pdf]] Biezuner, Rodney Josué,&#039;&#039;Notas de Aula Métodos Numéricos para Equações Diferenciais Parciais Elípticas&#039;&#039; (UFMG, 2007)&lt;br /&gt;
#[[http://www.mat.ufmg.br/~rodney/notas_de_aula/iedp.pdf]] Biezuner, Rodney Josué,&#039;&#039;Introdução às Equações Diferenciais Parciais&#039;&#039; (UFMG, 2007)&lt;br /&gt;
#Jianping Zhu, &#039;&#039;Solving Partial Differential Equations on Parallel Computers&#039;&#039; (World Scientific, 1994)&lt;br /&gt;
&lt;br /&gt;
Grupo: Pedro Barbisan Widniczck&lt;/div&gt;</summary>
		<author><name>Pedrow7</name></author>
	</entry>
</feed>