You are here

Atividade 3

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

 

    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.

    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.

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:

    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:

Agente move-se para a árvore

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>

        <listener>
            <listenertype>edu.memphis.ccrg.lida.globalworkspace.BroadcastListener</listenertype>
            <modulename>GlobalWorkspace</modulename>
            <listenername>ActionSelection</listenername>
        </listener>

    As modificações acima tornam o agente incapaz de tomar decisões: a nova classe ainda não possui nenhum método implementado para realizar a seleção de ação do agente. Os schemes, do Procedural Memory, são ativados de acordo com as informações sensoriais recebidas pelo agente. O Global Workspace exibe as coalisões que possuem informações sobre os nodes sensoriais. No entanto, o Action Selection não exibe nenhum behavior e nem as informações sobre sua ativação, contexto e ação. 

    A nova classe deverá implementar um novo algoritmo para a seleção de ação: o contexto do behavior deve estar presente no broadcast corrente antes desse comportamento ser elegível para seleção.

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer