![Page 1: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/1.jpg)
CEOPS++ Integração entre Objetos e Regras de Produção em C++
Aluno:Pablo de Santana BarbosaOrientador: Geber Lisboa Ramalho
![Page 2: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/2.jpg)
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
![Page 3: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/3.jpg)
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
![Page 4: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/4.jpg)
Roteiro
Motores de código aberto CEOPS++ Conclusões
![Page 5: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/5.jpg)
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?
![Page 6: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/6.jpg)
Motores existentes
Linguag. Uniformid. Desempenho Res. Conflitos
Facilidade Integração
Soar C - +/- - +/-
Jeops Java + +/- + +
Clips C - - +/- -
Tabela de comparação
![Page 7: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/7.jpg)
Motor de referência: Jeops
Geraentradas
Agente
Base deConhecimentos
Base deObjetos
Rete
Base Internade Regras
Conjunto de Conflito
Consulta
JoinNodeDecls 1 a 2
FilterNodeDecl 1
ClassFilterDecl 1
FilterNodeDecl 2
ClassFilterDecl 2
JoinNodeDecls 1 a 3
FilterNodeDecl 3
ClassFilterDecl 3
FinalNodeRegra n
JoinNodeDecl 1
JEOPS
flushinsert run objects
-- - - ------ - - ----- - - - ----- - - ------ - - --
Knowledge Base
![Page 8: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/8.jpg)
CEOPS++
![Page 9: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/9.jpg)
Fatos
Podem ser qualquer objeto ou estrutura em C++
O CEOPS++ armazena ponteiros para objetos (void*)
![Page 10: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/10.jpg)
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>(T* obj) bool Retract<T>(T* obj) void GetObjects<T>(vector<T*>& objs) GetSubclasses<T>(vector<string>&
subclasses)
![Page 11: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/11.jpg)
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<typename T>
inline void TypeCheckFunction(T* type,
vector<string>& subclasses);
![Page 12: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/12.jpg)
Checagem de subtipos(2)(util::TypeCheckFunction)
template<typename T>class TypeCheck {public:
TypeCheck() {}
bool check(T* t) {return true;
}bool check(T& t) {
return true;}bool check(void* v) {
return false;}
};
![Page 13: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/13.jpg)
Checagem de subtipos(3)(util::TypeCheckFunction)
template<typename T>inline void TypeCheckFunction(T* type, vector<string>& subclasses) {
TypeCheck<A> typeA;TypeCheck<B> typeB;TypeCheck<C> typeC;
if(typeA.check(type)) { //verifica se eh subclasse de Asubclasses.push_back(typeid(A).name());
}
if(typeB.check(type)) { //verifica se eh subclasse de Bsubclasses.push_back(typeid(B).name());
}
if(typeC.check(type)) { //verifica se eh subclasse de Csubclasses.push_back(typeid(C).name());
}}
![Page 14: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/14.jpg)
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
![Page 15: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/15.jpg)
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);}
![Page 16: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/16.jpg)
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
![Page 17: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/17.jpg)
Pré-compilaçãoArquivo de
Regras(.rules)
Pré-compilador CEOPS++
Regras(*_rule_*.h)
Base de Regras(*_rules.h)
Código ObjetoCompilador C++
![Page 18: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/18.jpg)
Rete(rete::Rete)
Possui apenas a funcionalidade de memorização das avaliações realizadas
![Page 19: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/19.jpg)
Rete(rete::Rete)
ClassFilterd1
ClassFilterd2, d3
FilterNodetrue
FilterNodec5
FilterNodetrue
JoinNodetrue
JoinNodec1
JoinNodec2,c3,c4
FinalNode
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
}
![Page 20: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/20.jpg)
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)
![Page 21: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/21.jpg)
Elemento do conjunto de conflitos(conflict::ConflictSetElement)
Representa uma regra ativa e os objetos que ativaram a regra
Principais Métodos AbstractRule* GetRule() vector<Fact>& GetFacts() unsigned long GetTime()
![Page 22: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/22.jpg)
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>(T* fact) void Modify<T>(T* fact) void Retract<T>(T* fact)
![Page 23: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/23.jpg)
Resultados
CEOPS++ Jeops
Fibonacci(20): 6765 6765
Nº disparos: 32836 32836
Criação da KB > 1 ms 15 ms
Tempo de Execução
565ms 2,5min
Fibonacci
CEOPS++ Jeops
Nº disparos: 92 92
Criação da KB 10 ms 45ms
Tempo de Execução
15 ms 15 ms
Oito rainhas
![Page 24: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/24.jpg)
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
![Page 25: CEOPS++ Integração entre Objetos e Regras de Produção em C++](https://reader036.vdocuments.pub/reader036/viewer/2022062719/5681309c550346895d96882c/html5/thumbnails/25.jpg)
Principais referências Figueira, Carlos. JEOPS – Integração entre objetos e
Regras de produção em Java. Dissertação de Mestrado, CIn – UFPE, 2000.
CLIPS Basic Programming Guide. http://www.ghg.net/clips/download/documentation/bpg.pdf
Soar 8 Manual. http://ai.eecs.umich.edu/soar/sitemaker/docs/manuals/Soar8Manual.pdf.
Vollmann, Detlef. Metaclasses and Reflection in C++. http://vollmann.ch/en/pubs/meta/meta/meta.html.