You are here

Lida

Atividade 1
Faça o download com o tutorial prático do LIDA aqui. Se você fez o download da arquitetura LIDA na aula passada, é possível que esse mesmo arquivo lhe tenha sido enviado por e-mail. Nesse caso, utilize a versão mais recente do mesmo, que é a que lhe foi enviada. Abra o arquivo zip e o instale em sua máquina. Verifique a árvore de diretórios, com os arquivos instalados, para os dois exemplos que estudaremos na aula de hoje, o exercício básico e o exercício de Artificial Life. Observe principalmente o arquivo LIDA-Tutorial-Exercises.pdf, que contém o roteiro dos exercícios que seguiremos na aula de hoje.
 
 
Download ok: 
Árvore de diretórios:
 
 
Informações adicionais sobre a estrutura de diretório pode ser encontrada no readme do lida.
 
Execução do exemplo ALifeAgent1.2:
 
O arquivo LIDA-Tutorial-Exercises.pdf  é a referência para do Exercício básico e  Exercício de Artificial Life. É possível verificar que todas as “STUDY QUESTION “ estão respondidas no apêndice do tutorial.
Importação dos projetos no netbeans.
 
Atividade 2 – Tutorial Project I
 
 
Basic Agent Exercise
0 – Objetivo: Exploração Funcionl, Agente Básico
Verificou-se as classes do projeto e os arquivos de configuração.
 
Estrutura de pacotes e classes do projeto
Estrutura do basicAgentExercises
 
Arquivos de configuração
 
A configuração do projeto ao agente básico é lida.agentdata=configs/basicAgent.xml do arquivo LidaConfig.properties. Sendo que a definição deste agente é descrita no xml basicAgent.xml
1- Objetivo:  Familiarização da GUI do framework: Tool Bar, Button Environment, Logging, Arquivos de configurações e painel de interface
Task 1: Identificar a barra de ferramentas e pressionar o botão start/stop  Analisar, também, o campo tick e como ele avança na simulação.
 
Tool bar:
 
Pressionando Start/Pause
 
PAM Table
 
 
 
 
Task 2: Rodar via Step Mode e atribuir valor ao tick
Ao selecionar o “step mode” e pressionar  o botão “run tick” a aplicação irá executar a quantidade de “tick” atribuído.
 
Task 3: Controlar o  tempo de cada tick pelo campo “Tick duration (ms)”. 
Quanto maior o valor, maior será o tempo de execução (ou duração do tick corrent). Foram feitas execução para “tick duration” igual a 20 e igual a 0.  Foi observado um intervalo de 20ms entre os ticks, já para 0, não foi observado intervalo.
 
Task 4: Filtros e nível de log. 
Pode-se observar perda de desempenho durante a execução quando o nível de log extiver configurado para mais baixo. Filtro: “Logger”  e  Nível de Log em “Logging Level”
 
 
Task 5:  Aba “Configuration Files”.
Esta aba monstra o conteúdo do arquivo LidaConfig.properties. Cada chave deste arquivo aponta para outros arquivos de propriedades.
 
2 – Objetivo: Familiarização com a funcionalidade de detecção,  interação de código, estudo da GUIPanel ( PAM table, Perceptual Buffer e GlobalWorkspace) , personalização da GUI e  o espaço de trabalho do modelo situacional corrente.
A preparação consiste em alterar o valor da propriedade  lida.agentdata do arquivo LidaConfig.properties.
Task 1:  PAM table - Verificação dos nós square, red, circle e blue.
O nós “square” e “red” tem sensores, enquanto que os nós circle e blue ainda não tem sendores. Isso é observado com alteração de valores da “current action” na PAM table. Os nós que tem sensores apresentam variação no valor de “current action”,.
 
Task 2:  Perceptual Buffer 
O que causa o painel ficar vazio? 
Nesta área, as instâncias de nós que tem sensores aparecem, caso contrário, o painel fica vazio. Ao passar com o mouse em cima das instâncias, é possível observar o  id e valor de ativação.  
 
  Qual o módulo do Lida Model é Perceptual Buffer? Workspace
De onde vem os nós deste buffer? PAM
Como eles diferem dos nós de outros módulos? Pelo id 
 
Task 3: GlobalWorkspace 
É possível observar a aliança atual e o histórico de alianças.
 
De onde vem as alianças de GlobalWorkSpace? Workspace
Para onde elas as alianças de GlobalWorkSapce vão? Listeners
 
 
Task 4: Personalização da GUI
Ao adicionar a linha abaixo no guiPanels.properties, uma nova aba será adicionada à interface gráfica do LIDA. Essa linha é baseada na linha da propriedade perceptualBufferGraph. Foram feitas alterações em name, panel title, tab order e parameters.
csm = CSM,edu.memphis.ccrg.lida.framework.gui.panels.NodeStructurePanel,B,7,Y,Workspace.CurrentSituationalModel 
 #name = panel title, class name, Position [A,B,C,FLOAT, TOOL], tab order, Refresh after load, parameters
 
 
 
Como  os conteúdo de CSM (Current Situational Model) relaciona-se com o de Perceptual Buffer?Os nós de ambos vem do  PAM
E do conteúdo do PAM? O conteúdo de CSM vem do buffer percentua por meio do PAM.
 
 
3 - Objetivo: Exploração do arquivo xml de agente. Modificar a declaração do arquivo do agente. Adicionar as seguintes declarações : agente, listener, detectores, attention codelet.
A preparação consiste em alterar o valor da propriedade  lida.agentdata do arquivo LidaConfig.properties.
lida.agentdata=configs/basicAgent_ex3.xml
Task 1:
Abrir basicAgent_ex3.xml
Task 2:
Adicionar submodule com as seguintes informações:
name:Environment
class:myagent.modules.ButtonEnvironment
Param1: name=”height” type=”int”, tag value is 10
Param2:name=”width” type=”int”, tag value is 10
taskspawner: defaultTS
 
Segue o conteúdo do trecho adicionado no xml:
 
     <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>
Resultado: “Button environment” adicionado. Sem este módulo red square e blue square não aparecem na aba “ButtonEnvironment”
Task 3:
Adicionar Listener para a conexão entre PAM e Workspace com as seguintes informações:
  listenertype:edu.memphis.ccrg.lida.pam.PamListener
modulename:PerceptualAssociativeMemory
listenername:Workspace
Segue o conteúdo do trecho adicionado ao xml:
<listener>
            <listenertype>edu.memphis.ccrg.lida.pam.PamListener</listenertype>
            <modulename>PerceptualAssociativeMemory</modulename>
            <listenername>Workspace</listenername>
        </listener>
Resultado: Conexão entre PAM e Workspace é realizada.
Task 4:
Adicionar ColorDetector para “blue” com as seguintes informações:
name:blueDetector
tasktype:ColorDetector
ticksperrun:3
Parameter 1: name=”color” type=”int”,tag value is -16776961
Parameter 2: name=”node” type=”string”,tag value is blue
Segue o conteúdo do trecho adicionado ao xml:
 
 
<task name="BlueDetector">
                    <tasktype>ColorDetector</tasktype>
                    <ticksperrun>3</ticksperrun>
                    <param name="color" type="int">-16776961</param>
                    <param name="node" type="string">blue</param>
                </task>
Resultado: O nó azul é detectado e instanciado.
Task 5:
Adicionar ShapeDetector para “Circle” com as seguintes informações:
name: circleDetector
tasktype:ShapeDetector
ticksperrun:3
Parameter1: name=”area” type=”int”, tag value is 31
Parameter2: name=”backgroundColor” type=”int”, tag value is -1
Parameter3: name=”node” type=”string”, tag value is circle
Segue o conteúdo do trecho adicionado no xml:
<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>
   Resultado: o nó “circle” é detectado e instanciado
Task 6:
Adicionar BasicAttentionCodelet para “blue circle” com as seguintes informações:
name:blueCircleCodelet
tasktype:BasicAttentionCodelet
ticksperrun:5
Parameter1:name=”nodes” type=”string”, tag value is blue,circle
Parameter2: name=”refractoryPeriod” type=”int”,tag value is 30
Parameter3:name=”initialActivation” type=”double”, tag value is 1.0
 
Segue o conteúdo do trecho adicionado no xml:
<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>
Resultado: Agente passa a pressionar botão 2
Opcional: Análise pacote myagent.featuredetectors
Este pacote contém as classes ColorFeatureDetector e ShapeFeatureDetector. Ambas as classes estendem BasicDetectionAlgorithm e coletam valorer do sensor visual. ColorFeatureDetector utiliza parâmetro “color” e    ShapeFeatureDetector utiliza parâmetro “area” para coletar as informações apropriadas de cada FeatureDetector.
 
Advanced Exercise
1 – Logging & GUI Configuration
Logging: os parâmetros de log estão configurados em  logging.properties, para customizar basta fazer alterações nos valores das propriedades.
O arquivo lidaConfig.properties aponta para o arquivo de configuração de log (lida.logging.configuration=configs/logging.properties ). . 
GUI configuration: ao configurar a propriedade lida.gui.enable=false do arquivo lidaConfig.properties, o framework lida é executado sem a interface do usuário.
2 – Ajuste do parâmetro ticksPerRun
A preparação consiste em definir a propriedade lida.agentdata -do arquico lidaConfig.properties-para basicAgent.xml, Alterar os valored de initialtasks de RedSquareCodelet do ticksPerRun para 50 e refractoryPeriod 300. 
Ao executar a aplicação, configurar tickDuration para 10
Resultado: Menos aliança quando “red square” aparece.
 
3 -  Criar uma feature detector class, adicionar  codelet de atenção e esquema para o arquivo de declação de xml do agente.
 
- Criar feature detector para detectação de janela branca.
Foi criada no pacote myagent.featuredetectors  uma classe chamada WhiteScreenFeatureDetector que estende BasicDetectionAlgorithm.
O  código é baseado no ShapeFeatureDetector, pois este já identifica o fundo branco.
 
Adicionar o feature detector em factoryData.xml
<task name="WhiteScreenFeatureDetector">
<class>myagent.featuredetectors.WhiteScreenFeatureDetector</class>
<ticksperrun>5</ticksperrun>
<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>
Adicionar nó empty em  PerceptualAssociativeMemory
<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>
 
Definir task para codlet de atenção
<task name="EmptyCodelet">
                    <tasktype>BasicAttentionCodelet</tasktype>
                    <ticksperrun>5</ticksperrun>
                    <param name="nodes" type="string">empty</param>
                    <param name="refractoryPeriod" type="int">30</param>
                    <param name="initialActivation" type="double">1.0</param>
                </task>
 
- Adicionar parâmetro para empty em ProceduralMemory
<param name="scheme.3">if empty, release press|(empty)()|action.releasePress|()()|0.01</param>
 
Adicionar parâmetro para empty em  SensoryMotorMemory (basta descomentar)
<param name="smm.3">action.releasePress,algorithm.releasePress</param>
 
Quando a tela ficar em branco o agente irá executar a ação releasePress.
 
 
Atividade 3 – Tutorial Project II
 
 
Agent Exercise 1 - Objetivo: Exploração Funcional, Agente Básico
 
Task 1
 
 
 
 
Comparar a GUI de alifeagent com a de basicagent. Quais as diferenças entre a GUI do alifegent e basicagent e por que são diferentes?
As diferenças podem ser observadas em guiPanels.properties. Além disso, o basicagent carrega o panel ButtonEnvironmentPanel e o CSM adicionado no tutorial um. O alifeAgent carrega o AlifeGuiPanel. 
 
Task 2
 
 
 
Task 3
 
 
ALIfe Agent Exercise 2 – Objetivo: Criar classe de feature detector, adicionar uma task em factoryData.xml e adicionar a declaração da task no arquivo do agente
A preparação consiste em alterar o valor da propriedade  lida.agentdata do arquivo LidaConfig.properties  (lida.agentdata=configs/alifeAgent_ex2.xml). Em objects.properties alterar o valor de QTY da propriedade food para 0 (food=0,-1,-1,8,10,1.0,edu.memphis.ccrg.alife.elements.ALifeObjectImpl)
 
Task 0:
Rodar a aplicação e verificar o “health” do agente.
 
Task 1:
Criar classe BadHealthDetector. Esta classe é baseada na GoodHealthDetector, a única alteração é na condição do if. Segue a condição de  BadHealthDetector:
 if (healthValue <= 0.33) {
            activation = 1.0;
        }
Task 2 :
Adicionar a task BadHealthDetector em  factoryData.xml
 
 <task name="BadHealthDetector">
            <class>alifeagent.featuredetectors.BadHealthDetector</class>
            <ticksperrun>3</ticksperrun>
            <associatedmodule>SensoryMemory</associatedmodule>
            <associatedmodule>PerceptualAssociativeMemory</associatedmodule>
        </task>
 
Task 3:
Adicionar a declaração da task  para o BadHealthDetector do módulo PerceptualAssociativeMemory do agente.
  <task name="BadHealthDetector">
                    <tasktype>BadHealthDetector</tasktype>
                    <ticksperrun>3</ticksperrun>
                    <param name="node" type="string">badHealth</param>
                </task>
Task 4: 
Adicionar predatorFrontDetector em  PerceptualAssociativeMemory
  <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>
 
 
 
Após aplicação dos passos acima, o agente tem duas novas funcionalidades de detecção e capacidade de percepção. Quando o agente tem BadHealth, deve se movimentar e quando o agente também   fugir do predador quanto este estiver a sua frente.
 
Por que o agente muda seu comportamento dessa maneira após adicionar os novos detectores? 
O agente já tinha o esquema na ProceduralMemory para responder a BadHealth e predadores. Quando as novas capacidades de percepção foram adicionada, o agente passou a utilizar os esquemas apropriadamente.
 
ALIfe Agent Exercise 3 – Objetivo: Criar e modificar codlets de atenção. Aprender os efeitos de mudança dos parâmetros do codlet de atenção.
A preparação consiste em alterar o valor da propriedade  lida.agentdata do arquivo LidaConfig.properties  (lida.agentdata=configs/alifeAgent_ex3.xml). Em objects.properties alterar o valor de QTY da propriedade food para 10 (food=10,-1,-1,8,10,1.0,edu.memphis.ccrg.alife.elements.ALifeObjectImpl)
 
Task 0: 
Rodar a aplicação
Quais são as possíveis razões para o agente não fugir? O agente não tem codlet de atenção para o predador e, por isso, ele não presta atenção em predador.
Task 1:
Criar em AttentionCodelet uma task para predatorAttentionCodelet
name:PredatorAttentionCodelet
tasktype: NeighborhoodAttentionCodelet
ticksPerRun: 5 
nodes: predator
refractoryPeriod:50
initialActivation:1.0
 <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>
 
O que isto afeta a cognição e o comportamento do agente?
O agente pode trazer o conceito de um predador para a consciência e agir apropriadamente.
 
Task 2:
Alterar o parâmentro initialActivation de FoodAttentionCodelet para 0.01.
Como este parâmetro altera a cognição do agente?
O agente fica menos interassado em comida e com menor probabilidade de perceber comida.
 
 <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>
Task 3:
<task name="GoodHealthAttentionCodelet">
                    <tasktype>NeighborhoodAttentionCodelet</tasktype>
                    <ticksperrun>5</ticksperrun>
                    <param name="nodes" type="string">goodHealth</param>
                    <param name="refractoryPeriod" type="int">10</param>
                    <param name="initialActivation" type="double">0.10</param>
                </task>
A frequência de aliança aumenta de acordo com a diminuição do valor de refractoryPeriod
 
 
ALIfe Agent Exercise 4 – Objetivo: Modificar esquemas em ProceduralMemory, Uso de Inicializador personalizado para o módulo de Percepção Associativa da Memória e obter uma estratégia de decaimento não padrão para ElementFactory
 
A preparação consiste em alterar o valor da propriedade  lida.agentdata do arquivo LidaConfig.properties  (lida.agentdata=configs/alifeAgent_ex4.xml)
Task 0:
Ao rodar,  verifica-se que o agente não se move  enquanto o predador não se aproximar ou o nível de saúde cair para abaixo de 0.66.
Task 1:
Alterar de  <param name="scheme.10b">if emptyFront turn around|(emptyFront)()|action.turnAround|()()  |0.1</param>
para 
<param name="scheme.10b">if emptyFront move ahead|(emptyFront)()|action.moveAgent|()()  |0.1</param>    
Task 2:
Customizar a inicialização de alguns elementos do PAM. Com o intuito de obter elemento com estratégias não default, um Initializer é necessário. Para criar o Initializer personalizado o initializerclass do módulo PerceptualAssociativeMemory.
Segue exemplo:
 
Alterar de <initializerclass>edu.memphis.ccrg.lida.pam.BasicPamInitializer</initializerclass>
para   <initializerclass>alifeagent.initializers.CustomPamInitializer</initializerclass>
O CustomPamInitializer permitirá o agente em adicionar nós personalizador e ligações para PAM, o qual não é possível com mo uso do inicializador default.
 
Criação da ligação PAM de food para objeto
  child = pam.getNode("food");        
   pam.addDefaultLink(factory.getLink(child, objectNode, PerceptualAssociativeMemoryImpl.PARENT));
 
Task 3:
Adicionar estratégia de decaimento para o nó do objeto em CustomPamInitializer. Esta estratégia está cadastrada em factoryData.xml
 
 DecayStrategy decayStrategy = factory.getDecayStrategy("slowDecay");
 objectNode.setDecayStrategy(decayStrategy);
 
Com essa estratégia é possível observar que o a ativação do objeto fica em 1 por um período maior de tempo e seu decaimento é mais devagar em comparação aos outros nós.
 
 
Advanced Exercise 1
O agente ainda não tem reação quando se depara com uma árvore. O objetivo é que o agente consiga se proteger do predador utlizando a árvore.
Para que se tenha reação quando se deparar com uma árvore, deve-se adicionar um novo codlet de atenção para o nó tree (árvore) e um novo esquema para Procedural Memory com o contexto treeFront node e ação action.moveAgent .  
Attention Codlet:
 <task name="TreeAttentionCodelet">
                    <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">0.7</param>
                </task>
Novo esquema:
<param name="scheme.11">if treeFront turn around|(treeFront)()|action.moveAgent |()()  |0.1</param>
 
 
 
 
 
 
Advanced Exercise 2
 
Visto que o módulo de Seleção de Ação (Action Selection ) é muito simples, deve-se criar uma nova classe que representa um Action Selection, a qual deverá estender FrameworkModuleImpl e implementar as interfaces ActionSelection e BroadcastListener. Além disso, será necessário declarar um novo listener no arquivo de xml do agente em que ActionSelection é um BroadcastListener do GlobalWorkspace.
 
Classe criada:
public class BehaviorActionSelection  extends FrameworkModuleImpl implements ActionSelection, BroadcastListener
 
Declarações no xml:
ActionSelection alterado de
 <module name="ActionSelection">
            <class>edu.memphis.ccrg.lida.actionselection.BasicActionSelection</class>
            <param name="actionSelection.ticksPerStep" type="int"> 10</param>
            <taskspawner>defaultTS</taskspawner>
        </module>
 
Para 
 <module name="ActionSelection">
            <class>alifeagent.actionselection.BehaviorActionSelection</class>
            <param name="actionSelection.ticksPerStep" type="int"> 10</param>
            <taskspawner>defaultTS</taskspawner>
        </module>
Listener adicionado:
<listener>
      <listenertype>alifeagent.actionselection.BehaviorActionSelection</listenertype>
      <modulename>GlobalWorkspace</modulename>
      <listenername>ActionSelection</listenername>
</listener>
 
BehaviorActionSelection pendente de implementação:
 
    public void decayModule(long ticks) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
 
    public void addActionSelectionListener(ActionSelectionListener listener) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
 
    public void addPreafferenceListener(PreafferenceListener listener) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
 
    public Action selectAction() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
 
    public void receiveBroadcast(BroadcastContent bc) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
 
    public void learn(BroadcastContent bc) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
 
 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer