You are here

Relatório 2 - SOAR: Controlando o WorldServer3D

Atividade 1


O método main faz uso da tecnologia JNI (Java Native Interface) para, baseado no Sistema Operacional e sua arquitetura, carregar dinamicamente as bibliotecas correspondentes.

Os sistemas aceitos são Windows e Linux, com arquiteturas 32 ou 64 bits, ou Mac OS, independente de arquitetura. Caso a arquitetura seja diferente de 32 ou 64 bits, as versões de 32 bits serão carregadas para Windows e Linux.

A Classe SimulationSOAR faz uso da classe NativeUtils, do pacote SoarBridge para acesso às bibliotecas armazenadas no JAR que acompanha a aplicação. Nela, o método loadFileFromJar é evocado. Esse método, copia o biblioteca desejada para um arquivo temporário temp, que é excluído quando a aplicação é encerrada.

Essa solução é estendida ao carregamento de arquivos com código SOAR, para uso do controlador, carregando o arquivo soar-rules.soar:

NativeUtils.loadFileFromJar( "/soar-rules.soar" );

O loop principal de simulação da aplicação DemoSOAR também se encontra no método main. Nele, o método runSimulation do objeto simulationTask é executado a cada 100 milisegundos.

Nesse método, o atributo c da classe Creature tem seu status atualizado e a lista de objetos em seu campo visual é recuperada. No método prepareAndSetupCreatureToSimulation, a lista de objetos é carregada num sensor visual. Adicionalmente, um sensor de combustível é alimentado com o combustível disponível na criatura c. O método setupStackHolder da classe SoarBridge faz o envio desses dados para o SOAR.

O acesso ao ambiente World Server 3D é garantido pela biblioteca WS3DProxy. A classe homônima WS3DProxy recebe em seu construtor o endereço IP e a porta da máquina onde o ambiente World Server 3D está em execução e abre a conexão por meio de um socket.

A classe SoarBridge é acessada para transferir as informações de DemoSOAR para a arquitetura cognitiva SOAR. O pacote sml, acrônimo de Soar Mark-up Language, é usado como interface.

A classe Agent do pacote sml é usada para criar identificadores das criaturas (por exemplo, Creature_14200823271) como elementos da memória de trabalho, bem como a transcrição dos sensores visual e de combústível.

Após a execução do agente, é chamado o método processResponseCommands. Os possíveis comandos retornados são MOVE, GET e EAT que estão armazenados no output-link do SOAR, além do comportamento padrão "do nothing". O comando MOVE pode ser usado para locomover a criatura para um ponto (x, y) com CommandUtility.sendGoTo, ou rotacioná-la com o método estático CommandUtility.sendSetTurn, conforme pode ser visto no trecho do código fonte destacado abaixo:

if( soarCommandMove.getX( ) != null && soarCommandMove.getY( ) != null )
{
    CommandUtility.sendGoTo( "0", soarCommandMove.getRightVelocity( ), soarCommandMove.getLeftVelocity( ), soarCommandMove.getX( ), soarCommandMove.getY( ) );
}
else
{
    CommandUtility.sendSetTurn( "0", soarCommandMove.getLinearVelocity( ), soarCommandMove.getRightVelocity( ), soarCommandMove.getLeftVelocity( ) );
}

O comando GET insere o argumento passado como parâmetro na sacola da criatura:

c.putInSack( soarCommandGet.getThingName( ) );

O comando EAT faz a criatura comer a coisa thing:

c.eatIt( soarCommandEat.getThingName( ) );

O arquivo soar-rules.soar contém as regras de produção a serem aplicadas, conforme detalhado na tabela abaixo.

PRODUÇÃODESCRIÇÃO
propose*wanderpropor agente de andar em frente no ambiente
apply*wanderse o operador andarilho é selecionado, em seguida, aplicar um comando de saída
apply*wander*remove*moveuma vez que o operador andarilho é selecionado e concluído, remove-o
propose*see*entity*with*memory*countpropor manter entidades agente na memória, se tiver entidades na memória
apply*see*entity*with*memory*countse o operador relacionado é selecionado, em seguida, aplicar um comando de saída
propose*see*entity*without*memory*countagente detém entidades na memória, se ele não tem entidades na memória
apply*see*entity*without*memory*countuma vez que o operador relacionado é selecionado, aplicar um comando de saída
propose*move*foodpropor agente passar diretamente à alimentação
apply*move*foodse o operador de movimento é selecionado, aplicar um comando de saída
apply*moveFood*remove-moveuma vez que a comida é selecionada e concluída, remove-a
apply*moveFood*remove*foodremover caminhar ao alimento da memória, uma vez que não existe mais
propose*eat*foodpropor a ingestão do alimento
apply*eat*foodse operador comer alimento é selecionado, aplicar um comando de saída
apply*eatFood*remove-eatuma vez que o operador comer alimento é selecionado e concluído, remove-o
propose*move*jewelpropor ao agente para ir direto para a jóia
apply*move*jewelse o operador de mover à jóia é selecionado, em seguida, aplicar um comando de saída
apply*moveJewel*remove-moveuma vez que o operador mover à jóia é selecionado e concluído, remove-o
apply*moveJewel*remove*jewelremover mover à jóia da memória, uma vez que não existe mais
propose*get*jewelpropor ao agente para obter jóia
apply*get*jewelse o operador obter jóia é selecionado, aplicar um comando de saída
apply*getJewel*remove-getuma vez que obter jóia é selecionado e concluído, remove-o
propose*avoidBrickpropor ao agente evitar tijolo
apply*avoidBrickse o operador evitar tijolo é selecionado, aplicar um comando de saída
apply*avoidBrick*remove*entity*memoryremover entidade tijolo da memória
apply*avoidBrick*remove-moveuma vez que o operador relacionado é selecionado e concluído, remove-o
moveJewel*seeEntity*preferencesmover à jóia ou mover ao alimento
avoidBrick*seeEntityWithMemory*preferencesveja entidade com memória evitando tijolo
seeEntity*without*memory*preferencesveja entidade sem preferências de memória
moveJewel*getJewel*preferencesmover jóia / obter jóia
getJewel*avoidBrick*preferencesobter jóia / evitar tijolo
moveJewel*moveJewel*less*distancemover jóia / mover preferências jóia
getJewel*getJewel*preferencesobter jóia / obter preferências jóia
moveFood*eatFood*preferencesmover à comida / comer a comida
eatFood*avoidBrick*preferencescomer alimento / evitar tijolo
moveFood*moveFood*preferencesmover ao alimento / mover as preferências alimentares
eatFood*eatFood*preferencescomer alimentos versus preferências alimentares
moveFood*moveJewel*preferences*moveFoodWinsmover ao alimento / mover às preferências da jóia (mover ao alimento ganha)
moveFood*moveJewel*preferences*moveJewelWinsmover ao alimento / mover às preferências da jóia (mover à jóia ganha)
avoidBrick*avoidBrick*without*move*jewel*preferencesevitar tijolo / evitar preferências de jóias
avoidBrick*moveJewel*moveFood*preferencesevitar tijolo / mover à jóia / mover ao alimento com elemento na memória
wander*preferencespreferências do andarilho

Atividade 2


O arquivo soar-rules.soar foi alterado de maneira a aumentar a eficiência da criatura na busca de jóias. Muito embora, a criatura tenha ficado eficiente na busca de jóias, na obtenção de alimentos o avatar se tornou menos eficiente, agindo como um atleta que executa um sprint inicial.

Abaixo, a imagem com o resultado de uma execução aleatória:

Score

Foi realizada uma competição com a criatura virtual do colega Hirley Silva, onde cada uma das criaturas moveram-se segundo as suas respectivas regras.

O placar atrelado à criatura 0 foi o seguinte:

Creature 0

O placar atrelado à criatura 1 foi o seguinte:

Creature 1

Abaixo, podemos visualizar uma imagem do mundo virtual, palco da competição. Observe-se que cada criatura possui uma câmera de sua visão.

Competition
O aplicativo no formato JNLP pode ser obtido aqui e o código fonte está disponível aqui.

Em testes realizados, o JNLP pode ser executado com sucesso no sistema operacional Linux (Ubuntu based).

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer