Simulação de Micélio de Fungo: mudanças entre as edições
Linha 17: | Linha 17: | ||
== Mecanismos Gerais dos Modelos == | == Mecanismos Gerais dos Modelos == | ||
Devido à grande complexidade e exigência computacional, algumas características típicas do desenvolvimento de fungos foram deixadas de lado durante a construção de nosso modelo computacional. | Devido à grande complexidade e exigência computacional, algumas características típicas do desenvolvimento de fungos citadas na primeira seção foram deixadas de lado durante a construção de nosso modelo computacional. No entanto, os mecanismos essenciais para o bom funcionamento da simulação foram mantidos e serão abordados mais profundamente nessa seção. | ||
===Crescimento e divisão=== | ===Crescimento e divisão=== | ||
Edição das 19h59min de 22 de maio de 2021
Grupo: Arthur Dornelles, Bruno Zanette, Gabriel De David e Guilherme Hoss
O objetivo deste trabalho é modelar computacionalmente o desenvolvimento de micélios em fungos com base em mecanismos gerais pré-estabelecidos. O progresso e a complexidade dos modelos cresceram de maneira gradual ao longo do trabalho através de três modelos de crescimento diferentes. O trabalho foi inspirado - principalmente - nos dois primeiros capítulos do artigo de Steven Hopkins [1].
Motivação e Introdução aos Fungos
Fungos estão integrados em grande parte dos ecossistemas do planeta e cumprem importantes funções na manutenção e sobrevivência dos mesmos. De maneira geral, eles produzem enzimas que são responsáveis pela decomposição de matéria orgânica e - portanto - a reciclagem de diversos nutrientes do ambiente ao seu redor [2]. Em muitos casos, fungos formam fusões simbióticas com plantas ou algas e interagem de diferentes maneiras com diferentes organismos vivos. Neste trabalho, todavia, não faremos a análise dessas interações e focaremos no comportamento individual de crescimento de fungos.
Anatomicamente, fungos são compostos por células que se assemelham a tubos microscópicos, denominadas de hifas. Essas hifas então se ramificam e se fundem umas com as outras em um processo chamado de anastomose, formando uma complexa rede chamada de micélio (figura 1).
A criação de novas hifas, em geral, ocorre ao longo do tempo através de dois processos principais: o primeiro, denominado de ramificação dicotômica, consiste na ponta de uma hifa já existente se dividindo ao meio. O segundo processo é chamado de ramificação lateral, no qual, como o nome sugere, formam-se novos ramos e hifas na lateral de uma hifa já existente, como pode ser visto na figura 2.
Tendo em vista o objetivo deste trabalho, é importante também entender o porquê e quando as ramificações citadas acimas ocorrem, para que possamos programá-las em nosso modelo computacional. A ramificação, portanto, é atribuída ao acúmulo de partículas de nutrientes e materiais no ambiente, o que estimula a extensão das hifas dos fungos em sua direção. Dessa maneira, o crescimento e desenvolvimento dos fungos são altamente dependentes e influenciados pela disponibilidade de nutrientes e materiais no ambiente ao seu redor. Apesar desse fato, fungos podem continuar se desenvolvendo até em ambientes com poucos nutrientes, devido ao processo de translocação, no qual os nutrientes previamente absorvidos pelo fungo podem ser transportados internamente, bancando o crescimento do mesmo em locais com deficiência de nutrientes.
Mecanismos Gerais dos Modelos
Devido à grande complexidade e exigência computacional, algumas características típicas do desenvolvimento de fungos citadas na primeira seção foram deixadas de lado durante a construção de nosso modelo computacional. No entanto, os mecanismos essenciais para o bom funcionamento da simulação foram mantidos e serão abordados mais profundamente nessa seção.
Crescimento e divisão
Tipicamente uma hifa cresce apicalmente em linha reta com pouca variação em sua orientação e, quando ocorre, essa mudanças de ângulo no crescimento segue uma distribuição normal. Os tipos de divisão variam entre as epécies e dependem muito da presença de vesículas de nutrientes nas pontas das hifas e da pressão hidrostática interna das hifas. Algo que pode ocorrer conforme o crescimento desse fungo é o processo de encontro e fusão das pontas dessas hifas, processo esse chamado de anastomose que permite a transmissão de substâncias internas entre os vasos (figura 3).
Distribuição de Nutrientes
Construção do modelo computacional
Primeiro modelo de Fungo
- Branching na ponta
- Computar só os da ponta
- Crescimento ocorre só com o nutriente que o ponto final está
Segundo modelo de Fungo
- Junção (anastomosis)
Implementação
Crescimento
def crecimento (x1,y1,x2,y2):
x = x2 - x1
y = y2 - y1
theta= np.arctan(y/x)
if (x<0) :
theta= theta+ math.pi
aleatorio_theta = random.normalvariate(0, math.pi/4) # angulo de
theta=theta+aleatorio_theta
addx = r * math.cos(theta)
addy = r * math.sin(theta)
fx = x2 + addx
fy = y2 + addy
return (fx,fy)
Divisão
def divisao (x1,y1,x2,y2):
x = x2 - x1
y = y2 - y1
theta= np.arctan(y/x)
if (x<0) :
theta= theta + math.pi
angulodivisao= random.normalvariate(0, math.pi/4)
angulo1= theta- angulodivisao/2
angulo2= theta+ angulodivisao/2
addx1 = r * math.cos(angulo1)
addy1 = r * math.sin(angulo1)
addx2= r * math.cos(angulo2)
addy2= r * math.sin(angulo2)
Ax = x2 + addx1
Ay = y2 + addy1
Bx = x2 + addx2
By= y2 +addy2
return (Ax,Ay,Bx,By)
Intersecção de linhas
def check_anastomose(eventos,xf,yf,xi,yi):
flag = True
for evento in eventos:
if (xi == evento[2] and yi == evento[3]):
continue
if (xi == evento[0] and yi == evento[1]):
continue
D = (evento[3]-evento[1])*(xf-xi) - (evento[2]-evento[0])*(yf-yi)
uA = ((evento[2]-evento[0])*(yi-evento[1]) - (evento[3]-evento[1])*(xi-evento[0]))/D
uB = ((xf-xi)*(yi-evento[1])-(yf-yi)*(xi-evento[0]))/D
flag = True
if (0<=uA<=1) and (0<=uB<=1):
flag = False
if not flag:
xf, yf = get_intersection_point(uA,xf,yf,xi,yi)
break
return xf,yf, flag
Após se encontrar usa a func:
def get_intersection_point(uA,xf,yf,xi,yi):
xf = xi + (uA * (xf-xi))
yf = yi + (uA * (yf-yi))
return xf,yf
Mapa de Nutriente
def find_nearest(array, value):
array = np.asarray(array)
idx = (np.abs(array - value)).argmin()
return array[idx]
def check_nutri(x,y,xmapa,ymapa,mapa_nutri):
near_x = find_nearest(xmapa,x) ## encontra valor mais próximo em x
near_y = find_nearest(ymapa,y) ## encontra valor mais próximo em y
index_x = np.where(xmapa == near_x) ## encontra o index do valor de x
index_y = np.where(ymapa == near_y) ## encontra o index do valor de y
return (mapa_nutri[index_y[0][0]][index_x[0][0]])
def atualiza_mapa_nutri(x,y,xmapa,ymapa,mapa_nutri,preco):
near_x = find_nearest(xmapa,x) ## encontra valor mais próximo em x
near_y = find_nearest(ymapa,y) ## encontra valor mais próximo em y
index_x = np.where(xmapa == near_x) ## encontra o index do valor de x
index_y = np.where(ymapa == near_y) ## encontra o index do valor de y
mapa_nutri[index_y[0][0]][index_x[0][0]] -= preco
return (mapa_nutri)
Referências
[1]HOPKINS, Steven. A Hybrid Mathematical Model of Fungal Mycelia: Tropisms, Polarised Growth and Application to Colony Competition, tese de doutorado, 2011.(https://core.ac.uk/download/pdf/6117416.pdf)
[2]DA SILVA, Priscila. Reino Fungi. InfoEscola (2018). Disponível em: https://www.infoescola.com/biologia/reino-fungi. Acesso em: 15 de Maio de 2021.
[3] Line to line intersection. Wikipédia. Disponível em: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
- ↑ 1,0 1,1 HOPKINS, Steven. A Hybrid Mathematical Model of Fungal Mycelia: Tropisms, Polarised Growth and Application to Colony Competition, tese de doutorado, 2011.(https://core.ac.uk/download/pdf/6117416.pdf)
- ↑ DA SILVA, Priscila. Reino Fungi. InfoEscola (2018). Disponível em: https://www.infoescola.com/biologia/reino-fungi. Acesso em: 15 de Maio de 2021.
- ↑ Line to line intersection. Wikipédia. Disponível em: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection