A primeira atividade consiste em rodar um exemplo simples do Eaters utilizando o exemplo do tutorial move-to-food.soar.
Inicialmente o exemplo foi rodado e algumas informações puderam ser notadas, como exemplificadas nas figuras Figura1.1 e Figura1.2. Nessas figuras é possível visualizar no Soar as informações de Entrada e Saída (^io WM).
Figura1.1 - Inputs
Nesse exemplo o Input mostra os WME relacionados ao Eater Puple. As posições adjacentes tem os elementos Leste E3, Norte N1, Sul S3 e Oeste W1. Ao imprimir esses elementos, vemos que E3 é vazio, N1 bonusfood, S3 bonusfood e W1 normalfood. é Possível explodir a árvore e ver quais sao os elementos adjacentes desses itens.
Figura1.2 - Outputs
No output acima, é possível ver que o comando para mover para Oest foi enviado, e o mesmo esta completo.
A lógica desse exemplo é simples. A proposição do operador é feita caso identificado um alimento em uma das celulas adjacentes do eater. Caso haja, o operador para mover em direção a esse alimento é proposto, e assim o Soar escolhe para qual caminho seguir.
Uma regra existente nessa lógica é o apply*move-to-food*remove-move. Essa regra é utilizada para remover os movimentos que ja foram executados do output. Isso é feito para que não haja sobrecarda da memória de trabalho. Isso pode ser notado na diferença entre a Figura1.3 e Figura1.4.
Figura1.3 - Output Sem apply*move-to-food*remove-move
Figura1.4 - Output Sem apply*move-to-food*remove-move
Esse programa tem limitação caso não tenha mais alimentos em nenhuma das posições adjacentes do eater, entrado assim em um estado de "lockup". Podemos alterar a regra de proposição para incluir as posições vazias tambem nas proposições, ou então expandindo a visão para além da célula adjacente.
Agora iremos explorar alguns elementos durante o desenvolvimento que ajudam na resolução da limitação descrita anteriormente. Basicamente o item mais importante aqui é a utilização das preferencias e a utilização da técnica que evita a última posição, que nos ajudarão a escolher o melhor caminho a se seguir durante a resolução do problema.
Codigos utilizados nessa atividade:
Figura2.1 - Move to North
Figura2.2 - Move to Food - Usando writes para debug
Figura2.3 - Move to food - Setando preferencias para evitar empty e dar prioridade a bonusfood
Figura2.4 - Jump to food
Figura2.5 - Evitando posição anterior
Dentre essas atividades, é possível notar algumas limitações, por exemplo o Move to Jump, nunca soluciona o problema pois afeta somente metade dos elementos no mapa. Move to north vai sempre no sentido norte. Move to Food com preferencia e evitando a posição anterior, por mais que terminem o jogo, não tem uma eficiencia muito boa.
Aqui podemos checar o código desenvolvido com melhor eficiencia se comparado com o exemplo utilizado nas atividades anteriores. Durante o desenvolvimento desse código foi possível estudar a utilização do Visual soar para solucionar problemas de sintaxe.
Figura3.1 - Visual soar para resolução de sintaxe
Esse código consiste na junção de elementos de Jump e Move, histórico de movimentação, preferências para posições com comida, ainda melhor quando a comida for do tipo bonus.
Preferencia | Evitar ultima posição | Ultima Atividade | |
564 | 717 | 748 | |
993 | 772 | 605 | |
4443 | 1325 | 590 | |
576 | 654 | 708 | |
567 | 478 | 472 | |
1025 | 728 | 613 | |
1239 | 869 | 449 | |
710 | 720 | 549 | |
1145 | 399 | 440 | |
2447 | 505 | 259 | |
Média | 1370,9 | 716,7 | 543,3 |
Quadro1 - Quantidade de decisões para resolução do problema utilizando diversos elementos estudados nessa atividade
É possível notar no quadro acima que quanto mais regras e mais bem elaboradas elas são, melhor o Soar resolve o problema.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer