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