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.
Foi feito o download do Framework da Arquitetura Cognitiva LIDA, juntamente com manual, tutoriais e exemplos de utilização.
Segue as análises e execuções dos tutoriais do LIDA.
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:
Este exercício tem por objetivo como:
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.
Este execício tem por objetivo como:
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.
Os objetivos para esse exercício sâo:
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".
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
....
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.
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.
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;
}
}
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.
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.
Neste exercicio tem por objetivo como:
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 "
/*
* 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 "
....
< 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.
Este exercício tem por objetivos como:
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>
....
Os objetivos deste exercício são:
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);
}
}
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>
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