You are here

Aula 13 - LIDA 2: Exemplos de implementação Prática

Aula 13 - LIDA 2: Exemplos de implementação Prática

Este relatório tem por objetivo estudar o funcionamento e as estruturas presentes na arquitetura cognitiva LIDA, conforme o seu tutorial disponibilizado pelo seus idealizadores.

Atividade 1

Foi feito o download do Framework da Arquitetura Cognitiva LIDA, juntamente com manual, tutoriais e exemplos de utilização.
 

Atividade 2: Tutorial Project I

Segue as análises e execuções dos tutoriais do LIDA.
 

Basic Agent Exercise 0

O primeiro exercício tem por finalidade entender a estrutura básica da arquitetura LIDA conforme o projeto basicAgentExercises. Foi feita análises referentes a artefatos(Classes e Arquivos XML) presente no projeto conforme suas funcionalidades, como:

  • myagent.Run: Inicia a execução da aplicação.
  • myagent.modules.ButtonEnvironment: Implementa funções e botões no ambiente.
  • myagent.modules.ButtonSensoryMemory: Implementa funções e caracteristicas da Memórial Sensorial do agente.
  • myagent.featuredetectors.ColorDetector: Classe que tem por finalidade a detecção de cores do perceptos encontrados no ambiente.
  • myagent.featuredetectors.ShapeDetector: Classe que implementa funções que detectam o formato dos perceptos encontrados no ambiente.
  • lidaConfig.properties: Principal arquivo de configuração dos parametros para o funcionamento correto da LIDA como: Propriedades do agente, Propriedades da GUI e Propriedades de Logging.
  • basicAgent.xml: Arquivo que define parametros da arquitetura do agente como: módulos e processos.
  • factoryData.xml:Arquivo que define elementos que podem ser obtidas a partir da ElementFactory. Definições como: Node, Link, Strategy e Task Types.
  • guiPanels.properties:Arquivo de configuração das GUIPanels que são utilizado pelo Framework's GUI, onde podem ser haver adição, remoção e costumização de telas.

 

Basic Agent Exercise 1

Este exercício tem por objetivo como:

  • Familiarizar com Framework's GUI.
  • Entender a barra de ferramentas e suas funcionalidades incluindo start/pause, ticks, step mode e duração de tick.
  • Familiarizar com o ButtonEnvoriment.
  • Aprender sobre os Logging e Arquivos Configuração do GuiPanels.

Com a execução da aplicação observou-se que é apresentada a interface da aplicação com diversos botões e componentes. O botão "Start/Pause" inicia a execução da simulação apresentada pelo exemplo. Com isso, percebeu-se que aplicação exemplo do tutorial implementa a arquitetura LIDA com a finalidade de ter uma mente artificial que seja capaz de reconhecer de objetos em formas geométricas(Quadrado e Circulo) e a sua cor em ambiente virtual. No ambiente virtual apresenta espaço gráfico a onde são apresentado os objetos e dois botões(Button 1 e Button 2) que são pressionado conforme a mente artificial vai reconhecendo o objeto, por exemplo: Se for objeto em forma de quadrado e da cor vermelha, então pressiona-se o botão Buttton 1, ou se for objeto em forma de circulo e da cor azul, então pressiona-se o botão Button 2.

Próximo ao botão "Start/Pause" está o botão "Step Mode" onde a sua função é executar o reconhecimento em passos(ticks). Para o LIDA o "tick" é um contador de ciclos cognitivos(clock cognitivo), onde ações, atividades etc. consomem esses ciclos. O LIDA permite configurar o quantos "ticks" uma determinada elemento/tarefa pode consumir. Juntamenta ao lado do botão "Step Mode" está oum campo onde é informado o tamanho de "ticks" que devem ser rodados por passo, para este caso foi configurado 100(cem) "ticks" por passo. Ao clicar no botão "Step Mode", informar a quantidade de "ticks" por passo foi acionado o botão "Run Ticks"(ao lado do campo) que faz com que a mente artificial execute 100 "ticks", ou seja, a cada evento do botão "Run Ticks" a mente artificial executa 100 "ticks" dentro do seu ciclo cognitivo, consequentemente o reconhecimento dos objetos acontecem.

Na barra de ferramentas está o campo "Tick durantion" que define o tempo de duração de cada "tick". Foi testado dois valores de duração 20ms e 0ms, e percebeu-se que houve alterações no tempo de execução.

Mais abaixo da interface do programa, apresenta-se o panel "Logging" nele é registrado todos resultados de execução do programa. Ele apresenta cinco colunas como: Número do Log, Numero de ticks do momento, Nível de Severidade, Nome do Log e por fim a Mensagem. Pouco mais acima, a interface apresenta um "DropDown" chamado de "Logger" onde o mesmo realiza o filtro dos logs registrados no panel conforme o nome do log. Mais a direita, esta outro "DropDown" chamado "Logging Level" que realiza o filtro dos logs por nível de severidade. Abaixo na Figura 1 demonstra da tela principal do programa.

Na mesma "TabList" que a "Logging Panel" apresenta a tab "ConfigurationFiles" onde a mesma demonstra as configurações atual que é utilizada pela aplicação que representa exatamente a configuração do arquivo "LidaConfig.properties".

Figura 1 - Interface principal do programa Basic Agent Exercise.

 

Basic Agent Exercise 2

Este execício tem por objetivo como:

  • Fimiliarizar com a funcionalidade das caracteristicas do detector.
  • Fimiliarizar com a funcionalidade da executação do codelet de atenção.
  • Estudar outras interfaces gráficas, como: "PAM Table", "Perceptual Buffer" e "GlobalWorkspace".
  • Customizar a GUI adicionando "GuiPanel" para visualizar os conteúdos do Workspace atual do modelo.

 

Para o inicio deste exercício foi alterado o arquivo lidaConfig.properties mais especificamente o parametro lida.agentdata com o valor "configs/basicAgent_ex2.xml", conforme o código abaixo. Logo em seguida, foi executada a aplicação e percebeu-se que o agente não acionava o Button 2.


###############################################################################
# Copyright (c) 2009, 2011 The University of Memphis.  All rights reserved. 
# This program and the accompanying materials are made available 
# under the terms of the LIDA Software Framework Non-Commercial License v1.0 
# which accompanies this distribution, and is available at
# http://ccrg.cs.memphis.edu/assets/papers/2010/LIDA-framework-non-commercial-v1.0.pdf
###############################################################################

#Agent properties
lida.agentdata=configs/basicAgent_ex2.xml
lida.elementfactory.data=configs/factoryData.xml

#Gui properties
lida.gui.panels=configs/guiPanels.properties
lida.gui.commands=configs/guiCommands.properties
lida.gui.enable=true

#Logging properties
lida.logging.configuration=configs/logging.properties

Em seguida foi configurado o "Tick Duration" com o valor 20ms e foi análisado o GuiPanel "PAM table". Essa tabela demonstra o que o agente atualmente percebe com um resultado de suas recentes entradas sensorial. Com isso e com a apresentação dos objetos no ambiente, o panel demonstra as ativações de determinados nós que o agente contém. Com a apresentação do objeto quadrado e de cor vermelha, houve alteração na ativação para 1.0 dos nós "Square" e "Red", já por outro lado, sua ativação decai na presença de outro objeto. Com ativação dos nós "Square" e "Red" outros nós como "Circle" e "Blue" ficam em ativação baixa (0.0) e não mudam os seus valores. A Figura 2 demonstra as situações relatadas anteriormente.

Figura 2 - PAM Table demonstrando ativações dos nós.

Na aba "GlobalWorkspace" GuiPanel, pode-se observer as coalisões atuais no GlobalWorkspace e seus atributos. Logo abaixo apresenta uma tabela histórica das coalisões executadas e seus dados.

Seguindo as implementações do tutorial, é adicionado uma nova GuiPanel que exibe o conteúdo do "CurrentSituationalModel". Isso foi execudo simplemente adicionando uma linha no arquivo "guiPanels.properties". Tomando a declaração "perceptualBufferGraph" como referência, for escrita a novo GuiPanel conforme o código abaixo. Com a execução dessa modificação, o GuiPanel CMS apareceu junto as demais presente na interface conforme a Figura 3. O Panel demonstrou os mesmos nós contidos no Buffer de Percepção.


###############################################################################
# Copyright (c) 2009, 2011 The University of Memphis.  All rights reserved. 
# This program and the accompanying materials are made available 
# under the terms of the LIDA Software Framework Non-Commercial License v1.0 
# which accompanies this distribution, and is available at
# http://ccrg.cs.memphis.edu/assets/papers/2010/LIDA-framework-non-commercial-v1.0.pdf
###############################################################################

# ____Tool Bar____
ToolBar=ToolBar,edu.memphis.ccrg.lida.framework.gui.panels.ControlToolBarPanel,TOOL,1,Y,0,20

# ____A Section____
environ =ButtonEnvironment,myagent.guipanels.ButtonEnvironmentPanel,A,1,Y

