Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The defuzzification value seems incorrect. #41

Open
dapeipa opened this issue Sep 12, 2023 · 0 comments
Open

The defuzzification value seems incorrect. #41

dapeipa opened this issue Sep 12, 2023 · 0 comments

Comments

@dapeipa
Copy link

dapeipa commented Sep 12, 2023

I checked the result with Matlab and a Python library, which is the same (-1.22). But with this library, the result is -0.833557. The fuzzy output seems correct, but I think the fuzzy composition points of the output are incorrectly calculated. Then, the defuzzification process gives an incorrect value.

#include <iostream>
#include "../include/Fuzzy.h"

int main(int argc, char *argv[]) {
  
    //FIS
    Fuzzy *fuzzy = new Fuzzy();

    //INPUTS
    FuzzyInput* temperatura = new FuzzyInput(1);    
    FuzzySet* tbaja         = new FuzzySet( 10, 15, 15, 20);    
    FuzzySet* tnormal       = new FuzzySet( 18, 20, 20, 22);            
    temperatura->addFuzzySet(tbaja);
    temperatura->addFuzzySet(tnormal);      
    fuzzy->addFuzzyInput(temperatura);
    
    FuzzyInput* humedad     = new FuzzyInput(2);        
    FuzzySet* halta         = new FuzzySet( 40, 55,  55,  70);    
    FuzzySet* hmuyalta      = new FuzzySet( 60, 70, 100, 100);    
    humedad->addFuzzySet(halta);
    humedad->addFuzzySet(hmuyalta);
    fuzzy->addFuzzyInput(humedad);
      
    //OUTPUTS
    FuzzyOutput *variacionTemperatura = new FuzzyOutput(1);    
    FuzzySet* bajadapequeña           = new FuzzySet(-7.5, -2.5, -2.5,    0);    
    FuzzySet* mantener                = new FuzzySet(  -1,    0,    0,    1);    
    FuzzySet* subidapequeña           = new FuzzySet(  0,   2.5,  2.5,  7.5);    
    FuzzySet* subidanormal            = new FuzzySet(2.5,    5,     5,   10);            
    variacionTemperatura->addFuzzySet(bajadapequeña);
    variacionTemperatura->addFuzzySet(mantener);
    variacionTemperatura->addFuzzySet(subidapequeña);
    variacionTemperatura->addFuzzySet(subidanormal);
        
    fuzzy->addFuzzyOutput(variacionTemperatura);

    //RULES    
            
    FuzzyRuleAntecedent *ifBA = new FuzzyRuleAntecedent();
    ifBA->joinWithAND(tbaja, halta);        
    FuzzyRuleAntecedent *ifBMA = new FuzzyRuleAntecedent();
    ifBMA->joinWithAND(tbaja, hmuyalta);        
        
    FuzzyRuleAntecedent *ifNA = new FuzzyRuleAntecedent();
    ifNA->joinWithAND(tnormal, halta);        
    FuzzyRuleAntecedent *ifNMA = new FuzzyRuleAntecedent();
    ifNMA->joinWithAND(tnormal, hmuyalta);        
        
    FuzzyRuleConsequent *thenSP = new FuzzyRuleConsequent();
    thenSP->addOutput(subidapequeña);
    FuzzyRuleConsequent *thenSN = new FuzzyRuleConsequent();
    thenSN->addOutput(subidanormal);    
    FuzzyRuleConsequent *thenM = new FuzzyRuleConsequent();
    thenM->addOutput(mantener);
    FuzzyRuleConsequent *thenBP = new FuzzyRuleConsequent();
    thenBP->addOutput(bajadapequeña);    
            
    FuzzyRule *fuzzyRule9  = new FuzzyRule(9, ifBA,  thenSP);
    FuzzyRule *fuzzyRule10 = new FuzzyRule(10, ifBMA, thenSN);    
    FuzzyRule *fuzzyRule14 = new FuzzyRule(14, ifNA,  thenM);
    FuzzyRule *fuzzyRule15 = new FuzzyRule(15, ifNMA, thenBP);
                  
    fuzzy->addFuzzyRule(fuzzyRule9);
    fuzzy->addFuzzyRule(fuzzyRule10);    
    fuzzy->addFuzzyRule(fuzzyRule14);
    fuzzy->addFuzzyRule(fuzzyRule15);
    
    fuzzy->setInput(1, 19.5);
    fuzzy->setInput(2, 65);

    fuzzy->fuzzify();

    //float o = fuzzy->defuzzify(1);
    //std::cout << "Running with: Temperature->" << 19.5 << ", Humidity->" << 65 << ". Result: " << o << std::endl;        
    
    temperatura->calculateFuzzySetPertinences();
    std::cout << "Input: \n\tTemperatura:  Baja->" << tbaja->getPertinence() << ", Normal->" << tnormal->getPertinence() <<  std::endl;
    humedad->calculateFuzzySetPertinences();
    std::cout << "\tHumedad: Alta-> " << halta->getPertinence() << ", Muy Alta->" << hmuyalta->getPertinence() << std::endl;
    
    std::cout << "Output: \n\tVariación temperatura: Bajada pequeña-> " << bajadapequeña->getPertinence()  << ", Mantener-> " << mantener->getPertinence() << std::endl;
    std::cout << "\tVariación temperatura: Subida pequeña-> " << subidapequeña->getPertinence() << ", Subida Normal->" << subidanormal->getPertinence() <<  std::endl;
    
    std::cout << "RESULT: " << variacionTemperatura->getCrispOutput() << std::endl;
    
    return 0;
}

The ouput is:

Input: 
        Temperatura:  Baja->0.1, Normal->0.75
        Humedad: Alta-> 0.333333, Muy Alta->0.5
Output: 
        Variación temperatura: Bajada pequeña-> 0.5, Mantener-> 0.333333
        Variación temperatura: Subida pequeña-> 0.1, Subida Normal->0.1
RESULT: -0.833557

The correct output (MATLAB):
matlabFIS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant