FuzzyBrain
Introduction
FuzzyBrain is a fuzzy logic inference engine completely written in C++. It is designed to be simple to use,extend and to be fast! You can take the code in the /src directory ad add to your project.
Every single variable and fuzzy set in the system can be configured manually, and you can fire the inference as many time you want.
Usage
Conceptually there are several elements that play different roles in the fuzzy inference system.
Component | Role |
---|---|
FuzzySet | Represent a single fuzzy set in a linguistic variable |
Linguistic variable | Fuzzy logic linguistic variable that contain fuzzy sets |
FuzzyRule | Single fuzzy rule written in natural language |
FuzzyObject | Single unit of fuzzy inference, contain linguistic variables and rules |
Defuzzificators | Objects that defuzzify an output variable |
FuzzyEngine | Container of several FuzzyObject |
Let's make an example using code: a fuzzy calculator. '''C++ //First: creation of the fuzzy object calculator = new MamdaniFuzzyObject();
/*
* Creation of the linguistic variables for input and output
*/
InputLinguisticVariable* x = new InputLinguisticVariable("x",-10,10);
TrapezoidalFuzzySet* negative = new TrapezoidalFuzzySet("Negative", -10, -10, -1, 0);
TriangularFuzzySet* zero = new TriangularFuzzySet("Zero", -1,0,1);
TrapezoidalFuzzySet* positive = new TrapezoidalFuzzySet("Positive", 0,1,10,10);
//Add set to variable x
x->addSet(negative);
x->addSet(zero);
x->addSet(positive);
MamdaniOutputVariable* y = new MamdaniOutputVariable("y", -3,3);
TriangularFuzzySet* negative_2 = new TriangularFuzzySet("Negative", -2, -1, 0);
TriangularFuzzySet* positive_2 = new TriangularFuzzySet("Positive", 0,1,2);
TriangularFuzzySet* largenegative = new TriangularFuzzySet("Largenegative", -3, -2, -1);
TriangularFuzzySet* largepositive = new TriangularFuzzySet("Largepositive",1,2,3);
y->addSet(negative_2);
y->addSet(zero);
y->addSet(positive_2);
y->addSet(largenegative);
y->addSet(largepositive);
InputLinguisticVariable* z = new InputLinguisticVariable("z", -10, 10);
z->addSet(negative);
z->addSet(zero);
z->addSet(positive);
calculator->addInputVar(x);
calculator->setOutputVar(y);
calculator->addInputVar(z);
/*
* Adding a series of rules
*/
calculator->addRule(new MamdaniRule("IF x IS Zero AND z IS Negative THEN y IS Negative"));
calculator->addRule(new MamdaniRule("IF x IS Negative AND z IS Negative THEN y IS Largenegative"));
calculator->addRule(new MamdaniRule("IF x IS Negative AND z IS Zero THEN y IS Negative"));
calculator->addRule(new MamdaniRule("IF x IS Negative AND z IS Positive THEN y IS Zero"));
calculator->addRule(new MamdaniRule("IF x IS Zero AND z IS Zero THEN y IS Zero"));
calculator->addRule(new MamdaniRule("IF x IS Zero AND z IS Positive THEN y IS Positive"));
calculator->addRule(new MamdaniRule("IF x IS Positive AND z IS Negative THEN y IS Zero"));
calculator->addRule(new MamdaniRule("IF x IS Positive AND z IS Zero THEN y IS Positive"));
calculator->addRule(new MamdaniRule("IF x IS Positive AND z IS Positive THEN y IS Largepositive"));
/*
* Set input for the variables
*/
calculator->setInput("z",1);
/*
* Fire the inference and get an output
*/
float output = calculator->getOutput();
'
This is a base case using only one FuzzyObject. If needed a FuzzyEngine can be used to collect several fuzzy object, manage relationship between objects and manage input and output. Also you can provide an EngineCreator to import the engine from an XML or other sources.
Documentation
All the documentation for the source code can be found at http://fuzzybrain.pablosproject.com/.
TDD
All the elements in the software are developed using the TDD approach. All the unit test written are stored under the /test folder and are written and executed using GoogleTest (https://code.google.com/p/googletest/). For a guide to setup a TDD environment using Google Test and Eclipse you can watch http://www.pablosproject.com/c-2/test-driven-developement-c-with-eclipse.
Contact
You can contact me for every question at pablosproject@gmail.com or twitter @PablosProject.