CEOPS++ Integração entre Objetos e Regras de Produção em C++ Aluno:Pablo de Santana Barbosa Orientador: Geber Lisboa Ramalho
Jogos e RBS’s Jogos Exigência de uma IA cada vez mais sofisticada Realismo e oponentes competitivos RBS São muito utilizados em jogos Poucos motores código aberto no mercado O caso SmartSim
Jogos e RBS’s Poucos Motores de código aberto no Mercado Princípios importante para o uso de RBS’s em jogos Uniformidade de integração Bom desempenho
Roteiro Motores de código aberto CEOPS++ Conclusões
Sistemas de Produção e Orientação a Objetos EOOPS Vantagens Facilidade de uso Engenharia de Software: reutilização, modularidade, extensibilidade... Desvantagens O problema da modificação dos objetos Quando usar regras ou objetos?
Motores existentes Linguag. Uniformid.DesempenhoRes. Conflitos Facilidade Integração SoarC-+/-- JeopsJava++/-++ ClipsC--+/-- Tabela de comparação
Motor de referência: Jeops Gera entradas Agente Base de Conhecimentos Base de Objetos Rete Base Interna de Regras Conjunto de Conflito Consulta JEOPS flush insert runobjects Knowledge Base
CEOPS++
Fatos Podem ser qualquer objeto ou estrutura em C++ O CEOPS++ armazena ponteiros para objetos (void*)
Base de Objetos (ceops::ObjectBase) Guarda referências para todos os objetos da memória de trabalho Evita duplicação de fatos Armazena informações de herança de classes Principais Métodos bool Insert (T* obj) bool Retract (T* obj) void GetObjects (vector & objs) GetSubclasses (vector & subclasses)
Checagem de subtipos(1) (util::TypeCheckFunction) C++ não suporta reflexão Suporte limitado a RTTI( Runtime Type Information ) Algumas API’s código aberto tentam prover reflexão Escolha de uma solução própria Usado em conjunto com a classe TypeCheck template inline void TypeCheckFunction(T* type, vector & subclasses);
Checagem de subtipos(2) (util::TypeCheckFunction) template class TypeCheck { public: TypeCheck() {} bool check(T* t) { return true; } bool check(T& t) { return true; } bool check(void* v) { return false; } };
Checagem de subtipos(3) (util::TypeCheckFunction) template inline void TypeCheckFunction(T* type, vector & subclasses) { TypeCheck typeA; TypeCheck typeB; TypeCheck typeC; if(typeA.check(type)) { //verifica se eh subclasse de A subclasses.push_back(typeid(A).name()); } if(typeB.check(type)) { //verifica se eh subclasse de B subclasses.push_back(typeid(B).name()); } if(typeC.check(type)) { //verifica se eh subclasse de C subclasses.push_back(typeid(C).name()); }
Regras (ceops::AbstractRule) Sintaxe próxima de C++ Possui três campos distintos: Declarations Declaração de ponteiros para classes ou estruturas Conditions Qualquer expressão booleana válida em C++ Actions Qualquer comando válido em C++ Insert, Modify, Retract
Exemplo de regra CEOPS++ rule GoDown { declarations Fibonacci* f0; conditions f0->getN() > 1; f0->getValue() == -1; f0->getSon1() == NULL; actions int n = f0->getN(); Fibonacci* s1 = new Fibonacci(n - 1); Fibonacci* s2 = new Fibonacci(n - 2); f0->setSon1(s1); f0->setSon2(s2); Insert(s1); Insert(s2); Modified(f0); }
Base de Regras (ceops::AbstractRuleBase) Funciona apenas como um repositório de regras Representa o conjunto das regras definidas pelo usuário Gerada automaticamente pelo pré- compilador
Pré-compilação
Rete (rete::Rete) Possui apenas a funcionalidade de memorização das avaliações realizadas
Rete (rete::Rete) rule atacar { declarations AgenteJogador agente; //d1 Unidade unidade1; //d2 Unidade unidade2; //d3 Conditions agente.ehDono(unidade1); //c1 agente.ehInimigo(unidade2); //c2 unidade2.getPosicao().distancia( unidade1.getPosicao() ) <= unidade1.getAlcanceAtaque(); //c3 unidade1.getAtaque() > unidade2.getAtaque(); //c4 unidade1.tirosRestantes > 0; //c5 actions unidade1.atacar(unidade2); //a1 }
Conjunto de conflitos (conflict::ConflictSet) Conjunto que armazena as regras ativas e os objetos que as ativaram É uma interface que deve ser implementada pelo usuário Principais Métodos virtual void InsertElement(ConflictSetElement* element) virtual ConflictSetElement* NextElement() void RemoveElementsWith(void* obj)
Elemento do conjunto de conflitos (conflict::ConflictSetElement) Representa uma regra ativa e os objetos que ativaram a regra Principais Métodos AbstractRule* GetRule() vector & GetFacts() unsigned long GetTime()
Base de Conhecimentos (ceops::KnowledgeBase) É a interface entre o usuário e o motor de inferência Deve ser inicializada com um conjunto de regras e um conjunto de conflitos Principais métodos: bool Insert (T* fact) void Modify (T* fact) void Retract (T* fact)
Resultados CEOPS++Jeops Fibonacci(20): 6765 Nº disparos: Criação da KB > 1 ms15 ms Tempo de Execução 565ms2,5min Fibonacci CEOPS++Jeops Nº disparos: 92 Criação da KB 10 ms45ms Tempo de Execução 15 ms Oito rainhas
Considerações finais Contribuição Desenvolvimento de um motor original que concilia as vantagens do Jeops com uma demanda de performance (C++) Trabalhos futuros Construir um editor de regras Melhorar o pré-compilador Tornar o código portável para outros compiladores
Principais referências Figueira, Carlos. JEOPS – Integração entre objetos e Regras de produção em Java. Dissertação de Mestrado, CIn – UFPE, CLIPS Basic Programming Guide. pg.pdf pg.pdf Soar 8 Manual. s/Soar8Manual.pdf. s/Soar8Manual.pdf Vollmann, Detlef. Metaclasses and Reflection in C