diff --git a/modules/interaccoes.py b/modules/interaccoes.py index 8cb7418..5471d6f 100644 --- a/modules/interaccoes.py +++ b/modules/interaccoes.py @@ -1,10 +1,49 @@ from modules.agente import Agente from modules.mapa import Mapa +from hashlib import blake2b + + +def assinatura_interaccao(agente1: Agente, agente2: Agente) -> str: + assin = blake2b(digest_size=8) # usar 64 bits para performance + assin.update(f"{id(agente1)}+{id(agente2)}".encode("utf-8")) + return assin.hexdigest() + + +def criarDicionarioInteraccoes(mapa: Mapa) -> dict[str, list[Agente]]: + dicionario_interacoes: dict[str, list[Agente]] = {} + for pos_y in range(mapa.dimensao[0]): + for pos_x in range(mapa.dimensao[1]): + agente_actual: Agente = mapa.posicao((pos_x, pos_y)) + for pos_vizinho in agente_actual.vizinhanca(): + agente_vizinho: Agente = mapa.posicao((pos_vizinho[0], pos_vizinho[1])) + ass_normal = assinatura_interaccao(agente_actual, agente_vizinho) + ass_inversa = assinatura_interaccao(agente_vizinho, agente_actual) + # confirmar se interaccao já existe no dicionario + if ( + ass_normal in dicionario_interacoes.keys() + or ass_inversa in dicionario_interacoes.keys() + ): + continue + # se não existe, vamos adicionar interaccao ao dicionario + dicionario_interacoes[ass_normal] = [agente_actual, agente_vizinho] + return dicionario_interacoes def interaccaoEntreAgentes(agente1: Agente, agente2: Agente) -> None: pass -def correrInteraccoesEntreAgentes(mapa: Mapa | None) -> None: +def correrInteraccoesEntreAgentes(mapa: Mapa) -> None: + # interaccoes entre agentes + dicionario_interacoes: dict[str, list[Agente]] = criarDicionarioInteraccoes(mapa) + for interaccao in dicionario_interacoes: + agente1: Agente = dicionario_interacoes[interaccao][0] + agente2: Agente = dicionario_interacoes[interaccao][1] + resultado = interaccaoEntreAgentes(agente1, agente2) + # primeiro criar um dicionario de interacções, atravessando todas as + # posicoes de mapa[i][j] e fazendo um hash com agente_actual.id e + # agente_vizinho.id (e seu inverso, para evitar interaccoes ja + # existentes no dicionario). adicionar essa interação se ainda não + # existir no dicionario. passar para proximo vizinho. passar para + # proxima posicao no mapa. pass