Utilizar o Soar para controlar uma aplicação externa por meio da interface SML (SOAR Markup Language).
O sistema a ser desenvolvido será a mente artificial de um agente capaz de controlar o robô no ambiente WorldServer3D. O comportamento do robô será determinado pela estratégia e heurística adotada e implementada através da plataforma SOAR.
Para esta atividade foi necessário baixar o novo projeto WordServer3D, atualizado para esta atividade, e os projetos DemoSOAR e WS3dProxy. O WS3DProxy é uma library de apoio, responsável pela comunicação com o WorldServer3D, enviando e recebendo comandos em objetos de alto nível. A atualização no WorldServer3D foi justamente a integração com esta interface de comunicação.
Os projetos foram abertos na IDE Netbeans:
O objetivo inicial era executar o DemoSOAR e verificar seu funcionamento. Mas aconteceu uma pequena confusão que seria interessante relatar:
1- Executando o DemoSoar: em "Propriedades" do projeto, ajustei a configuração para executar no modo "default", ou seja, através do código e sem o "Web Start". Executei o programa, porém, nada apareceu.
Não imaginei que o problema era portabilidade do projeto. Estava rodando na plataforma Windows e o projeto não tinha em sua biblioteca o arquivo sml.jar para a plataforma Windows, somente para LINUX. Fato que será mencionado novamente quando falarmos sobre o funcionamento da classe SimulationSOAR.java que sugere justamente esta portabilidade.
2- Executando o DemoSoar - Web Start: Tentei então executar com Web Start. Para tanto, configurei em "Propriedades" do projeto para executar com o Web Start. Na configuração da aplicação Web Start foi necessário ajustar a "Base de Código" para "Execução Local" e assinar a aplicação com uma "Keystore.key" gerada através do seguinte linha de comando no MSDOS: keytool -genkeypair -v -dname "cn=Seu Nome Completo, c=BR" -alias seualiassemespaco -validity 10000 -keystore ./keystore.key.
Aconteceu também um erro de compilação, mesmo antes destes ajustes, devido à existência do parâmetro "excludeFromCopy="${copylibs.excludes}"", no arquivo build-impl.xml, tag copylibs. A causa principal, provavelmente foi a versão utilizada no Netbeans, 7.4, conforme sugere esta página: https://netbeans.org/bugzilla/show_bug.cgi?id=231468 Este parâmetro foi retirado.
Então, o Web Start também não funcionou.
3- Trocando os arquivos sml.jar (LINUX -> WINDOWS): Com a orientação do professor, o principal problema foi então identificado e solucionado. O projeto do WordServer3D tinha o arquivo sml.jar para Window. O arquivo foi copiado para o DemoSOAR. Confusão desfeita, o projeto DemoSOAR passou a executar das duas formas.
Análise do Código DemoSOAR
Diagrama de Classe dos pacotes Simulation e SOARBridge - Projeto DemoSOAR:
javadoc do projeto DemoSOAR: index.html
Classe SimulationSOAR.java:
A classe SimulationSOAR.java pertence ao pacote SIMULATION e é a classe principal do projeto DemoSOAR, ou seja, é a classe que possui o método main e inicia toda a aplicação. Como classe principal executa as seguintes tarefas, pela ordem:
Classe SimulationTask.java:
A figura abaixo ilustra a relação entre a classe SimulationTask, a interface de comunicação SOARBridge com a plataforma SOAR e a interface de comunicação WS3DProxy com o ambiente WorldServer3D.
Entre as inicializações da classe SimulationTask é criada uma nova criatura e um novo ambiente WorldServer3D. Isto é feito através de comandos enviados para o WorldServer3D através do proxy. Dentro do método runSimulation, o status da criatura (c) é atualizado e estas informações são passadas para a plataforma SOAR através da interface BridgeSOAR. Como mostra o método abaixo:
Existe uma coordenação entre os ambientes SOAR e WorldServer3D, promovida pela aplicação DemoSOAR.
As duas interfaces de comunicação, WS3Dproxy e SOARBridge utilizam objetos de classes específicas para transitar suas informações, do mundo "real", WorldServer, para a mente, SOAR:
A interface WS3Dproxy é utilizada pelas classes do pacote Simulation para as criações iniciais e atualização dos status do ambiente e da criatura em objetos de informação que serão passados para a plataforma SOAR através do SOARBridge (método soarBridge.runSimulation() em SimulationTask.runSimulation). Por sua vez, a plataforma SOAR processa os novos status do ambiente e da criatura e determina a próxima ação/comando. Esta ação chega como informação à classe SimulationTask, dentro do looping, através do método processResponseCommands().
O processamento destes comandos são executados no ambiente WorldServer3D através a classe ws3dproxy.CommandUtility.
Cada criatura no WorldServer3D possui um "leaflet", ou seja, uma meta na obtenção de jóias. Modifique o programa DemoSOAR (e também o soar-rules.soar), de tal forma que ele leve em consideração o leaflet de cada criatura para o controle da criatura.
O Projeto completo, com os códigos e modificações mencionadas pode ser encontrado aqui:
Proj. DemoSOAR jrborelli
O executável em WebStart: SOAR_launch.jnlp
O executável do WS3D:WS3D launch
Regras SOAR:
Como mostrado acima, o método SoarBridge.setupStackHolder() envia para a plataforma SOAR dados obtidos do "WorldServer3D", utilizando métodos da interface "sml", criando e atualizando elementos da memória de trabalho do agente.
A classe sml.Agent é declarada como: public static interface OutputEventInterface, e possui métodos que adotam o seguinte “template”:
Agent.CreateIdWME(<elemento-pai>, <"nome-novo-elemento">): cria um novo elemento ID na memória de trabalho
Agent.CreateFloatWME(<elemento-pai>, <"nome-novo-elemento">, <valor-novo-element>): cria um novo elemento FLOAT na memória de trabalho
Dentro do método SoarBridge.setupStackHolder() estes métodos da classe Agent que constroem a “work memory” são utilizados segundo os parâmetros extraídos do objeto de informação recebido. A figura abaixo ilustra um trecho deste código:
Desta forma, a seguinte estrutura de dados é criada na Memória de Trabalho SOAR:
As regras SOAR estão descritas em um arquivo com extensão “.soar”, dentro do pacote default do projeto DemoSOAR, como mostra a figura a baixo:
Na versão original, o arquivo de regras SOAR propõe 3 tipos de operadores:
Para os casos de conflito entre as ações, o arquivo soar-rules.soar vem originalmente com as atribuições de preferência descrita abaixo. Os termos entre chaves são os de maior preferência, conforme programado no arquivo. Estas clausulas de atribuições de preferência são interessantes caso se deseje modificar o comportamento do agente.
A classe SimulationTask.java, da mesma forma como fez para a criatura e sensores, deve ser modificada para extrair do WS3D informações sobre os Leaflets, como ilustra a figura:
Na classe SoarBridge.java, o método “setupStackHolder” se encarrega de criar a estrutura de dados referentes aos Leaflets na memória de trabalho (WME) do SOAR, conforme ilustrado abaixo:
Cenário de Aplicação - Memória Episódica:
É interessante notar a possibilidade de construção de Memória Episódica em todas as arquiteturas de sistemas cognitivos que veremos na disciplina IA006.
O que se pretende é a construção simplificada de relatos indexados no tempo que permitam a um dos agentes a reanálise destes dados e estimar uma situação que possa completar estes relatos de forma lógica, segundo seu próprio ponto de vista, ou seja, sua Memória Episódica.
No caso da arquitetura SOAR, o artigo “Extending the Soar Cognitive Architecture”, escrito por John Laird em 2008, pode ser considerado uma importante referência, conforme comprova a figura:
Neste ponto, decido que pretendo perseguir os mesmos objetivos para todas as arquiteturas a serem experimentadas nesta disciplina: criar a estrutura básica de Memória Episódica e viabilizar sua utilização para tomada de decisões – no caso de nosso contexto, a ser explicado a seguir, viabilizar ao agente estimar a situação mais provável que completa seu conhecimento “histórico” dos eventos na arena de forma lógica e aceitável.
Nosso cenário:
Vamos implementar a arena de forma a permitir a presença de pelo menos três robôs. Estes robôs terão o papel clássico proposto no WS3D de caminhar pela arena e recolher alimentos e objetos desejados, segundo seus “leaflets”.
A figura nova na arena, que utilizará a memória episódica, é um robô investigador, que chamaremos “Detetive”.
O Detetive, em sua primeira versão, ficará posicionado no centro da arena, girando sempre no mesmo sentido e velocidade. Sua visão atuará como um “scanner”, ou radar, e irá construir sua memória epsódica com relatos de objetos e alimentos existentes, suas posições e a localização de cada robô, naquele instante.
O “instante”, ou “timestamp”, nesta implementação torna-se um artefato, na verdade um conceito, extremamente importante. Todos os relatos na memória episódica serão indexados através do “timestamp”, adaptado para esta funcionalidade.
O objetivo inicial do Detetive será estimar qual dos robôs capturou um objeto específico, localizado em uma posição especifica. Baseado em sua memória episódica, que traz dados sobre a localização de cada robô, o Detetive analisará no timestamp anterior e mais próximo do instante da captura do objeto qual robô se encontrava mais próximo e, portanto, teria maior probabilidade de ter atuado no evento.
Em uma versão mais avançada, o Detetive terá como objetivo estimar o “leaflet” de cada robô na arena e o jogo, na verdade, torna-se um desafio de qual arquitetura/estudante é capaz de proporcionar os melhores resultados neste sentido.
Caso a configuração de Detetive localizado no centro da arena não seja uma opção que proporcione a visão necessária para se implementar o cenário, pretende-se alterar esta proposta colocando um Detetive no centro de cada quadrante, compartilhando a mesma memória episódica.
Alguns Conceitos [http://www.human-memory.net/types_episodic.html]:
Memória Episódica é relacionada a eventos (tempo, lugares, emoções associadas, e elementos contextuais, como: “quem”, “o quê”, “quando”, “onde”, “porque”) que pode ser explicitamente declarada. É a coleção de experiências pessoais passadas que ocorreram em um determinado tempo e lugar. Permite “voltar” no tempo, ato de lembrar, e reanalisar o evento ocorrido com objetivos diversos como: emocionais, de aprendizado, tomada de decisão futura e julgamento.
A Memória Semântica, por outro lado, é um registro mais estruturado de fatos, significados, conceitos e conhecimento sobre o mundo externo que adquirimos. Refere-se ao conhecimento geral, partilhada com outros e independente de experiências pessoais e do contexto temporal/espacial em que foi adquirida. Inclui coisas como: tipos de alimentos, capitais, costumes sociais, funções de objetos, vocabulário, compreensão da matemática, etc. Grande parte da memória semântica é abstrata e relacional, associada com o significado de símbolos verbais.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer