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
 Tabela de comparação
Linguag.
Uniformid.
Desempenho
Res.
Conflitos
Facilidade
Integração
Soar
C
-
+/-
-
+/-
Jeops
Java
+
+/-
+
+
Clips
C
-
-
+/-
-
Motor de referência: Jeops
Agente
insert
run
objects
flush
JEOPS
Knowledge
Base
-- - - ----- - - ---- - - - ---- - - ----- - - --
ClassFilter
Decl 1
ClassFilter
Decl 2
ClassFilter
Decl 3
FilterNode
Decl 1
FilterNode
Decl 2
FilterNode
Decl 3
JoinNode
Decl 1
JoinNode
Decls 1 a 2
JoinNode
Decls 1 a 3
Rete
Gera
entradas
Conjunto de Conflito
FinalNode
Regra n
Consulta
Base Interna
de Regras
Base de
Objetos
Base de
Conhecimentos
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>(T* obj)
bool Retract<T>(T* obj)
void GetObjects<T>(vector<T*>& objs)
GetSubclasses<T>(vector<string>&
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<typename T>
inline void TypeCheckFunction(T* type,
vector<string>& subclasses);
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;
}
};
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 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
Arquivo de
Regras
(.rules)
Pré-compilador
CEOPS++
Base de Regras
Regras
(*_rules.h)
(*_rule_*.h)
Compilador C++
Código Objeto
Rete
(rete::Rete)
 Possui apenas a funcionalidade de
memorização das avaliações
realizadas
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
Rete
(rete::Rete)
ClassFilter
d1
ClassFilter
d2, d3
}
FilterNode
true
FilterNode
c5
FilterNode
true
JoinNode
true
JoinNode
c1
JoinNode
c2,c3,c4
FinalNode
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<Fact>& 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>(T* fact)
 void Modify<T>(T* fact)
 void Retract<T>(T* fact)
Resultados
Fibonacci
Oito rainhas
CEOPS++
Jeops
Fibonacci(20):
6765
6765
Nº disparos:
32836
32836
Criação da KB
> 1 ms
15 ms
565ms
2,5min
Tempo de
Execução
CEOPS++
Jeops
Nº disparos:
92
92
Criação da KB
10 ms
45ms
Tempo de
Execução
15 ms
15 ms
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, 2000.
 CLIPS Basic Programming Guide.
http://www.ghg.net/clips/download/documentation/b
pg.pdf
 Soar 8 Manual.
http://ai.eecs.umich.edu/soar/sitemaker/docs/manual
s/Soar8Manual.pdf.
 Vollmann, Detlef. Metaclasses and Reflection in C++.
http://vollmann.ch/en/pubs/meta/meta/meta.html.
Download

CEOPS++ Integração entre Objetos e Regras de Produção em C++