<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=AC%3A_Jogo_da_Vida</id>
	<title>AC: Jogo da Vida - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=AC%3A_Jogo_da_Vida"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=AC:_Jogo_da_Vida&amp;action=history"/>
	<updated>2026-04-09T01:46:54Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=AC:_Jogo_da_Vida&amp;diff=7865&amp;oldid=prev</id>
		<title>Jhordan em 11h12min de 22 de julho de 2022</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=AC:_Jogo_da_Vida&amp;diff=7865&amp;oldid=prev"/>
		<updated>2022-07-22T11:12:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Edição das 08h12min de 22 de julho de 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Linha 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Ecologia| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Autômato celular e modelo baseado em indivíduos&lt;/del&gt;]] |[[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Por que usar e o que são modelos baseados em indivíduos&lt;/del&gt;]]}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Ecologia| [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Modelos Logísticos&lt;/ins&gt;]] |[[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Modelo de Lotka-Volterra&lt;/ins&gt;]]}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Modelos conceituais =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Modelos conceituais =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l195&quot;&gt;Linha 195:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 195:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Principal material utilizado =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Principal material utilizado =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[https://link.springer.com/article/10.1007/s10444-019-09696-8 A probabilistic extension to Conway’s Game of Life] (Gabriel Aguilera-Venegas e outros,)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[https://link.springer.com/article/10.1007/s10444-019-09696-8 A probabilistic extension to Conway’s Game of Life] (Gabriel Aguilera-Venegas e outros,)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Ecologia| [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Modelos Logísticos&lt;/ins&gt;]] |[[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Modelo de Lotka-Volterra&lt;/ins&gt;]]}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Ecologia| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Autômato celular e modelo baseado em indivíduos&lt;/del&gt;]] |[[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Por que usar e o que são modelos baseados em indivíduos&lt;/del&gt;]]}}&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jhordan</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=AC:_Jogo_da_Vida&amp;diff=7845&amp;oldid=prev</id>
		<title>Jhordan: Criou página com '{{Ecologia| Autômato celular e modelo baseado em indivíduos |Por que usar e o que são modelos baseados em indivíduos}}  = Modelos conceituais =  O &quot;Jogo da Vida&quot;...'</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=AC:_Jogo_da_Vida&amp;diff=7845&amp;oldid=prev"/>
		<updated>2022-07-20T19:34:42Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;{{Ecologia| &lt;a href=&quot;/index.php/Aut%C3%B4mato_celular_e_modelo_baseado_em_indiv%C3%ADduos&quot; title=&quot;Autômato celular e modelo baseado em indivíduos&quot;&gt;Autômato celular e modelo baseado em indivíduos&lt;/a&gt; |&lt;a href=&quot;/index.php/Por_que_usar_e_o_que_s%C3%A3o_modelos_baseados_em_indiv%C3%ADduos&quot; title=&quot;Por que usar e o que são modelos baseados em indivíduos&quot;&gt;Por que usar e o que são modelos baseados em indivíduos&lt;/a&gt;}}  = Modelos conceituais =  O &amp;quot;Jogo da Vida&amp;quot;...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ecologia| [[Autômato celular e modelo baseado em indivíduos]] |[[Por que usar e o que são modelos baseados em indivíduos]]}}&lt;br /&gt;
&lt;br /&gt;
= Modelos conceituais =&lt;br /&gt;
&lt;br /&gt;
O &amp;quot;Jogo da Vida&amp;quot; é um jogo criado em 1970 pelo matemático Horton Conway usando autômatos celulares. Na proposta original o jogo da vida é composto por uma grade de células quaradas, onde cada célula pode estar morta ou viva, e seu estado é atualizado a cada passo finito de tempo baseado no estado atual da própria célula e das 8 células vizinhas (vizinhança de Moore). Estas regras podem ser enunciadas da seguinte forma:&lt;br /&gt;
&lt;br /&gt;
* Reprodução: Qualquer célula morta com exatamente três vizinhos vivos será uma célula viva no próximo passo.&lt;br /&gt;
* Sobrevivência: Qualquer célula viva com 2 ou 3 vizinhos  vivos permanece vivo no próximo passo.&lt;br /&gt;
* Subpopulação: A célula morre se tiver menos de 2 vizinhos vivos na vizinhança.&lt;br /&gt;
* Superpopulação: A célula morre se tiver mais de 3 vizinhos na vizinhança.&lt;br /&gt;
&lt;br /&gt;
Um autômato celular probabilístico foi proposto como uma extensão no jogo da vida. A intenção é possuir um modelo mais flexível com a possibilidade de alterar os limites do Jogo da Vida clássico. A ideia básica do PCAEGOL (''Probabilistic Cellular Automata, Extension of the Game Of Life'') é que os estados das células vizinhas de uma dada célula não são conhecidos com exatidão, dessa forma o estado resultante  não é determinístico e há uma certa probabilidade de uma célula que teria determinado resultado deterministicamente, agora tenha outro. A ideia é que o sistema nem sempre se comporte conforme é esperado. As probabilidades podem ser definidas individualmente para cada célula vizinha de uma determinada célula. Por exemplo, tendo a célula central C0  e chamando as 8 células vizinhas de Ci (onde i=1,2,...,8),  então temos os vetores:&lt;br /&gt;
&lt;br /&gt;
* pl = (pl0,pl1,...,pl8), onde pli é a probabilidade da célula Ci ser considerada viva quando está viva.&lt;br /&gt;
* pd = (pd0,pd1,...,pd8), onde pdi é a probabilidade da célula Ci ser considerada viva quando está morta.&lt;br /&gt;
&lt;br /&gt;
Podemos recuperar o jogo da vida facilmente fazendo pli=1$ e pdi=0.  Além disso as regras clássicas do jogo da vida podem ser estendidas fazendo:&lt;br /&gt;
&lt;br /&gt;
* MAXO = Número máximo de células vizinhas vivas para que não ocorre superpopulação&lt;br /&gt;
* MINU = Número máximo de células vizinhas vivas para que não ocorre superpopulação&lt;br /&gt;
* MAXB = Número máximo de células vizinhas vivas para que a célula nasça no próximo passo&lt;br /&gt;
* MINB = Número mínimo de células vizinhas vivas para que a célula nasça no próximo passo&lt;br /&gt;
&lt;br /&gt;
Novamente podemos recuperar o Jogo da Vida clássico fazendo MAXO=3,MINU=2, MAXB=3 e  MINB=3.&lt;br /&gt;
&lt;br /&gt;
= Código do Jogo da Vida =&lt;br /&gt;
[https://mesa.readthedocs.io/en/latest/ Mesa]  é um ''framework''  em Python para desenvolvimento de modelos baseados em agentes, porém também podemos simular autômatos celulares e visualizar o resultado, por isto o mesmo foi utilizado para desenvolver ambos os códigos a seguir. Algun tutoriais podem ser consultados aqui e aqui.&lt;br /&gt;
&lt;br /&gt;
Para começar, precisamos definir duas classes: a de cada agent (no nosso caso cada célula) e a própria do modelo. Cada classe tem algumas obrigatórias relacionadas a forma com que avançamos o modelo. Como é assíncrono, o agente tem uma função para preparar as mudanças (step) e outra para aplicar as mudanças (advance). Além disso precisamos passar algumas informações para o modelo: que as células estão distribuídas em grade, a largura e altura da grade, e que as alterações ocorrem de forma assíncrona.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Bibliotecas necessárias&lt;br /&gt;
from mesa import Agent, Model                                      #Importamos as classes Agente e Modelo&lt;br /&gt;
from mesa.time import SimultaneousActivation                       #Importamos o agendador por ordem aleatória&lt;br /&gt;
from mesa.space import MultiGrid                                   #Importamos a malha&lt;br /&gt;
from mesa.visualization.modules import CanvasGrid                  #Gerar o JSON&lt;br /&gt;
from mesa.visualization.ModularVisualization import ModularServer  #Ler o JSON&lt;br /&gt;
import random                                                      #Biblioteca para números aleatórios&lt;br /&gt;
&lt;br /&gt;
#O Modelo em si&lt;br /&gt;
&lt;br /&gt;
class Planta(Agent):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Dinâmica da planta inspirada no jogo da vida&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self, ide, modelo,frac):&lt;br /&gt;
        super().__init__(ide, modelo)       #Requisito da biblioteca&lt;br /&gt;
        self.vivo = random.random() &amp;lt; frac  #Guardar o estado atual&lt;br /&gt;
        self.passo=self.vivo                #Guardar o próximo estado&lt;br /&gt;
&lt;br /&gt;
    def step(self):                         # Método que aplica as mudanças a cada passo&lt;br /&gt;
        #Pegamos a coordenada da vizinhança&lt;br /&gt;
        vizinhos = self.model.grid.get_neighborhood(self.pos,moore=True,include_center=False)&lt;br /&gt;
        nviz=0     &lt;br /&gt;
        agentes = self.model.grid.get_cell_list_contents(vizinhos) #E o conteúdo de cada célula&lt;br /&gt;
        for planta in agentes:&lt;br /&gt;
            if (planta.vivo==True):&lt;br /&gt;
                nviz+=1&lt;br /&gt;
        if (self.vivo==True):&lt;br /&gt;
            if   (nviz&amp;lt;2 or nviz&amp;gt;3):&lt;br /&gt;
                self.passo = False&lt;br /&gt;
        elif (nviz==3):&lt;br /&gt;
                self.passo=True&lt;br /&gt;