# ____B Section____
pamTable = PAM Table,edu.memphis.ccrg.lida.framework.gui.panels.NodeStructureTable,B,0,Y,PerceptualAssociativeMemory
pamGraph = PAM Graph,edu.memphis.ccrg.lida.framework.gui.panels.NodeStructurePanel,B,1,Y,PerceptualAssociativeMemory
activationChart=Activation Chart,edu.memphis.ccrg.lida.framework.gui.panels.ActivationChartPanel,B,2,Y,100,red
perceptualBufferGraph = Perceptual Buffer,edu.memphis.ccrg.lida.framework.gui.panels.NodeStructurePanel,B,3,Y,Workspace.PerceptualBuffer
globalWorkspace = Global Workspace,edu.memphis.ccrg.lida.framework.gui.panels.GlobalWorkspaceTablePanel,B,4,Y,10
proceduralMemory=Procedural Memory,edu.memphis.ccrg.lida.framework.gui.panels.ProceduralMemoryPanel,B,5,Y
actionSelection=Action Selection,edu.memphis.ccrg.lida.framework.gui.panels.ActionSelectionPanel,B,6,Y,5
csm= CSM,edu.memphis.ccrg.lida.framework.gui.panels.NodeStructurePanel,B,3,Y,Workspace.CurrentSituationalModel
# TASK 4 INSERT YOUR CODE HERE ************************
#name = panel title, class name, Position [A,B,C,FLOAT, TOOL], tab order, Refresh after load, parameters

#******************************************************

# ____C Section____
LogPanel=Logging,edu.memphis.ccrg.lida.framework.gui.panels.LoggingPanel,C,1,N, myagent
runningTasks = Running Tasks,edu.memphis.ccrg.lida.framework.gui.panels.FrameworkTaskPanel,C,2,Y, PerceptualAssociativeMemory
taskQueue=Task Queue,edu.memphis.ccrg.lida.framework.gui.panels.TaskQueuePanel,C,3,N
configFiles = Configuration Files,edu.memphis.ccrg.lida.framework.gui.panels.ConfigurationFilesPanel,C,4,N

Figura 3 - CMS Panel.


Basic Agent Exercise 3

Os objetivos para esse exercício sâo:

  • Modificar o arquivo de declaração do agente para adicionar novas funcionalidades.
  • Adicionar um módulo no arquivo xml do agente.
  • Adicionar um listener no arquivo xml do agente.
  • Adicionar detector de características no xml do agente.
  • Adicionar um codelet de atenção no xml do agente.
  • Explorar o arquivo xml do agente.

Na execução dessa tarefa foi feita algumas alterações. No arquivo "lidaConfig.properties" configurou-se a propriedade "lida.agentdata" com o valor "configs/basicAgent_ex3.xml". Foram adicionados um novo módulo chamado "Environment" com classe e alguns parametros como demonstra o código a seguir.


< modules>
....
< module name="Environment">
           < class>myagent.modules.ButtonEnvironment< /class>
           < param name="height" type="int">10< /param>
           < param name="width" type="int">10< /param>
           < taskspawner>defaultTS< /taskspawner>
< /module>
....
< /modules>


Foi validado as alterações no arquivo xml e executada a aplicação. Após as alterações, foi configurado o valor de duração do tick, e consequentimente a aplicação foi executada e iniciada. O ambiente foi apresentado na inteface do programa conforme a configuração proposta. Como resultado da execução, os nós "red" e "squere" receberam ativação, porem o mesmo não aconteceu com os nós "blue" e "circle". Isso aconteceu porque ainda não foi adicionado o detector de características no módulo PAM. Porém os nós "red" e "square" não apareceram no panel "PerceptualBuffer", que é causado justamente porque a comunicação entre PAM e o Workspace não foram definidas. Mesmo que os nós "red" e "square" apresentem os seus respectivos detectores de caracteristicas e estejam presente no "ButtonEnvironment", ambos os nós não aparecem no panel PerceptualBuffer. Portanto, o agente consegue perceber o vermelho e o quadrado, porem não são inseridos no Workspace. Para tal função, um "PamListener" deve ser adicionado.

No arquivo xml do agente foi adicionado um novo listener na lista de listeners, conforme o código demonstrado abaixo.


< listeners>
....
< listener>
            < listenertype>edu.memphis.ccrg.lida.pam.PamListener< /listenertype>
            < modulename>PerceptualAssociativeMemory< /modulename>
            < listenername>Workspace< /listenername>
< /listener> 
.....
< /listeners>

Esta alteração foi salva e aplicação executada. Percebeu-se que os nodes "red" e "square" começaram a aparecer no PerceptualBuffer quando o agente percebe o quadrado vermelho no ambiente e botão "Button 1" foi acionado. Entretanto, o nós "Blue" e "Circle" não aparecem no PerceptualBuffer pois ainda não foi implementado o seu respectivo detector de características. Para tal, foi adicionado o seguinte trecho do código ao módulo "PerceptualAssociativeMemory" na tag "initialTasks".


< initialTasks>
....
 < task name="BlueDetector">
                    < tasktype>ColorDetector< /tasktype>
                    < ticksperrun>3< /ticksperrun>
                    < param name="color" type="int">-16776961< /param>
                    < param name="node" type="string">blue< /param>
 < /task>
 < task name="CircleDetector">
                    < tasktype>ShapeDetector< /tasktype>
                    < ticksperrun>3< /ticksperrun>
                    < param name="area" type="int">31< /param>
                    < param name="backgroundColor" type="int">-1< /param>
                    < param name="node" type="string">circle< /param>
 < /task>

.....
< /initialTasks>

Com as alterações realizadas anteriormente, percebeu-se que os nós "blue" e "circle" começaram a ser percebidos pelo agente e mostrados no PerceptualBuffer. Isso ocorreu porque foram adicionados os detectores de forma "CircleDetector" e o de cor "BlueDetector" que são responsaveis por determina função. Entretanto, o botão "Button 2" não foi acionado. Para isso, necessita adicionar parametros de codelet de atenção para esses nós no GlobalWorkspace. Para que o agente pressione foi adicionado código a baixo.


< task name="BlueCircleCodelet">
                    < tasktype>BasicAttentionCodelet< /tasktype>
                    < ticksperrun>5< /ticksperrun>
                    < param name="nodes" type="string">blue, circle< /param>
                    < param name="refractoryPeriod" type="int">30< /param>
                    < param name="initialActivation" type="double">1.0< /param>
< /task>

Após as alterações, o agente percebeu o forma circulo e da cor azul consequentemente começou a pressionar o botão "Button 2".


Advanced Exercise 1

Este exercício irá executar a aplicação, sem da utilização da interface gráfica e configurar alguns parametros de log. Para isso foi alterado o parametro "lida.gui.enable" para "false" no arquivo xml "lidaConfig.properties" conforme o código abaíxo.


###############################################################################
# Copyright (c) 2009, 2011 The University of Memphis.  All rights reserved. 
# This program and the accompanying materials are made available 
# under the terms of the LIDA Software Framework Non-Commercial License v1.0 
# which accompanies this distribution, and is available at
# http://ccrg.cs.memphis.edu/assets/papers/2010/LIDA-framework-non-commercial-v1.0.pdf
###############################################################################

#Agent properties
lida.agentdata=configs/basicAgent_ex3.xml
lida.elementfactory.data=configs/factoryData.xml

#Gui properties
lida.gui.panels=configs/guiPanels.properties
lida.gui.commands=configs/guiCommands.properties
lida.gui.enable=false

#Logging properties
lida.logging.configuration=configs/logging.properties

Após a alteração foi executada a aplicação, como pode ser notado na Figura 4 o ambiente foi iniciado sem a interface gráfica e com logs da execução das ações do agente.

Figura 4 - Logs das ações do agente no console.

A LIDA apresenta duas maneira de apresentar o log das ações do agente no ambiente, a primeira é atraves de logs no console ou via arquivo. O código abaixo apresenta as duas maneiras, uma ativa(Console) e outra comentada(Arquivo).


....
handlers= java.util.logging.ConsoleHandler
#handlers= java.util.logging.FileHandler
....


Advanced Exercise 2

Neste exercício foi feito uma breve introdução á otimização do parametro "ticksPerRun". Com aplicação executada, configurou-se o "tickDuration" com o valor 10 antes de iniciar a simulação. Com a simulação observou-se várias coalisões com alta ativações no "Global Workspace" quando o quadrado vermelho apareceu no ambiente. Em seguinda, fechou-se a aplicação e realizou-se alterações no arquivo "lidaConfig.properties" e no xml do agente.

  • No arquivo "lidaConfig.properties" configurar agente com xml "basicAgent.xml".
  • Já no arquivo "basicAgent.xml", mais precisamente na declaração "RedSquareCodelet", no módulo de atenção(Attention), alterou-se o parametro "ticksPerRun" para 50 e o parametro "refractoryPeriod" para 300.

As alterações feitas no xml do agente "basicAgent.xml" estão no código fonte abaixo.


....
< task name="RedSquareCodelet">
                    < tasktype>BasicAttentionCodelet< /tasktype>
                    < ticksperrun>50< /ticksperrun>
                    < param name="nodes" type="string">red,square< /param>
                    < param name="refractoryPeriod" type="int">300< /param>
                    < param name="initialActivation" type="double">1.0< /param>
< /task>
....

