Fuzzy Logic

Posted on junho 19, 2011 by

0



Olá pessoal, como estamos!?

Fuzzy Logic permite a construção de sistemas elaborados para tomada de decisão. Trata-se de um conceito amplo e rico.

Nesse post, apresento alguns conceitos fundamentais desse tema.

Além do falso e verdadeiro

Quando estamos descrevendo um cenário do mundo real, raramente é conveniente, ou mesmo possível, definir alguns valores de estado como puramente verdadeiros ou falsos. Geralmente há um continuum entre esses dois extremos. Ou seja, sem assumir nenhuma dessas duas formas, em absoluto.

Considere, por exemplo, que estejamos desenvolvendo um sistema que monitore um tanque de combustível. Embora existam situações onde o tanque esteja completamente cheio (tanqueCheio = true, tanqueVazio=false), e outras em que o tanque esteja completamente vazio (tanqueCheio = false, tanqueVazio = true), na maior parte do tempo estaremos em um estado intermediário (tanqueCheio = false, tanqueVazio = false).

Em muitas linguagens de programação, costumamos representar o valor verdadeiro com o número 1. Além disso, costumamos definir o valor falso com o número 0. Em lógica fuzzy, assumimos que, além desses dois extremos, um valor de estado pode assumir qualquer posição nesse intervalo. Voltando ao exemplo anterior, poderíamos dizer que um tanque combustível está com 70% de sua capacidade total ocupada. Ou seja. está 70% cheio e 30% vazio (tanqueCheio = 0,7 e tanqueVazio = 0,3).

Fuzzy Set

Considere o desenvolvimento de um jogo, onde um personagem possa estar “ferido” ou “saudável”. Cada um desses atributos poderia ser descrito como um predicado. Cada personagem poderia possuir, ou não, um desses predicados.

Assumindo a lógica tradicional, onde cada predicado pode assumir apenas dois estados (presente ou ausente / verdadeiro ou falso), não haveria a possibilidade de um personagem “estar”, ao mesmo tempo, ferido e machucado.

A lógica Fuzzy extende a noção de predicados assumindo que eles podem assumir um peso. Assim, um personagem de jogo poderia estar ferido a um índice de 0,7. Ao mesmo tempo em que estaria saudável a um índice de 0,3. Ou seja, a presença de um predicado não excluiria o outro.

Na terminologia da Fuzzy, o conjunto de coisas que atende a um mesmo predicado fuzzy constitui um Fuzzy Set

Degree of Membership

Como já foi dito, cada predicado Fuzzy possui um peso cujo o valor está, geralmente, entre 0 e 1. Quanto maior for o valor (mais se aproximar de 1), maior será o grau de aderência (degree of membership) nesse predicado. Assim, assumindo um predicado tanqueCombustivelCheio com valor 0.7, é dito que possui 0,7 degree of membership.

Utilizando diferentes intervalos para representar valores fuzzy

Em teoria, qualquer intervalo numérico poderia ser utilizado para representar o grau de aderência a um predicado. Embora a utilização mais comum seja do intervalo entre 0 e 1, é bastante comum, entretanto, implementar lógica fuzzy utilizando valores inteiros (no intervalo entre 0 e 255, por exemplo).

É importante apenas destacar que um valor fuzzy não possui qualquer significado fora da lógica fuzzy. Um engano comum é interpretar um valor fuzzy como uma probabilidade ou percentual. Ocasionalmente, essa interpretação ajuda a entender o que está sendo representado. Entretanto, os resultados da aplicação de técnicas associadas a lógica fuzzy raramente serão os mesmos que seriam obtidos através de técnicas de probabilidade.

Fuzzification e Defuzzification

Lógica fuzzy trabalha apenas com graus de aderência a fuzzy sets. Sempre que tivermos descrições de estado que não estejam conformes com isso, haverá a necessidade de alguma conversão.

Converter um dado regular em um grau de aderência é um processo conhecido como Fuzzification. O processo inverso, sem muita surpresa, é conhecido como Defuzzification.

Fuzzification para dados numéricos

A técnica mais comum de fuzzification consiste na conversão de valores numéricos em graus de aderência para um ou mais Fuzzy Sets.

Voltando ao exemplo do tanque de combustível, poderíamos dizer que o processo o valor numérico representado seria a quantidade de litros de combustível no tanque. Ainda nesse exemplo, poderíamos dizer que o fuzzification para definir o grau de aderência ao fuzzy set tanqueCheio seria definido como nrlitros / capacidade. Enquanto o grau de aderência para o fuzzy set tanqueVazio seria definido por 1 - nrlitros / capacidade.

Repare que não há qualquer limite para o número de membership functions (termo técnico para o Fuzzification de um input para degree of membership) definidos a partir de um único input.

Fuzzification para outros tipos de dados

Além de tipos numéricos, inputs booleanos ou enumerações também são, frequentemente, objeto de fuzzification. A abordagem mais comum, para esses casos, é criar uma lista pré-determinada de graus de aderência para cada valor possível do input.

Defuzzification

Após aplicar toda lógica fuzzy que considerarmos necessária, teremos um conjunto de membership values (outra descrição técnica para degree of membership) que poderá, ou não, ser revertida para outro formato de representação. Infelizmente, não há uma única forma, evidente, de fazer essa reversão.

Defuzzification corresponde, na combinação de um, ou mais, membership values em um único valor de saída. Há várias abordagens para esse processo que descreverei, com mais calma, em outra oportunidade (outro post).

Combinando fatos

A lógica fuzzy é, em muitos sentidos, similar a lógica tradicional. Há operadores lógicos (tais como AND, OR e NOT) que podem ser usados para combinar a “verdade” de fatos simples para compreender a “verdade” de fatos mais complexos.

Na lógica fuzzy, definimos os operadores de forma que:

  • A AND B, corresponda a MIN(a, b);
  • A OR B, corresponda a MAX(a, b);
  • NOT A, corresponda a 1 – a;

Perceba que, da mesma forma que ocorre na lógica tradicional, o operador NOT está relacionado a um único fato. Nessa mesma linha de raciocínio, AND e OR estão, sempre, relacionados a dois fatos.

Da mesma forma, as correspondências presentes na lógica tradicional são também válidas para a lógica fuzzy. Perceba que:

  • A OR B corresponde a NOT (NOT A AND NOT B);

Usando essas correspondências, obtemos os demais operadores fuzzy. Perceba:

  • A XOR B corresponde a (NOT B AND A) OR (NOT A AND B)
  • A NOR B corresponde a NOT (A OR B)
  • A NAND B corrresponde a NOT (A AND B)

Implementando Fuzzy Operators em C#

Fuzzy operators podem ser implementados facilmente. Observe:

public static class FuzzyOperators
{
        static void ThrowIfInvalidMembershipValue(float p, string parName)
        {
                if (p < 0 || p > 1)
                        throw new ArgumentOutOfRangeException(parName);
        }

        public static float And(this float left, float right)
        {
                ThrowIfInvalidMembershipValue(left, "left");
                ThrowIfInvalidMembershipValue(right, "right");
                return Math.Min(left, right);
        }

        public static float Or(this float left, float right)
        {
                ThrowIfInvalidMembershipValue(left, "left");
                ThrowIfInvalidMembershipValue(right, "right");
                return Math.Max(left, right);
        }

        public static float Not(this float value)
        {
                ThrowIfInvalidMembershipValue(value, "value");
                return 1 - value;
        }

        public static float Xor(this float left, float right)
        {
                ThrowIfInvalidMembershipValue(left, "left");
                ThrowIfInvalidMembershipValue(right, "right");
                return (left.And(right.Not)).Or(left.Not().And(right));
        }

        public static float Nor(this float left, float right)
        {
                ThrowIfInvalidMembershipValue(left, "left");
                ThrowIfInvalidMembershipValue(right, "right");
                return (left.Or(right)).Not();
        }

        public static float Nand(this float left, float right)
        {
                ThrowIfInvalidMembershipValue(left, "left");
                ThrowIfInvalidMembershipValue(right, "right");
                return (left.And(right)).Not();
        }
}

Fuzzy Rules

Fuzzy Rule relaciona membership values de determinados fuzzy sets para calcular o membership value em outros fuzzy sets. Poderíamos dizer, por exemplo, que: "Se estivermos em alta velocidade e próximos de uma curva, então deveríamos freiar".

Essa rule relaciona dois fuzzy sets como entradas: "estamos em alta velocidade" e "estamos próximos a uma curva". Essa combinação determina um terceiro fuzzy set: "deveríamos freiar". Expressando isso em Fuzzy, teríamos:

  • Deveríamos Freiar = MIN(estamos em alta velocidade, próximos de uma curva)

Se soubermos que estamos em alta velocidade, na ordem de 0.7, e que estamos próximos a uma curva, na ordem de 0.9, então saberemos que o membership value para deveríamos freiar deve corresponder a 0.7.

Caso exista mais de uma fuzzy rule para definir um mesmo membership value, então, aquela que gerar maior aderência deverá ser assumida.

Por hoje, era isso.

Posted in: Arquitetura