Lógica Fuzzy

Olá, pessoal, tudo bom?
Eu estou desenvolvendo um sistema em Java no qual a sua funcionalidade é gerar questionários online inteligente (de acordo com um nível de dificuldade), para desenvolver este sistema estou utilizando a lógica fuzzy na geração do questionário.

De modo geral o meu sistema fuzzy contém 1 variável de entrada (nível de dificuldade), 9 regras e 3 variáveis de saída (porcentagem de questões fáceis, médias e dificeis)

Porém ao realizar o teste destas regras no MATLAB, eu obtive alguns valores estranhos, por exemplo:

Para a entrada NivelDificuldade = 2.5, a saída é:
PorcentagemQuestõesFaceis = 0,45 (45%),
PorcentagemQuestõesMédias = 0,54 (54%),
PorcentagemQuestõesDificeis = 0,18 (18%)

Aparentemente o valor atribuído para cada porcentagem está correto, porém a soma das porcentagens está ultrapassando 1.0 (100%), e a minha dúvida é se isto é normal pois na prática são 3 sistemas diferentes (um para cada porcentagem), eu pesquisei na internet e vi que isto pode ocorrer por ser 3 sistemas fuzzy diferentes.
E se for normal, a solução seria tentar normalizar estes valores?

Eu já realizei este teste no MATLAB e em mais 2 bibliotecas de lógica fuzzy para Java e em todas obtive os mesmos resultados.

Para quem quiser olhar, as regras que eu defini foram estas:

     RULE 1 :    IF nivelDificuldade IS facil 
                THEN porcentagemQuestoesFaceis IS alto;

    RULE 2 :    IF nivelDificuldade IS facil 
                THEN porcentagemQuestoesMedias IS baixo;

    RULE 3 :    IF nivelDificuldade IS facil 
                THEN porcentagemQuestoesDificeis IS baixo;

    RULE 4 :    IF nivelDificuldade IS intermediario 
                THEN porcentagemQuestoesFaceis IS baixo;

    RULE 5 :    IF nivelDificuldade IS intermediario 
                THEN porcentagemQuestoesMedias IS alto;

    RULE 6 :    IF nivelDificuldade IS intermediario 
                THEN porcentagemQuestoesDificeis IS baixo;

    RULE 7 :    IF nivelDificuldade IS dificil 
                THEN porcentagemQuestoesFaceis IS baixo;

    RULE 8 :    IF nivelDificuldade IS dificil 
                THEN porcentagemQuestoesMedias IS baixo;

    RULE 9 :    IF nivelDificuldade IS dificil 
                THEN porcentagemQuestoesDificeis IS alto;            

Desde já, obrigado.

Até Mais.

Vinícius

Como estão suas funções de entrada? Provavelmente foram colocadas de forma a somar mais de 1.
Não é considerado a melhor das práticas, mas não interfere muito no resultado final. Algumas APIs de lógica fuzzy permitem normalizar o resultado dessa saída (dividir cada percentual pela soma dos percentuais).

Olá ViniGodoy, obrigado pela ajuda, então, eu tenho somente uma entrada (Nível de dificuldade),
e tenho 3 conjuntos fuzzy:

Fácil: a função de pertinência é triangular (-4, 0 , 4)
Intermediário: a função de pertinência é trapezoidal (0, 4, 6, 10)
Dificil: a função de pertinência é triangular (6, 10, 14)

Se for possível normalizar, é ótimo, mas estou com receio que o que eu fiz possa estar errado, desde já, muito obrigado :wink:

E como você chegou a esses valores?

Normalizar é interessante para deixar que um usuário que não entende nada de fuzzy desenhe as funções em algum editor gráfico.
Sem normalizar, você deve desenhar o gráfico das funções e garantir que em todos os pontos eles somem o valor máximo.

Então, para chegar a estes valores eu criei 3 sistemas fuzzy:
A entrada nivel de dificuldade eu repito ela para os 3 sistemas

  1. Para retornar a porcentagem de questões fáceis

Regras:

IF nivelDificuldade IS facil
THEN porcentagemQuestoesFaceis IS alto;
IF nivelDificuldade IS medio
THEN porcentagemQuestoesMedias IS baixo;
IF nivelDificuldade IS dificil
THEN porcentagemQuestoesDificeis IS baixo;

  1. Para retornar a porcentagem de questões médias

Regras:

IF nivelDificuldade IS facil
THEN porcentagemQuestoesFaceis IS baixo;
IF nivelDificuldade IS medio
THEN porcentagemQuestoesMedias IS alto;
IF nivelDificuldade IS dificil
THEN porcentagemQuestoesDificeis IS baixo;

  1. Para retornar a porcentagem de questões dificeis

Regras:

IF nivelDificuldade IS facil
THEN porcentagemQuestoesFaceis IS baixo;
IF nivelDificuldade IS medio
THEN porcentagemQuestoesMedias IS baixo;
IF nivelDificuldade IS dificil
THEN porcentagemQuestoesDificeis IS alto;

Método de defuzificação que eu estou utilizando é o centroid, então como falei, na prática são 3 sistemas fuzzy diferentes, imagino que deva ser isto que impeça que os valores saiam normalizados, posso estar enganado pois sou iniciante neste assunto, mas não teria como eu integrar estes 3 sistemas fuzzy em único.

[quote=ViniGodoy]E como você chegou a esses valores?

Normalizar é interessante para deixar que um usuário que não entende nada de fuzzy desenhe as funções em algum editor gráfico.
Sem normalizar, você deve desenhar o gráfico das funções e garantir que em todos os pontos eles somem o valor máximo.[/quote]

Se você quiser eu posto as imagens aqui dos meus conjuntos fuzzy.

3 sistemas fuzzy distintos são 3 sistemas fuzzy diferentes. Os valores sempre serão diferentes porque após fuzzyficar existem infinitos níveis entre 0 e 1. Muitos valores são arredondados.
Você pode até normalizar ou criar um método para aproximar esses valores mas não é uma solução adequada. O correto é ser apenas um sistema usando os mesmos conjunto fuzzy.

[quote=juliocbq]3 sistemas fuzzy distintos são 3 sistemas fuzzy diferentes. Os valores sempre serão diferentes porque após fuzzyficar existem infinitos níveis entre 0 e 1. Muitos valores são arredondados.
Você pode até normalizar ou criar um método para aproximar esses valores mas não é uma solução adequada. O correto é ser apenas um sistema usando os mesmos conjunto fuzzy.[/quote]

Hummm…entendi, mas no meu caso como eu preciso retornar 3 tipos de porcentagens, como que eu poderia integrar isto em um único sistema?
Pois a única solução que eu encontrei foi dividir o problema em 3, caso não encontre a solução acho que a única saída vai ser optar pelo método da normalização.