FuzBlock
Projeto de Compiladores
Bruno Edson
Pablo de Santana
FuzBlock - Roteiro
Introdução
Descrição
Modelando um Sistema Fuzzy
API Java
Análises
Geração de código
Exemplos
Conclusões
FuzBlock - Introdução
API para blocos fuzzy
O que é um bloco fuzzy?
Entradas, saídas, lógica fuzzy, grau de
pertinência
Motivação
Projeto de PLC
Lógica Fuzzy (SI)
JEOPS => API java
Compiladores
FuzBlock - Descrição
Linguagem descritiva para modelagem
de blocos fuzzy
Criação de uma API Java
fuzblock.*;
Modelagem de:
Funções de pertinência, conjuntos,
variáveis, operações, (de)fuzzificação e
inferência
FuzBlock - Descrição
Sintaxe própria e simples, semelhante
à Java
Compilador para java
Utilização:
Educacional – aprendizagem da Lógica
Fuzzy e IA
Sistemas de controle com IA, sensores, e
outras aplicações
Modelando um Sistema Fuzzy
Blocos
Pacotes
Variáveis (entrada, saída, restritas)
Tipos
Operações
Funções
Blocos
block Nega {
varin float entra;
varout float sai = - entra;
}
Obs.: entrada e saída.
Pacotes
package
import
(único)
(vários)
Variáveis - Declarações
varin (acesso de entrada ao bloco)
var (acesso restrito ao bloco)
definida antes de var e varout
definida antes de varout, depois de varin
varout (acesso de saída ao bloco)
definida depois de var e varin
Tipos
integer
float
set
FuzzyBlock
10, 5
1.3, 0.45
ramp(t, 10, 20)
b.frio
Operações
not
or
and
xor
Funções
Valores
value () – retorna o seu valor considerado
defuz () – retorna o valor de defuzzificação *
decide () – retorna a variável de decisão ou a
decisão
Conjuntos (set):
ramp (e, v, v)
sine (e, v, v)
trap (e, v, v, v, v)
bell (e, v, v, v, v)
* não implementado
API java
Pacotes:
fuzblock (raiz)
util (classes fuzzy)
samples (exemplos)
compiler (compilador)
parser
syntaxtree
visitor
util
API Java - interfaces
IFuzzy
IValue
ISet
IBlock
IFunction
API Java – classes de funções
SetFunction (abstract)
SineFunction
RampFunction
BellFunction
TrapFunction
NotFunction
AndFunction
OrFunction
XorFunction
API java – outras classes
Úteis:
FuzzyValue
FuzzyConstant
Abstratas
FuzzyBlock
FuzzyFunction
Exemplos
Favor
Estacao
Entrada do sistema (variável favorável)
Saída do sistema (estação)
TipoEstacao
Conjunto de ligação
Favor
Conjunto de entrada (ENOS, ZCIT)
Desfavorável, neutro e favorável
Favor
package fuzblock.samples;
block Favor {
varin integer entrada;
varout set desfavoravel = bell(entrada, -1, 25, 25,
51);
varout set neutro = bell(entrada, 24, 50, 50, 76);
varout set favoravel = bell(entrada, 49, 75, 75, 101);
}
Estacao
Conjunto de saída (defuzzificação)
MS, S, N, C, MC
Estacao - regras
Estacao
block Estacao {
varin Favor enos;
varin Favor zcit;
var float ms_value = value(enos.desfavoravel and zcit.desfavoravel);
var float s_value = value((enos.desfavoravel and zcit.neutro) or
(enos.neutro and zcit.desfavoravel));
var float n_value = value(((enos.desfavoravel and zcit.favoravel) or
(enos.neutro and zcit.neutro)) or
(enos.favoravel and zcit.desfavoravel));
var float c_value = value((zcit.favoravel and enos.neutro) or
(zcit.neutro and enos.favoravel));
var float mc_value = value(enos.favoravel and zcit.favoravel);
varout set ms = trap(20 - (10 * ms_value), -1, 0, 10, 20);
varout set s = trap(10 + (10 * s_value), 10, 20, 30, 40);
varout set n = trap(30 + (10 * n_value), 30, 40, 60, 70);
varout set c = trap(60 + (10 * c_value), 60, 70, 80, 90);
varout set mc = trap(80 + (10 * mc_value), 80, 90, 100, 101); }
TipoEstacao
Ligação entre os blocos
Entradas e saídas
Dois objetos Favor (enos e zcit)
ligados ao objeto Estacao
TipoEstacao
block TipoEstacao {
varin integer entradaEnos;
varin integer entradaZcit;
var Favor enosF;
var Favor zcitF;
enosF.entrada = entradaEnos;
zcitF.entrada = entradaZcit;
var Estacao estacao;
estacao.enos = enosF;
estacao.zcit = zcitF;
varout float percentual = defuz(estacao);
varout string tipo = decide(estacao);
varout float valor = value(estacao);
}
Análises
Sintática
Gramática, posições
Contextual
Escopo, tipos
Análises
+------------------------------------------------------------------------------------+
| Bruno Edson M. de Albuquerque Filho ([email protected])|
| Pablo de Santana Barbosa
([email protected])
|
+------------------------------------------------------------------------------------+
Fuzzy Parser Version 1.4: Lendo do arquivo exemplo1.fuz . . .
Fuzzy Parser Version 1.4:
Parser do programa exemplo1.fuz executado em 187 ms.
Inicio do parser em 47 ms.
Tempo do parser foi 140 ms.
Geração de código
Dificuldades
Tempo, projetos, disciplinas paralelas.
Estrutura básica
Código de acordo com o exemplo
Estrutura básica
Extends FuzzyBlock
Cria métodos de acesso aos dados
private (restritos) ou public (livres)
Implementa setRelationships() e
construtores
FuzzyBlock
String name, IFuzzy[] entries, results
Três construtores
get e set todos e específicos
decide, value, defuz *
Favor (setRelationships())
public void setRelationships() {
IFuzzy[] _opers1 = new IFuzzy[4];
_opers1[0] = new FuzzyConstant(-1);
_opers1[1] = new FuzzyConstant(25);
_opers1[2] = new FuzzyConstant(25);
_opers1[3] = new FuzzyConstant(51);
IFuzzy[] _opers2 = new IFuzzy[4];
_opers2[0] = new FuzzyConstant(24);
_opers2[1] = new FuzzyConstant(50);
_opers2[2] = new FuzzyConstant(50);
_opers2[3] = new FuzzyConstant(76);
IFuzzy[] _opers3 = new IFuzzy[4];
_opers3[0] = new FuzzyConstant(49);
_opers3[1] = new FuzzyConstant(75);
_opers3[2] = new FuzzyConstant(75);
_opers3[3] = new FuzzyConstant(101);
this.setDesfavoravel(new
BellFunction("desfavoravel", _opers1,
this.entrada()));
this.setNeutro(new BellFunction("neutro",
_opers2, this.entrada()));
this.setFavoravel(new
BellFunction("favoravel", _opers3,
this.entrada())); }
block Favor {
varin integer entrada;
varout set desfavoravel =
bell(entrada, -1, 25, 25,
51);
varout set neutro =
bell(entrada, 24, 50, 50,
76);
varout set favoravel =
bell(entrada, 49, 75, 75,
101);
}
Conclusões
Objetivos atingidos
Análise sintática e contextual
API java
Dificuldades
Geração de código (tempo)
Simulador (GUI)
defuzzificação