Atividade 2
Controlando o WorldServer com SOAR
Proposta:
A proposta para que o robô consiga completar a leaflet foi a seguinte. Primeiro criou-se dois novos elementos no Working Memory, um elemento com a informação da cor requerida (que está dentro da leaflet) e outro elemento para verificar se a leaflet foi completada. Na seguinte figura apresenta-se a estrutura do Working Memory com os dois novos elementos em vermelho.
O elemento ^GOAL armazena a cor que é procurada, o elemento ^LEAFLETCOMPLETED armazena 0 se ainda não foi completada toda a leaflet ou 1 se todos os objetivos foram completos.
Obtenção do ^GOAL
O elemento ^GOAL é obtivo a partir da leaflet. Primeiro são armazenados numa lista as cores das Joias que fazem parte da leaflet. Depois é obtida uma das cores de forma aleatória e ela é assignada ao elemento ^GOAL. Assim somente uma cor é procurada à vez. Se o robô completo sua leaflet o método retorna um String vazio. A seguinte figura apresenta o código em Java que realiza o descrito anteriormente.
Criação do ^GOAL e do ^LEAFLETCOMPLETED
O elemento ^LEAFLETCOMPLETED contem a informação de finalização da leaflet. Se não contem mais objetivos a ser cumpridos então seu valor é 1. O seguinte código apresenta como é feito isto em Java.
Delivery
Para deter o robô após ele terminar os objetivos da leaflet, foi criado mais uma ação. O Delivery é utilizado quando todas as joias do leaflet foram obtivas. O código seguinte apresenta a função que processa o comando Delivery.
Regras no SOAR
Foram modificadas as regras do programa soar-rules.soar o primeiro cambio é modificar a regra seeEntityWithMemoryCount e seeEntityWithoutMemoryCount para que armazene na memoria só as Joias da cor que está em ^GOAL, o seguinte código apresenta essa modificação.
A comida não é armazenada já que ela é procurada só quando o nível de energia do robô é de 400 ou menos. O seguinte código apresenta a regra do soar para ir por comida.
Foi criada uma regra para quando o robô termine sua lista de joias. Neste casso é verificado o valor do elemento ^LEAFLETCOMPLETED.
Foram agregadas regras de operators preferences e impasse solve para que o agente funcione corretamente.
Resultado:
O resultado das simulações são bastante bons, embora o robô pode ignorar joias que estão mais perto do que outras (devido a que a seleção da joia que vai procurar é aleatória) consegue ignorar as joias que não são parte de sua leaflet e procurar até que ache alguma que seja parte dela.
A seguinte imagem apresenta ao robô indo pela ultima joia do leaflet.
Quando o robô termina sua leaflet para, o cliente informa e o programa em SOAR fica em halt:
Arquivos
- WorldServer 3D: aqui
- Cliente Soar: aqui
Fuentes
- DemoSoar.zip (Cliente)
- WorldServer3D.zip
- WS3DProxy.zip