Com aplicação executada juntamente com simulação do agente, o tempo de duração do agente para reconhecer quadrado vermelho aumentou, isso aconteceu pelo aumento no número de ticks por execução dessa coalisão.


Advanced Exercise 3

Neste exercício o objetivo foi desenvolver capacidade do agente em reconhecer espaço vazio no ambiente. Para isso foi alterado arquivos como: basicAgent.xml e factoryData.xml. Também foi criada a classe WhiteScreenDetector que é resposável por detectar o espaço vazio. No arquivo factoryData.xml foi adicionado task "WhiteScreenDetector", que neste caso foi especificado a classe responsavel por essa tarefa. O código abaixo demonstra a inserção da terafa.


< tasks>
....

< task name="WhiteScreenDetector">
  < class>myagent.featuredetectors.WhiteScreenDetector< /class>
  < ticksperrun>5
  < associatedmodule>SensoryMemory< /associatedmodule>
  < associatedmodule>PerceptualAssociativeMemory< /associatedmodule>
  < param name="area" type="int">40< /param>
  < param name="backgroundColor" type="int">-1< /param>
  < param name="node" type="string">empty< /param>
< /task>

....
< /tasks>


Já no arquivo basicAgent.xml foi adicionado a task "EmptyScreenDetector" no módulo "PerceptualAssociativeMemory" cria um nó dentro do grafo e um parametro no "ProceduralMemory" para realizar a ativação do botão "action.releasePress". O código abaixo demonstra as alterações.


< module name="PerceptualAssociativeMemory">
            < class>edu.memphis.ccrg.lida.pam.PerceptualAssociativeMemoryImpl< /class>
            < param name="pam.Upscale" type="double">.7 < /param>
            < param name="pam.Downscale" type="double">.6 < /param>
            < param name="pam.Selectivity" type="double">.5 < /param>
            < param name="nodes">red,blue,square,circle,empty< /param>
            < taskspawner>defaultTS< /taskspawner>
            < initialTasks>
                < task name="RedDetector">
                    < tasktype>ColorDetector< /tasktype>
                    < ticksperrun>3< /ticksperrun>
                    < param name="color" type="int">-65536< /param>
                    < param name="node" type="string">red< /param>
                < /task>
                < task name="SquareDetector">
                    < tasktype>ShapeDetector< /tasktype>
                    < ticksperrun>3< /ticksperrun>
                    < param name="area" type="int">40< /param>
                    < param name="backgroundColor" type="int">-1< /param>
                    < param name="node" type="string">square< /param>
                < /task>
                < task name="BlueDetector">
                    < tasktype>ColorDetector< /tasktype>
                    < ticksperrun>3
                    < param name="color" type="int">-16776961< /param>
                    < param name="node" type="string">blue< /param>
                
                < task name="CircleDetector">
                    < tasktype>ShapeDetector< /tasktype>
                    < ticksperrun>3< /ticksperrun>
                    < param name="area" type="int">31< /param>
                    < param name="backgroundColor" type="int">-1< /param>
                    < param name="node" type="string">circle< /param>
                
                < task name="EmptyScreenDetector">
                    < tasktype>WhiteScreenDetector< /tasktype>
                    < ticksperrun>3< /ticksperrun>
                    < param name="area" type="int">40< /param>
                    < param name="backgroundColor" type="int">-1< /param>
                    < param name="node" type="string">empty< /param>
                < /task>
               
                
            < /initialTasks>
            < initializerclass>edu.memphis.ccrg.lida.pam.BasicPamInitializer< /initializerclass>
< /module>


< module name="ProceduralMemory">
            < class>edu.memphis.ccrg.lida.proceduralmemory.ProceduralMemoryImpl< /class>
            < param name="proceduralMemory.ticksPerStep" type="int"> 14 < /param>
            < param name="scheme.1">if red square, press 1|(red,square)()|action.pressOne|()()|0.01< /param>
            < param name="scheme.2">if blue circle, press 2|(blue,circle)()|action.pressTwo|()()|0.01< /param>
            < param name="scheme.3">if empty, release press|(empty)()|action.releasePress|()()|0.01< /param>
  	  
            < taskspawner>defaultTS< /taskspawner>
            < initializerclass>edu.memphis.ccrg.lida.proceduralmemory.BasicProceduralMemoryInitializer< /initializerclass>
		
        < /module>

E por fim, segue a implementação da classe "WhiteScreenDetector" que responsável por detectar o espaço vazio.


package myagent.featuredetectors;

import edu.memphis.ccrg.lida.pam.tasks.BasicDetectionAlgorithm;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author emf
 */
public class WhiteScreenDetector extends BasicDetectionAlgorithm {
    private int backgroundColor = 0xFFFFFFFF;
    private Map smParams = new HashMap();
    
    @Override
    public void init() {
       super.init();
       smParams.put("mode","all");
       backgroundColor = (Integer) getParam("backgroundColor", 0xFFFFFFFF);
    }

    @Override
    public double detect() {
        int[] layer = (int[]) sensoryMemory.getSensoryContent("visual",smParams);
        int area=0;
        for(int i=0; i< layer.length; i++){
            if(layer[i] == backgroundColor){
                area++;
            }
        }
        
        if(area == layer.length){
            return 1.0;
        }
        return 0.0;
    }    
}




Tutorial Project II

Neste tutorial irá implementar uma mente artificial em um agente, que é representado por um "heroi" onde está em um ambiente chamado "Hamburger Jungle". Neste ambiente existe um grid (10x10) de posições que podem ser acessiveis ou não, que apresentam objetos (zero ou mais). Os objetos sãO: Um agente, Macacos "Malvados", Arvorés, Rochas, e Hamburgers. Os macacos se movem randomicamente e tentaram causar danos no agente quando os mesmos estiverem na mesma celula. As rochas ocupam um celula por inteiro que impede o uso da mesma. O agente pode sensoriar os objetos que estão na corrente celula e os objetos que estão em sua frente. Ele também pode sensoriar a sua vida, ele pode se mover para frente, girar para esquerda, direita e meia volta, comer e fugir. A vida do agente diminui a uma pequena quantidade de ticks, também quando um macaco o ataca, quando agente tenta se mover para um celula com uma rocha ou tenta sair para fora do grid. Comendo hamburger a vida do agente é incrementada. Para o desenvolvimento desse tutorial foi utilizado o projeto "alifeAgentExercises", que é caregado pelo Netbeans.

Agent Exercise 1

Neste exercício tem por objetivo explorar as funcionalidades do agente ALife agent. Ao explorar a grid na interface do aplicativo, clicando em uma celula com uma rocha mostrou-se o conteúdo da celula ao lado direito. Logo abaixo apresenta os atributos da celula e um "DropDownList" onde o usuário pode selecionar os objetos presente no grid. A interface permite ajustar o tamanho das janelas e zoom do grid para que o usuário possa utilizar da melhor forma. A Figura 5 demonstra a interface da aplicação.

Figura 5 - Inteface do ALifeAgentExercises.

No GuiPanel "PAM Graph", pode-se ver botão "relax" que sua função é espalhar o grafo em diferentes direções para obter uma visão mais clara, juntamente com a função de ZOOM para aproximação e destancia do grafo. Iniciando a simulação, o agente começa navegar pelo ambiente na tentativa de evitar os macacos malvados e explorando quando sua vida está baixa, ou seja, ele come os hamburgers quando ele pode. Clicando sobre o GuiPanel "Task Queue" e parando a simulação, visualizou-se as tarefas que foram escalonadas para rodar durante vários ticks. Já no GuiPanel "Running Task" está a lista de todas tarefas ativas e seus respectivos dados.



ALife Agent Exercise 2

Neste exercicio tem por objetivo como:

  • Criar uma classe detectora de característica.
  • Adicionar uma "task" de definição para o arquivo "factoryData.xml".
  • Adicionar uma "task" de declaração para o arquivo xml do agent.
  • Adicionar uma nova "task" de declaração para o arquivo xml baseado em um existente.

Para a execução desse exercício realizou-se alguns alterações no arquivo "lidaConfig.properties" alterando a propriedade "lida.agentdata" para "configs/alifeAgent_ex2.xml" e também no arquivo "objects.properties" alterou-se a propriedade "food" no argumento "QTY" com o valor 0. Executando a aplicação e iniciando a simulação, no "DropDownList" selecionou-se o agente, assim pode-se visualizar a vida do agente e seus comportamentos. Quando o agente atinge baixo nível de vida (inferior a 0.33), o mesmo começa a falhar em sua movimentação no ambiente. A Figura 6 demonstra a execução e simulação do aplicativo.

Figura 6 - Execução das alterações realizadas.

Para tratar essa possibilidade foi implementada a classe "BadHealthDetector" justamente para detectar esse baixos níveis de vida, conforme o código abaixo. Outra modificação foi adicionar a task "BadHealthDetector" na tag "" no arquivo "factoryData.xml". Essa modificação faz com o que a LIDA consiga realiza a ativação para essa task. Os códigos abaixo demonstra a classe implementada e alteração no "factoryData.xml".


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package alifeagent.featuredetectors;

import edu.memphis.ccrg.lida.pam.tasks.BasicDetectionAlgorithm;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author emf
 */
public class BadHealthDetector extends BasicDetectionAlgorithm {

    private final String modality = "";
    private Map detectorParams = new HashMap();

    @Override
    public void init() {
        super.init();
        detectorParams.put("mode", "health");
    }

    @Override
    public double detect() {
        double healthValue = (Double) sensoryMemory.getSensoryContent(modality, detectorParams);
        double activation = 0.0;
        if (healthValue < 0.33) {
            activation = 1.0;
        }
        return activation;
    }
    
}



....
< task name="BadHealthDetector">
            < class>alifeagent.featuredetectors.BadHealthDetector< /class>
            < ticksperrun>3< /ticksperrun>
            < associatedmodule>SensoryMemory< /associatedmodule>
            < associatedmodule>PerceptualAssociativeMemory< /associatedmodule>
< /task>
....

Já no arquivo xml do agente(alifeAgent_ex2.xml), mais precisamente no módulo "PerceptualAssociativeMemory" na tag "" foi adicionado a task "BadHealthDetector" conforme o código abaixo. Essa adição configura algumas propriedades do "BadHealthDetector" como por exemplo o tempo de execução (ticks per run).


....
< task name="BadHealthDetector">
            < class>alifeagent.featuredetectors.BadHealthDetector< /class>
            < ticksperrun>3< /ticksperrun>
            < associatedmodule>SensoryMemory< /associatedmodule>
            < associatedmodule>PerceptualAssociativeMemory< /associatedmodule>           
< /task>
....

Também foi adicionado a task "predatorFrontDetector" no arquivo do agente. Para essa task não necessitou criar uma classe de implementação, pois essa task é oposta a task "predatorOriginDetector", ou seja, a ativação da task "predatorOriginDetector" é em 0(zero) e da "predatorFrontDetector" é 1(um). O código abaixo demonstra a alteração no arquivo do agente.


....
< 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>
....

Salvando os arquivos alterados e executando a aplicação, o agente apresenta duas novos detectores de caracteristicas e consequentemente duas novas capacidades perceptivas. Tendo em vista o comportamento do agente, agora ele pode detectar o baixo nível de vida e começa a se movimentar. Também o agente foge dos macados malvados quando eles estão em sua frente.



ALife Agent Exercise 3

Este exercício tem por objetivos como:

  • Criar e modificar codelets de atenção.
  • Aprender os efeitos de mudança dos parametros do codelet de atenção.

Primeiramente, foi configurado no "lidaConfig.properties" o parametro "lida.agentdata" para "configs/alifeAgent_ex3.xml", outra modificação foi voltar a configuração de comida para 10 no arquivo "objects.properties" na properidade "QTY" em "foods". Salvando as alterações, e executando a aplicação notou-se que o agente não reage aos predadores.

Como primeira tarefa foi criar a task "predatorAttentionCodelet" no módulo "AttentionCodelet" do arquivo xml do agente, que permitirá que o agente consiga reagir a presença dos macacos. O código abaixo demonstra a alteração.


....
< 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>
....

No mesmo arquivo, alterou-se no parametro "initialActivation" para 0.01 do "FoodAttentionCodelet", conforme o código abaixo. Executou-se a simulação e o agente parou de ir em direção a comida quando o seu nível de ativação deste codelet de atenção esta nível muito baixo.


....
< task name="FoodAttentionCodelet">
                    < tasktype>NeighborhoodAttentionCodelet< /tasktype>
                    < ticksperrun>5< /ticksperrun>
                    < param name="nodes" type="string">food< /param>
                    < param name="refractoryPeriod" type="int">50< /param>
                    < param name="initialActivation" type="double">0.01< /param>
< /task>
....

Novamente, retornou os parametros do "FoodAttentionCodelet" para o padrão, em contra partida no "GoodHealthAttentionCodelet" alterou-se o parametro "refractoryPariod" para 10, conforme o código abaixo. Executando a aplicação novamente com a duração do tick 40 ms notou-se que as coalizões para o "goodHealth" aconteceram mais frequentemente.


....
< task name="GoodHealthAttentionCodelet">
                    < tasktype>NeighborhoodAttentionCodelet< /tasktype>
                    5
                    < param name="nodes" type="string">goodHealth< /param>
                    < param name="refractoryPeriod" type="int">10< /param>
                    < param name="initialActivation" type="double">0.10< /param>
< /task>
....



ALife Agent Exercise 4

Os objetivos deste exercício são:

  • Modificar esquemas na Memória Procedural.
  • Usar um inicializador customizado para a Memória Associativa Perceptiva.
  • Obter estratégia de decremento não padroniza para o ElementFactory.

Neste exercício foi configurado o arquivo "lidaConfig.properties" com "configs/alifeAgent_ex4.xml" na propriedade "lida.agentdata". Executando a aplicação percebe-se que o agente não se move se sua vida for abaixo de 0.66. A alteração inicial foi realizada no arquivo xml do agente "alifeAgent_ex4.xml", no módulo "ProceduralMemory". No parametro "scheme.10b" configurou-se o "action name" para "action.moveAgent" no segundo "pipe"(|). Com o arquivo salvo executou-se a aplicação e agente se moveu quando seu nível de vida estava alto. Segue o código da alteração.


....
< param name="scheme.10b">if emptyFront turn around|(emptyFront)()|action.moveAgent |()()  |0.1< /param>	
....

Agora para obter uma classe inicializadora customizada, foi necessario configurar o módulo "PerceptualAssociativeMemory" com "CustomPamInitializer" que será implementada. Nela foi desenvolvido a obtenção do nó "food" do PAM e liga-lo ao objeto, a consequencia disso é que quando a comida for percebida acarretará ativação do objeto ligados a ele. Com isso, implementou-se a estratégia de decaimento personalizada para este objeto, que decai mais lentamente do que os de mais. Segue o código da classe "CustomPamInitializer".


package alifeagent.initializers;

import edu.memphis.ccrg.lida.framework.Agent;
import edu.memphis.ccrg.lida.framework.initialization.FullyInitializable;
import edu.memphis.ccrg.lida.framework.shared.ElementFactory;
import edu.memphis.ccrg.lida.framework.shared.Node;
import edu.memphis.ccrg.lida.framework.strategies.DecayStrategy;
import edu.memphis.ccrg.lida.pam.BasicPamInitializer;
import edu.memphis.ccrg.lida.pam.PerceptualAssociativeMemory;
import edu.memphis.ccrg.lida.pam.PerceptualAssociativeMemoryImpl;
import java.util.Map;

public class CustomPamInitializerSolution extends BasicPamInitializer{
    
    @Override
    public void initModule(FullyInitializable module, Agent agent, Map params) {
        super.initModule(module, agent, params);
        PerceptualAssociativeMemory pam = (PerceptualAssociativeMemory) module;
        
        // Obtains the ElementFactory
        ElementFactory factory = ElementFactory.getInstance();
        
        // Creates a new Node in PAM labeled 'object'
        Node objectNode = pam.addDefaultNode(factory.getNode("PamNodeImpl", "object"));
        
        // Obtains the 'rock' node from PAM
        Node child = pam.getNode("rock"); 
        
        //  Adds a Link in PAM from 'rock' to 'object' with link category PARENT
        pam.addDefaultLink(factory.getLink(child, objectNode, PerceptualAssociativeMemoryImpl.PARENT));

        //  Adds a Link in PAM from 'food' to 'object' with link category PARENT
        child = pam.getNode("food");        
        pam.addDefaultLink(factory.getLink(child, objectNode, PerceptualAssociativeMemoryImpl.PARENT));
        
        // Task 3: INSERT YOUR CODE HERE **************************
        DecayStrategy decayStrategy = factory.getDecayStrategy("slowDecay");
        objectNode.setDecayStrategy(decayStrategy);
        
    }
}




Advanced Exercise 1

O agente não faz nada quando encontra uma arvore, neste exercício a idéia é que quando o agente estiver na celula da arvore o mesmo esteja protegido dos macacos malvados. Para isso necessitou adicionar um codelet de atenção para movimentar o agente para dentro da árvore e isso aconteceu no módulo "AttentionModule", juntamente com a criação de uma nova estratégia "schema.11" no módulo de "ProceduralMemory". Isso pode ser visto conforme o código abaixo.


....
< task name="TreeFrontAttentionCodelet">
			< tasktype>NeighborhoodAttentionCodelet< /tasktype>
			< ticksperrun>5< /ticksperrun>
			< param name="nodes" type="string">tree< /param>
			< param name="refractoryPeriod" type="int">50< /param>
			< param name="initialActivation" type="double">1.0< /param>
< /task>
....


< param name="scheme.11">move forward if treeFront |(treeFront)()|action.moveAgent |()()  |0.1< /param>



Advanced Exercise 2

Neste exercício o objetivo é criar uma classe customizada de seleção de ação, tomou-se por base o que é existente. Portanto, o arquivo "alifeAgent.xml" deve ser alterado adicionando uma nova declaração de listener que é um "BroadcasListener" do "GlobalWorkspace". Com as configurações a seguir pode desenvolver uma classe básica de seleção de ação.


< module name="ActionSelection">
            < class>alifeagent.modules.featuredetectors.CustomAction< /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>

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer