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