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: # 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