&lt;br /&gt;
    def advance(self): #E no simultâneo precisa de um método avance() que é o que aplica as mudanças assíncronas&lt;br /&gt;
        self.vivo=self.passo&lt;br /&gt;
                &lt;br /&gt;
class Modelo(Model):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Modelo geral&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self, frac, largura, altura):&lt;br /&gt;
        self.frac = frac&lt;br /&gt;
        self.grid = MultiGrid(largura, altura, True)    #Grade&lt;br /&gt;
        self.schedule = SimultaneousActivation(self)    #Assíncrono&lt;br /&gt;
        self.running = True                             #Sem codições de parada&lt;br /&gt;
        # Criar agentes&lt;br /&gt;
        i=0&lt;br /&gt;
        for X in range(largura):&lt;br /&gt;
            for Y in range(altura):&lt;br /&gt;
                a = Planta(i, self,self.frac)&lt;br /&gt;
                self.schedule.add(a)&lt;br /&gt;
                self.grid.place_agent(a, (X, Y))&lt;br /&gt;
                i+=1&lt;br /&gt;
&lt;br /&gt;
    def step(self):                                    #Avança o modelo&lt;br /&gt;
        self.schedule.step()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para exibir a simulação na tela, ainda precisamos definir como gerar o JSON em que especificamos como cada célula deve ser exibida na tela. No caso omo retângulos 1x1 onde a cor depende se a célula esta viva ou morta.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Define como gerar esse JSON&lt;br /&gt;
def retrato(planta):         &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Definir o retrato do agente&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    portrayal = {&amp;quot;Shape&amp;quot;: &amp;quot;rect&amp;quot;,&amp;quot;Filled&amp;quot;: &amp;quot;true&amp;quot;,&amp;quot;h&amp;quot;: 1.0,&amp;quot;w&amp;quot;:1.0,&amp;quot;Layer&amp;quot;:1}    &lt;br /&gt;
    if (planta.vivo == True):&lt;br /&gt;
        portrayal[&amp;quot;Color&amp;quot;] = &amp;quot;green&amp;quot; &lt;br /&gt;
    else:&lt;br /&gt;
        portrayal[&amp;quot;Color&amp;quot;] = &amp;quot;grey&amp;quot;&lt;br /&gt;
    return portrayal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definimos então a grade para exibir na tela:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Definimos uma grade de 10x10 células e 500x500 píxeis&lt;br /&gt;
grade = CanvasGrid(retrato, 10, 10, 500, 500)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E lançamos o servidor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Lançamo o servidor&lt;br /&gt;
servidor = ModularServer(Modelo, [grade], &amp;quot;Jogo da Vida&amp;quot;,{&amp;quot;frac&amp;quot;:0.1, &amp;quot;largura&amp;quot;:10, &amp;quot;altura&amp;quot;:10}) &lt;br /&gt;
servidor.port = 8521                                        &lt;br /&gt;
servidor.launch()                                              #Lançamos o servidor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Código do PCAEGOL =&lt;br /&gt;
O código do PCAEGL segue a mesma ideia do anterior, com as alterações pertinentes devido às diferenças de modelo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Bibliotecas necessárias&lt;br /&gt;
from mesa import Agent, Model                                      #Classes Agente e Modelo&lt;br /&gt;
from mesa.time import SimultaneousActivation                       #Agendador simultâneo&lt;br /&gt;
from mesa.space import MultiGrid                                   #Malha multigrid&lt;br /&gt;
from mesa.visualization.modules import CanvasGrid                  #Gerar o JSON&lt;br /&gt;
from mesa.visualization.ModularVisualization import ModularServer  #Ler o JSON&lt;br /&gt;
import random                                                      #Número aleatórios&lt;br /&gt;
&lt;br /&gt;
#Classe do agente&lt;br /&gt;
class Agente(Agent):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Classe do agente&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self, ide, modelo):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Função incializadora&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        super().__init__(ide, modelo)     #Necessário para funcionar o modelo&lt;br /&gt;
        F = 0.5                           #Fração de plantas vivas&lt;br /&gt;
        self.vivo  = random.random() &amp;lt; F  #Definimos o estado inicial da planta&lt;br /&gt;
        self.passo = self.vivo            #E já definimos a situação no próximo estado&lt;br /&gt;
&lt;br /&gt;
    def step(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Método obrigatório que prepara as mudanças&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        #pl = 1;pd = 0;MAXO=3;MINU=2;MAXB=3;MINB=3&lt;br /&gt;
        pl = 1;pd = 0;MAXO=6;MINU=2;MAXB=3;MINB=3                                                    #Parâmetros do PCAEGOL&lt;br /&gt;
        vizinhos = self.model.grid.get_neighborhood(self.pos,moore=True,include_center=False)        #Coordenada da vizinhança&lt;br /&gt;
        nviz=0                                                                                       #Contador de vizinhos&lt;br /&gt;
        agentes = self.model.grid.get_cell_list_contents(vizinhos)                                   #Agentes na vizinhança&lt;br /&gt;
        for planta in agentes:                                                                       #Percorre o agentes&lt;br /&gt;
            estado = (random.random() &amp;lt;pl) if (planta.vivo) else (random.random() &amp;lt;pd)               #Se está vivo ou não&lt;br /&gt;
            nviz = (nviz+1) if (estado) else (nviz)                                                  #Soma o mais um vizinho&lt;br /&gt;
        estado = (random.random() &amp;lt;pl) if (self.vivo) else (random.random() &amp;lt;pd)&lt;br /&gt;
        if (estado):&lt;br /&gt;
            if (nviz&amp;lt;MINU or nviz&amp;gt;MAXO):                                                             #Sub ou super população&lt;br /&gt;
                self.passo = False&lt;br /&gt;
        elif (nviz &amp;gt;= MINB and nviz&amp;lt;=MAXB):                                                          #Reprodução&lt;br /&gt;
                self.passo = True&lt;br /&gt;
                &lt;br /&gt;
    def advance(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Método obrigatório que aplica as mudanças&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.vivo=self.passo   #Aplica as mudanças&lt;br /&gt;
                &lt;br /&gt;
class Modelo(Model):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Modelo geral&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self, largura, altura):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Função chamada quando o modelo é inicializazdo&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.grid     = MultiGrid(largura, altura, True)         #Configura a grade&lt;br /&gt;
        self.schedule = SimultaneousActivation(self)             #Configura o agendador&lt;br /&gt;
        self.running = True                                      #Condiçao para seguir executando o modelo&lt;br /&gt;
        # Distribuir agentes em toda grade &lt;br /&gt;
        i=0&lt;br /&gt;
        for X in range(largura):&lt;br /&gt;
            for Y in range(altura):&lt;br /&gt;
                a = Agente(i, self)&lt;br /&gt;
                self.schedule.add(a)&lt;br /&gt;
                self.grid.place_agent(a, (X, Y))&lt;br /&gt;
                i+=1&lt;br /&gt;
    def step(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Avançar um passo do modelo&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.schedule.step()&lt;br /&gt;
&lt;br /&gt;
#Define como gerar esse JSON&lt;br /&gt;
def retrato(agente):         &lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Definir o retrato do agente&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    portrayal = {&amp;quot;Shape&amp;quot;: &amp;quot;rect&amp;quot;,&amp;quot;Filled&amp;quot;: &amp;quot;true&amp;quot;,&amp;quot;h&amp;quot;: 1.0,&amp;quot;w&amp;quot;:1.0,&amp;quot;Layer&amp;quot;:1}    &lt;br /&gt;
    if (agente.vivo == True):&lt;br /&gt;
        portrayal[&amp;quot;Color&amp;quot;] = &amp;quot;green&amp;quot; &lt;br /&gt;
    else:&lt;br /&gt;
        portrayal[&amp;quot;Color&amp;quot;] = &amp;quot;grey&amp;quot;&lt;br /&gt;
    return portrayal&lt;br /&gt;
&lt;br /&gt;
#Lançamo o servidor&lt;br /&gt;
grade = CanvasGrid(retrato, 20, 20, 500, 500)&lt;br /&gt;
servidor = ModularServer(Modelo, [grade], &amp;quot;Jogo da Vida&amp;quot;,{&amp;quot;largura&amp;quot;:20, &amp;quot;altura&amp;quot;:20}) &lt;br /&gt;
servidor.port = 8521 &lt;br /&gt;
servidor.launch()      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Principal material utilizado =&lt;br /&gt;
[https://link.springer.com/article/10.1007/s10444-019-09696-8 A probabilistic extension to Conway’s Game of Life] (Gabriel Aguilera-Venegas e outros,)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Ecologia| [[Autômato celular e modelo baseado em indivíduos]] |[[Por que usar e o que são modelos baseados em indivíduos]]}}&lt;/div&gt;</summary>
		<author><name>Jhordan</name></author>
	</entry>
</feed>