O objetivo da aula de hoje é utilizar a arquitetura cognitiva Clarion para controlar uma criatura artificial no WorldServer3D, de modo análogo ao que foi feito com o SOAR. Para tanto, é necessário que entendamos o funcionamento do Clarion, e desenvolvamos uma instância da arquitetura Clarion para controlar a criatura.
A proposta desta atividade é desenvolver um sistema de controle (uma mente artificial) para a criatura do WorldServer3D, utilizando o Clarion. Nosso desafio será semelhante ao desafio que foi proposto na implementação com o SOAR. A criatura deve obter sua meta de aquisição de jóias a partir de seu "leaflet", e buscar de maneira mais rápida possível cumprir a busca de jóias que lhe foi delegada. Para testar a capacidade da criatura, dois testes são propostos:
Para que eu possa fazer os testes do sistema de vocês de maneira rápida e eficiente, peço que me disponibilizem on-line dois arquivos ZIP diferentes:
Além disso, no relatório da atividade deve ser descrita a lógica da solução, para que eu compreenda seu funcionamento.
Antes de mais nada, é preciso dizer que vocês têm toda a liberdade para utilizar quaisquer estruturas disponíveis no Clarion para concluir a atividade. Para começar a pensar em uma solução, vamos relembrar algumas questões importantes sobre o Clarion. Em primeiro lugar, observemos a figura abaixo, que mostra como uma aplicação típica do Clarion funciona.
Observem que o "sensory input" corresponde a um ou mais DimensionValuePair, que podem conter informações genéricas. Existe no framework do Clarion, a classe SensoryInput, que deve ser utilizada para criar-se um objeto que funcionará como "sensory input". Essa classe possui o método Add, por meio do qual diversos DimensionValuePair podem ser inseridos, compondo a informação sensorial.
Na saída, devem ser criados diversos objetos da classe ExternalActionChunk, um para cada possível ação de saída que o Clarion pode gerar, controlando a criatura.
O ciclo cognitivo básico do Clarion, envolve a seguinte sequência:
Agent.Perceive(si);
ExternalActionChunk chosen = Agent.GetChosenExternalAction(si);
onde si é um objeto do tipo SensoryInput, devidamente preenchido com a informação sensorial.
Depois que as entradas do controlador foram definidas, e também as ações possíveis, é necessário agora criar as estruturas internas do ACS, que podem ser tanto no bottom-level (uma rede neural), como no top-level (regras).
Um exemplo (demo) bastante singelo de como usar o Clarion para controlar uma criatura no WorldServer3D pode ser visto aqui. Neste demo, duas regras fixas são utilizadas pelo Clarion para fazer a criatura desviar de obstáculos, virando à direita.
Para a execução dessa atividade, foi necessário fazer a implementação do Parser das informações do Leaflets para serem trabalhadas no CLARION.
Foram necessárias algumas criações:
using System;
using WorldServerLibrary.Model;
namespace WorldServerLibrary
{
public class LeafItem
{
public string Color {get; set;}
public int NumLet {get; set;}
public int NumSack {get; set;}
}
}
using System;
using WorldServerLibrary.Model;
using System.Collections.Generic;
namespace WorldServerLibrary
{
public class Leaflet
{
public Leaflet (){ LeafList = new List<LeafItem>(); }
public int NumLeafs {get; set;}
public List<LeafItem> LeafList;
}
}
Além disso foi necessário modificar o codigo existente da seguinte forma:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WorldServerLibrary.Model
{
public enum MotorSystemType
{
CAR,
TWO_WHEEL
}
public class Creature:Thing
{
public Int32 index { get; set; }
public MotorSystemType MotorSystem { get; set; }
public double Wheel { get; set; }
public double Speed { get; set; }
public double Fuel { get; set; }
public Boolean HasLeaflet { get; set; }
public Int32 NumberOfLeaflets { get; set; }
public List<Leaflet> LeafletList = new List<Leaflet>();
}
}
// It is missing the parser of leaflet!
if (creature.HasLeaflet)
{
int numLeaflet = creature.NumberOfLeaflets;
for(int i=0; i<numLeaflet; i++)
{
enumerator.MoveNext();
Leaflet leaf = new Leaflet();
SetAttribute(leaf,"NumLeafs",enumerator);
for (int j=0; j<leaf.NumLeafs; j++)
{
LeafItem leafinfo = new LeafItem();
SetAttribute(leafinfo,"Color",enumerator);
SetAttribute(leafinfo,"NumLet",enumerator);
SetAttribute(leafinfo,"NumSack",enumerator);
leaf.LeafList.Add(leafinfo);
}
enumerator.MoveNext();
creature.LeafletList.Add(leaf);
}
}
Implementado isso, podemos passar para a implementação no Clarion. Para a resolução desse problema, podemos abordar várias soluçoes. A forma mais simples, devido a simplicidade do problema é via Fixed Rules. A proposta é mapear as joias na visão, fornecendo informações sensoriais ao Clarion, e baseado nisso, decidir as ações de saída. As ações de saída mapeadas farão o robo girar, seguir adiante, ir até uma joia, ir até uma comida, e pegar um item.
As informações de entrada são relacionados a presenca de joias, comidas, muros, e em caso de itens proximos, pegar.
Os tipos de ações gerados que nosso programa deverá tratar são:
As regras implementadas são de forma simples:
A condição de parada é baseada nos itens do leaflet e nos itens coletados. Quando forem coletados itens suficientes baseados na soma dos leaflets de uma mesma cor, para todos os leaflets, o agente morre.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer