Esse exercício foi proposto com o intuito de explorar o ambiente do basicAgentExercises.
Essa é a estrutura do projeto no modo Project view do NetBeans
Essa é a estrutura do projeto no modo Files view do NetBeans
Esse exercicio foi proposto para se familiarizar com a interface do framework.
O software pressiona o "botão 1" quando observa um quadrado vermelho ou o "botão 2" quando observa um circulo azul.
Abaixo uma imagem da interface do framework.
O printscreen abaixo mostra uma configuração de logging do ambiente registrando as atividades de seleção dos botões.
A tela abaixo mostra os ConfigurationsFiles.
A tela abaixo mostra a configuração inicial para realizar este exercício. Utilizando esta configuração o agente não pressiona mais o botão 2.
A tela abaixo mostra o PerceptualBuffer.
A tela abaixo mostra o GlobalWorkspace
Foi alterado uma linha de código para:
csm = CSM,edu.memphis.ccrg.lida.framework.gui.panels.NodeStructurePanel,B,7,Y,Workspace.CurrentSituationalModel
A seguinte tela foi observada:
Esse exercicio tem como objetivo realizar melhorias de funcionalidades do agente.
A tela abaixo mostra as configurações iniciais para realização deste exercício
O diagrama abaixo representa os elementos do Framework. As partes que estão marcadas com a linha pontilhada representa os elementos que serão adicionados no agente durante a realização deste exercício.
O arquivo "basicAgent_ex3.xml" utilizado vem como default faltando alguns elementos. Foi adicionado as partes que estavam faltando e outras novas, como a feature detector e attention codelet.
Foi adicionado no XML o seguinte trecho:
<module name="Environment"> <class>emyagent.modules.ButtonEnvironment</class> <param name="height" type="int"> 10</param> <param name="width" type="int"> 10</param> <taskspawner>defaultTS</taskspawner> </module>
O agente detecta apenas quadrados vermelhos.
Depois foi adicionado no XML o seguinte trecho:
<listener> <listenertype>edu.memphis.ccrg.lida.pam.PamListener</listenertype> <modulename>PerceptualAssociativeMemory</modulename> <listenername>Workspace</listenername> </listener>
Agora o PercepturalBuffer do agente passa a mostar vermelho e azul quando ele percebe um "quadrado vermelho" no ambiente.
Na sequencia foi implementando detectores para "blueDetector" e "circleDetector".
<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>
Depois foi adicionado o seguinte trecho de código para que o agente possa ser capaz de acionar os botões "1" e "2", conforme a necessidade.
<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>
As funcionalidades que foram implementadas aqui de detecção de "shape" e "color" estão implementadas na seguinte classe em Java:
Esse exercicio é usado para demonstrar como podemos rodar o framework do LIDA sem uma interface gráfica. Para isso, basta realizar a seguinte alteração no arquivo lidaConfig.properties e alterar a propriedade lida.gui.enable para false, conforme mostrado abaixo.
lida.gui.enable=false
O logging também pode ser gerado de forma opcional pelo via Console ou utilizando os mecanismos de logging do Java (java.util.logging).
Esse exercicio é usado para demonstrar os efeitos do parametro ticksPerRun.
Primeiro foi setado o tickDuration para 10. Na simulação houve várias coalizões.
Na sequencia foram alterados o ticksperrun para 50 e o refractoryPeriod para 300, conforme mostrado 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>
O número de coalizões observado no GlobalWorkspace foi reduzido assim como as coalizões que ocorrem em broadcast.
Esse exercicio é proposto para criar uma feature para detectar quando a tela está branca.
Foi adicionado a seguinte Feature para detecção da Tela Branca:
public class WhiteScreenFeatureDetector extends BasicDetectionAlgorithm { public static final int TOLERANCE = 5; /* * Size of the shape in pixels. */ private int soughtArea = 1000; /* * The white background color should not be counted in determined the number of pixels in the shape */ private int backgroundColor = 0xFFFFFFFF; private Map<String, Object> smParams = new HashMap<String, Object>(); int white = 0xFFFFFFFF; /* * The square in the environment is 20x20 = 400 pixels. Thus it takes up ~40% of the area. * The circle has radius = 10 so its area ~= 314 pixels. Thus it takes up ~31% of the area. */ @Override public void init() { super.init(); smParams.put("mode","all"); soughtArea = (Integer) getParam("area", 1000); 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]== white){ area++; } } area=(area*1000)/layer.length; if(Math.abs(area-soughtArea) < TOLERANCE){ return 1.0; } return 0.0; } }
Depois foi incluido a Task abaixo no arquivo factoryData.xml com um node "empty".
<task name="WhiteScreenDetector"> <class>myagent.featuredetectors.ShapeFeatureDetector</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>
Foi adicionado na memoria procedural o seguinte código:
<param name="scheme.3">if empty, release press|(white,empty)()|action.releasePress|()()|0.01</param>
Depois disso foi removido o comentário da linha marcada abaixo:
module name="SensoryMotorMemory">
<class>edu.memphis.ccrg.lida.sensorymotormemory.BasicSensoryMotorMemory</class>
<associatedmodule>Environment</associatedmodule>
<param name="smm.1">action.pressOne,algorithm.press1</param>
<param name="smm.2">action.pressTwo,algorithm.press2</param>
<param name="smm.3">action.releasePress,algorithm.releasePress</param>
<taskspawner>defaultTS</taskspawner> <initializerclass>edu.memphis.ccrg.lida.sensorymotormemory.BasicSensoryMotorMemoryInitializer</initializerclass>
</module>
Como resultado, foi possível observar o acionamento na memória procedural
Esse exercicio é realizado simulando um determinado mundo que está dividido em um grid de 10 x10.
Em cada célula pode existir um dos seguinte objetos ou agentes:
Os macacos podem ser mover de forma randômica pelo mapa.Se ele ficar na mesma célula do agente, irá tentar projudicá-lo.
As pedras ocupam uma célula inteira e não pode coexistir com outrao objetos dentro da célula.
O agente pode captar apenas os objetos que estão na mesma célula ou objeto que está na célula a sua frente. Ele também monitora o nível da sua propria saude.
O agente pode realizar as seguintes ações:
O nível de saude do agente é decrementado para cada vez que ele toma uma ação. Ela também pode ser decrementada por um ataque de um macaco ou quando o agente tenta se mover para uma célula que contém uma pedra ou para fora do grid.
Se o agente comer um hamburguer, o nivel de saude é aumentado.
a meta deste exercicio é explorar o agente funcional ALife.
A figura abaixo mostra o ambiente com os objetos inseridos nas céulas.
Quando comparado a GUI di alifeAgent com o basicAgent, a primeira coisa que é possivel observar são as ações e a interação do LIDA. No basicAgent, as ações eram acionar botões em função de determinadas percepções. Aqui, ocorre um processo mais elaborado de movimentação do agente e do macaco, além de controle de energia do agente.
A figura abaixo mostra um resumo das ações tomadas após cerca de 50000 interações.
Nesse exercicio foi inicialmente alterada para zerar a quantidade de hamburgueres no ambiente.
#Agent properties lida.agentdata=configs/alifeAgent_ex2.xml lida.elementfactory.data=configs/factoryData.xml
trecho do código para alterar a quantidade de hamburgueres no ambiente para 0, conforme mostrado abaixo.
#name=QTY,x,y,iconId,size,health,className,[attributes]* food=0,-1,-1,8,10,1.0,edu.memphis.ccrg.alife.elements.ALifeObjectImpl
Foi criado ainda um monitor para o nível de saude para níveis abaixo de 0,33.
public class BadHealthDetector extends BasicDetectionAlgorithm { private final String modality = ""; private Map<String, Object> detectorParams = new HashMap<String, Object>(); @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; } }
Dessa forma, quando a energia do agente decai abaixo de 0,33 ele não consegue mais se mover.
Abaixo foram realizadas algumas alterações de código para que o agente possa detectar a sua propria saude e detectar predadores a frente (na versão anterior ele só detectava se estive na mesma célula).
No arquivo factoryData.xml foi incluido a seguinte task:
<task name="BadHealthDetector"> <class>alifeagent.featuredetectors.BadHealthDetector</class> <ticksperrun>3</ticksperrun> <associatedmodule>SensoryMemory</associatedmodule> <associatedmodule>PerceptualAssociativeMemory</associatedmodule> </task>
Na sequencia foi realizada essa mesma alteração para o arquivo alifeAgent_ex2. xml, conforme mostrado abaixo:
<task name="BadHealthDetector"> <tasktype>BadHealthDetector</tasktype> <ticksperrun>3</ticksperrun> <param name="node" type="string">badHealth</param> </task>
Depois foi adicionado o seguinte trecho:
<task name="predatorFrontDetector"> <tasktype>ObjectDetector</tasktype> <ticksperrun>3</ticksperrun> <param name="node" type="string">predatorOrigin</param> <param name="object" type="string">predator</param> <param name="position" type="int">1</param> </task>
Essas edições adicionaram mais possibilidades de comportamento na memória procedural do agente.
Foram realizados os setups iniciais, conforme mostrado abaixo:
Quantidade de comida no mapa = 10
#name=QTY,x,y,iconId,size,health,className,[attributes]* food=10,-1,-1,8,10,1.0,edu.memphis.ccrg.alife.elements.ALifeObjectImpl
#Agent properties lida.agentdata=configs/alifeAgent_ex3.xml lida.elementfactory.data=configs/factoryData.xml
Como o agente não possui codelets de atenção para o predador, ele não foge. Para resolver isso foi criado o seguinte codelet:
<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>
Agora é possivel observar que o Agente consegue criar coalizões ao observar um predador.
Depois disso foi alterado o FoodAttentionCodelet para 0.01. Com essa alteração, a capacidade de reação a comida cai drasticamente.
Depois disso o initialActivation foi restaurado para 1.0 novamente e o tickduration foi alterado para 40.
Nessa simulação foi possivel observar que as coalizões contendo "goodHealth" tiveram um aumento.
foi realizado as alterações do setup inicial do exercicio, conforme mostrado abaixo:
#Agent properties lida.agentdata=configs/alifeAgent_ex4.xml lida.elementfactory.data=configs/factoryData.xml
Nessa simulação, o agente passa a se mover apenas quando a energia dele decai abaixo de 0.66 ou existe um predador proximo.
Para corrigir isso, foi realizado essa alteração e o agente passou a agir de forma normal (good health)
<param name="scheme.10b">if emptyFront turn around|(emptyFront)()|action.moveAgent|()() |0.1</param> <taskspawner>defaultTS</taskspawner> <initializerclass>edu.memphis.ccrg.lida.proceduralmemory.BasicProceduralMemoryInitializer</initializerclass>
Depois disso foram realizadas alterações do código para que o agente pudesse utilizar elementos "non-default" para a estratégia. As seguintes alterações de codigos foram realizadas:
Alteração do parâmetro <initializerclass> dentro do módulo de PerceptualAssociativeMemory:
<initializerclass>alifeagent.initializers.CustomPamInitializer</initializerclass>
Depois disso o código foi alterado conforme indicado pelo exercicio:
public void initModule(FullyInitializable module, Agent agent, Map<String, ?> 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)); // Obtain the 'food' node from PAM // Add a Link in PAM from 'food' to 'object' with link category PARENT child = pam.getNode("food"); pam.addDefaultLink(factory.getLink(child, objectNode, PerceptualAssociativeMemoryImpl.PARENT)); DecayStrategy decayStrategy = factory.getDecayStrategy("slowDecay"); objectNode.setDecayStrategy(decayStrategy); }
O BasicPamInitializer lê os parâmetros "nodes" e "links" e cria conexões entre eles na memória de percepção associativa.
O objetivo deste exercicio foi adicionar ao agente a capacidade de utilizar a arvore para se proteger de um predador. Para isso, quando ele está de frente com uma célula contendo uma arvore, ele move-se para esta célula.
Foi adicionado uma módulo de atenção para árvores e um novo esquema na memória procedural, conforme mostrado abaixo:
<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>
Abaixo o código que foi adicionado na memoria procedural:
<param name="scheme.4">move to food|(foodFront)()|action.moveAgent|()()|0.1</param> <param name="scheme.5">eat food at origin|(foodOrigin)()|action.eat|()()|0.35</param> <param name="scheme.5a">move forward if treeFront|(treeFront)()|action.moveAgent|()()|0.1</param>
Utilizando a aba Action Selection é possivel observar um momento em que a ação "move forward if treeFront" é selecionada.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer