LIDA: Exemplos de Implementação Prática
O projeto ALifeAgentExercises cria um agente que habita o ambiente "Hamburger Jungle". O ambiente do agente é composto por células (grade de 10 x 10), onde cada célula pode conter um certo número de objetos. O mundo do agente compreende o próprio agente (Agent), além de "macacos malvados" (Monkey), árvores (Tree), rochas (Rock) e "deliciosos hamburguers" (Food). Os macacos podem se mover aleatoriamente e vão tentar ferir o agente, caso ocupem a mesma célula que este. As rochas ocupam todo o espaço de uma célula, bloqueando o movimento dos macacos e do agente. O agente pode apenas perceber os objetos que estão na sua própria célula, além dos objetos que estiverem na sua frente (célula adjacente); o agente também sente sua "saúde" (health). As ações do agente consistem em: mover-se uma célula à frente (move forward), girar (turn left, turn right), girar ao redor (turn around), comer (eat) e "fugir" (flee), girando e movendo-se para frente. A saúde do agente diminui um pouco conforme o tempo passa; além de diminuir quando o agente é atacado por um macaco, quando o agente tenta se mover para o local ocupado por uma rocha, ou quando tenta se mover para além dos limites do seu mundo. Ao comer um hambúrger, a saúde do agente aumenta substancialmente.
Agent Exercise 1
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno8/Aula13/LIDA2_atividade3_fig01.JPG)
A figura acima exibe a tela do ambiente AlifeEnvironment. Pode-se visualizar os objetos que ocupam as células do ambiente. Algumas células possuem mais de um objeto; o conteúdo de tais células pode ser devidamente visualizado "clicando-se" sobre a célula; o seu conteúdo será exibido na janela à direita da janela do ambiente, conforme mostra a figura acima. A GUI deste ambiente é um pouco diferente daquela estudada no projeto anterior. A PAM Table deste projeto tem muito mais nodes do que o projeto anterior. O PAM Graph também é bem mais complexo; pode-se visualizar a estrutura mais complexa do Perceptual Buffer, na figura abaixo.
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno8/Aula13/LIDA2_atividade3_fig02.JPG)
Ao rodar a simulação, exibida na figura acima, o agente navega pelo ambiente, evitando os macacos e procurando comida quando sua saúde estiver baixa; o agente come os hamburguers quando estes estiverem na mesma célula que o agente ocupa. A parte inferior da figura acima exibe a guia Task Queue; é possível visualizar as tasks que foram agendadas para rodar nos diferentes ticks.
ALIfe Agent Exercise 2
Neste exercício serão abordadas a criação de uma classe detectora de features, e a criação de uma nova task. No arquivo lidaConfig.properties, será alterada a propriedade lida.agentdata para referenciar o arquivo configs/alifeAgent_ex2.xml. O arquivo objects.properties também deverá ser alterado; o valor do QTY para food deve ser alterado para 0. Ao rodar a aplicação, o agente falha ao se mover quando está com baixa saúde: o agente permanece "parado" na mesma célula, sem tomar nenhuma decisão.
Para sanar este problema, será criada uma nova classe, BadHealthDetector, para permitir ao agente detectar a condição de baixa saúde. O próximo passo será modificar o arquivo factoryData.xml; será criada a task BadHealthDetector, conforme código abaixo:
<task name="BadHealthDetector">
<class>alifeagent.featuredetectors.BadHealthDetector</class>
<ticksperrun>3</ticksperrun>
<associatedmodule>SensoryMemory</associatedmodule>
<associatedmodule>PerceptualAssociativeMemory</associatedmodule>
</task>
No arquivo alifeAgent_ex2.xml, será criada a task BadHealthDetector, dentro do módulo PerceptualAssociativeMemory, conforme código abaixo:
<task name="BadHealthDetector">
<tasktype>BadHealthDetector</tasktype>
<ticksperrun>3</ticksperrun>
<param name="node" type="string">badHealth</param>
</task>
Também deve ser criada a task predatorFrontDetector, conforme código abaixo:
<task name="predatorFrontDetector">
<tasktype>ObjectDetector</tasktype>
<ticksperrun>3</ticksperrun>
<param name="node" type="string">predatorFront</param>
<param name="object" type="string">predator</param>
<param name="position" type="int">1</param>
</task>
Agora o agente consegue detectar a condição de baixa saúde, conforme figura abaixo (Perceptual Buffer), e começará a se mover quando sua saúde estiver nessa condição (badHealth). O agente também irá fugir de um macaco quando houver um na frente do agente. Há schemes previamente escritos que implementam essas ações do agente quando tais situações forem detectadas.
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno8/Aula13/LIDA2_atividade3_fig03.JPG)
ALIfe Agent Exercise 3
A tarefa deste exercício será criar e modificar os attentional codelets e verificar o efeito dessas modificações. No arquivo lidaConfig.properties, será alterada a propriedade lida.agentdata para referenciar o arquivo configs/alifeAgent_ex3.xml. O arquivo objects.properties também deverá ser alterado; o valor do QTY para food deve ser alterado, de novo, para 10. Ao rodar a aplicação, o agente não reage à aproximação dos predadores (macacos). Os possíveis motivos para isso podem ser: porque o agente não percebe a aproximação do predador, talvez pela falta de algum attentional codelet; ou pela falta de algum mecanismo de fuga (scheme) para reagir a essa situação.
O que está acontecendo, neste exemplo, é a falta de um attentional codelet para detectar o predador. Para sanar essa situação, deverá ser criada a task PredatorAttentionCodelet dentro da declaração do módulo AttentionModule, conforme as linhas de código abaixo:
<task name="PredatorAttentionCodelet">
<tasktype>NeighborhoodAttentionCodelet</tasktype>
<ticksperrun>5</ticksperrun>
<param name="nodes" type="string">predator</param>
<param name="refractoryPeriod" type="int">50</param>
<param name="initialActivation" type="double">1.0</param>
</task>
A figura abaixo exibe a formação de coalisões (Global Workspace) quando o agente percebe a aproximação de um predador, após a criação do attentional codelet:
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno8/Aula13/LIDA2_atividade3_fig04.JPG)
Agora o agente pode criar o conceito de predador em sua consciência e agir adequadamente a esse conceito percebido. Dentro da declaração do módulo AttentionModule, na task FoodAttentionCodelet, a alteração do parâmetro initialActivation para 0.01 (ao invés de 1.0) altera a reação do agente à percepção de comida (food): o agente torna-se menos "ávido" à comida; o agente se interessa menos por comer os hamburguers, além de notá-los com menos frequência. A modificação do parâmetro refractoryPeriod para 10, da task GoodHealthAttentionCodelet, aumenta a frequência com que as coalisões do tipo "goodHealth" surgem na guia Global Workspace. O valor anterior era 50.
ALIfe Agent Exercise 4
Neste exercício serão analisados os efeitos da modificação dos schemes, o uso de um Initializer customizado para o módulo PAM, além da obtenção de uma estratégia de decaimento não-default para o ElementFactory. No arquivo lidaConfig.properties, será alterada a propriedade lida.agentdata para referenciar o arquivo configs/alifeAgent_ex4.xml. Ao rodar a aplicação, o agente não se move enquanto sua saúde não cair abaixo de 0.66; porém, o agente se move caso algum macaco se aproxime dele. Na declaração do módulo ProceduralMemory, no scheme.10b, a ação deverá ser alterada para action.moveAgent. Agora, ao rodar a aplicação, o agente move-se mesmo se sua saúde estiver alta (goodHealth).
Os elementos da PAM são inicializados pelo BasicPamInitializer; que lê dois parâmetros, nodes e links, e cria Nodes e Links na PAM baseados nesses parâmetros. Esses objetos são criados com strategies default para excitação e decaimento. Na declaração do módulo PAM, o parâmetro initializerclass deve ser alterado para alifeagent.initializers.CustomPamInitializer; essa classe será responsável por adicionar, na PAM, um novo Node "object" e um novo Link do Node "rock" para o Node "object". Quando o agente perceber uma rocha, o Node "object" receberá parte dessa ativação; quando o agente detecta comida, este node também será ativado. Também será criada, nessa classe, uma strategy para o decaimento usado pelo Node "object". Ao realizar essa modificação, a ativação do Node "object" irá perdurar por mais tempo (guia PAM Table) do que a dos Nodes "rock" e "food". As modificações na classe CustomPamInitializer são exibidas abaixo:
child = pam.getNode("food");
pam.addDefaultLink(factory.getLink(child, objectNode, PerceptualAssociativeMemoryImpl.PARENT));
DecayStrategy decayStrategy = factory.getDecayStrategy("slowDecay");
objectNode.setDecayStrategy(decayStrategy);
Advanced Exercise 1
Normalmente, o agente não possui nenhuma reação quando de frente para uma árvore (tree). Quando o agente estiver numa célula com uma árvore, ele estará seguro do ataque dos macacos. Neste exercício, será adicionado um novo attentional codelet relativo ao node tree; também será adicionado um novo scheme ao módulo Procedural Memory com o contexto do node treeFront e a ação action.moveAgent. Na declaração do módulo AttentionModule, será criado o attentional codelet para o node treeFront, conforme o código a seguir:
<task name="TreeAttentionCodelet">
<tasktype>NeighborhoodAttentionCodelet</tasktype>
<ticksperrun>5</ticksperrun>
<param name="nodes" type="string">treeFront</param>
<param name="refractoryPeriod" type="int">50</param>
<param name="initialActivation" type="double">0.7</param>
</task>
Na declaração do módulo ProceduralMemory, será criado um novo scheme para fazer o agente reagir (moveAgent) à percepção de uma árvore na sua frente, conforme a linha de código abaixo:
<param name="scheme.11">move to tree|(treeFront)()|action.moveAgent|()()|0.5</param>
Agora o agente vai preferir mover-se para a célula que contém uma árvore (tree) sempre que o agente notar a sua presença; o agente fica protegido dos ataques dos macacos buscando refúgio numa árvore. As figuras abaixo ilustram o novo comportamento do agente:
Árvore detectada:
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno8/Aula13/LIDA2_atividade3_fig05.JPG)
Agente move-se para a árvore
![](/gudwin/sites/faculty.dca.fee.unicamp.br.gudwin/files/users/aluno8/Aula13/LIDA2_atividade3_fig06.JPG)
Advanced Exercise 2
O módulo Action Selection, usado neste projeto, é muito simples. Este exercício visa a criação de uma nova classe Action Selection, que estende FrameworkModuleImpl e implementa as interfaces ActionSelection e BroadcastListener. O arquivo alifeAgent.xml deverá ser modificado, adicionando-se um novo listener, onde o Action Selection é um BroadcastListener do GlobalWorkspace. Os códigos abaixo exibem as modificações no arquivo alifeAgent.xml:
<module name="ActionSelection">
<class>alifeagent.modules.CustomActionSelection</class>
<param name="actionSelection.ticksPerStep" type="int"> 10</param>
<taskspawner>defaultTS</taskspawner>
</module>