The FuzzyLite Libraries for Fuzzy Logic Control¶
The objective of the FuzzyLite Libraries is to
easily design and efficiently operate fuzzy logic controllers
using object-oriented programming with minimal reliance on external libraries.
License¶
The FuzzyLite Libraries are dual-licensed under:
- the GNU General Public License 3.0 and
- a paid license for commercial purposes.
Please contact sales@fuzzylite.com for more information.
Repositories¶
fuzzylite (C++) ¶
pyfuzzylite (Python) ¶
fuzzylite/pyfuzzylite - GitHub
jfuzzylite (Java) ¶
help ¶
Examples¶
# File: examples/mamdani/ObstacleAvoidance.fll
Engine:ObstacleAvoidance
InputVariable:obstacle
enabled:true
range:0.000 1.000
lock-range:false
term:left Ramp 1.000 0.000
term:right Ramp 0.000 1.000
OutputVariable:mSteer
enabled:true
range:0.000 1.000
lock-range:false
aggregation:Maximum
defuzzifier:Centroid 100
default:nan
lock-previous:false
term:left Ramp 1.000 0.000
term:right Ramp 0.000 1.000
RuleBlock:mamdani
enabled:true
conjunction:none
disjunction:none
implication:AlgebraicProduct
activation:General
rule:if obstacle is left then mSteer is right
rule:if obstacle is right then mSteer is left
// C++
#include"fl/Headers.h"
fl::Engine*engine=fl::FllImporter().fromFile("examples/mamdani/ObstacleAvoidance.fll");
#include"fl/Headers.h"
usingnamespacefl;
Engine*engine=newEngine;
engine->setName("ObstacleAvoidance");
InputVariable*obstacle=newInputVariable;
obstacle->setName("obstacle");
obstacle->setDescription("");
obstacle->setEnabled(true);
obstacle->setRange(0.000,1.000);
obstacle->setLockValueInRange(false);
obstacle->addTerm(newRamp("left",1.000,0.000));
obstacle->addTerm(newRamp("right",0.000,1.000));
engine->addInputVariable(obstacle);
OutputVariable*mSteer=newOutputVariable;
mSteer->setName("mSteer");
mSteer->setDescription("");
mSteer->setEnabled(true);
mSteer->setRange(0.000,1.000);
mSteer->setLockValueInRange(false);
mSteer->setAggregation(newMaximum);
mSteer->setDefuzzifier(newCentroid(100));
mSteer->setDefaultValue(fl::nan);
mSteer->setLockPreviousValue(false);
mSteer->addTerm(newRamp("left",1.000,0.000));
mSteer->addTerm(newRamp("right",0.000,1.000));
engine->addOutputVariable(mSteer);
RuleBlock*mamdani=newRuleBlock;
mamdani->setName("mamdani");
mamdani->setDescription("");
mamdani->setEnabled(true);
mamdani->setConjunction(fl::null);
mamdani->setDisjunction(fl::null);
mamdani->setImplication(newAlgebraicProduct);
mamdani->setActivation(newGeneral);
mamdani->addRule(Rule::parse("if obstacle is left then mSteer is right",engine));
mamdani->addRule(Rule::parse("if obstacle is right then mSteer is left",engine));
engine->addRuleBlock(mamdani);
import fuzzylite as fl
engine = fl.Engine(
name="ObstacleAvoidance",
input_variables=[
fl.InputVariable(
name="obstacle",
minimum=0.0,
maximum=1.0,
lock_range=False,
terms=[fl.Ramp("left", 1.0, 0.0), fl.Ramp("right", 0.0, 1.0)],
)
],
output_variables=[
fl.OutputVariable(
name="mSteer",
minimum=0.0,
maximum=1.0,
lock_range=False,
lock_previous=False,
default_value=fl.nan,
aggregation=fl.Maximum(),
defuzzifier=fl.Centroid(resolution=100),
terms=[fl.Ramp("left", 1.0, 0.0), fl.Ramp("right", 0.0, 1.0)],
)
],
rule_blocks=[
fl.RuleBlock(
name="mamdani",
conjunction=None,
disjunction=None,
implication=fl.AlgebraicProduct(),
activation=fl.General(),
rules=[
fl.Rule.create("if obstacle is left then mSteer is right"),
fl.Rule.create("if obstacle is right then mSteer is left"),
],
)
],
)
importcom.fuzzylite.*;
Engineengine=newEngine();
engine.setName("ObstacleAvoidance");
InputVariableobstacle=newInputVariable();
obstacle.setName("obstacle");
obstacle.setDescription("");
obstacle.setEnabled(true);
obstacle.setRange(0.000,1.000);
obstacle.setLockValueInRange(false);
obstacle.addTerm(newRamp("left",1.000,0.000));
obstacle.addTerm(newRamp("right",0.000,1.000));
engine.addInputVariable(obstacle);
OutputVariablemSteer=newOutputVariable();
mSteer.setName("mSteer");
mSteer.setDescription("");
mSteer.setEnabled(true);
mSteer.setRange(0.000,1.000);
mSteer.setLockValueInRange(false);
mSteer.setAggregation(newMaximum());
mSteer.setDefuzzifier(newCentroid(100));
mSteer.setDefaultValue(Double.NaN);
mSteer.setLockPreviousValue(false);
mSteer.addTerm(newRamp("left",1.000,0.000));
mSteer.addTerm(newRamp("right",0.000,1.000));
engine.addOutputVariable(mSteer);
RuleBlockmamdani=newRuleBlock();
mamdani.setName("mamdani");
mamdani.setDescription("");
mamdani.setEnabled(true);
mamdani.setConjunction(null);
mamdani.setDisjunction(null);
mamdani.setImplication(newAlgebraicProduct());
mamdani.setActivation(newGeneral());
mamdani.addRule(Rule.parse("if obstacle is left then mSteer is right",engine));
mamdani.addRule(Rule.parse("if obstacle is right then mSteer is left",engine));
engine.addRuleBlock(mamdani);
Features¶
6 Controller Types¶
Mamdani, Takagi-Sugeno, Larsen, Tsukamoto, Inverse Tsukamoto, Hybrid.
25 Linguistic Terms¶
5 Basic: Triangle, Trapezoid, Rectangle, Discrete, SemiEllipse.
8 Extended: Bell, Cosine, Gaussian, GaussianProduct, PiShape, SigmoidDifference, SigmoidProduct, Spike.
7 Edges: Arc, Binary, Concave, Ramp, Sigmoid, SShape, ZShape.
3 Functions: Constant, Linear, Function.
2 Special: Aggregated, Activated.
7 Activation methods¶
General, Proportional, Threshold, First, Last, Lowest, Highest.
9 T-Norms for Conjunction and Implication¶
Minimum, AlgebraicProduct, BoundedDifference, DrasticProduct, EinsteinProduct, HamacherProduct, NilpotentMinimum, LambdaNorm, FunctionNorm.
11 S-Norms for Disjunction and Aggregation¶
Maximum, AlgebraicSum, BoundedSum, DrasticSum, EinsteinSum, HamacherSum, NilpotentMaximum, NormalizedSum, UnboundedSum, LambdaNorm, FunctionNorm.
7 Defuzzifiers¶
5 Integral: Centroid, Bisector, SmallestOfMaximum, LargestOfMaximum, MeanOfMaximum.
2 Weighted: WeightedAverage, WeightedSum.
7 Hedges¶
Any, Not, Extremely, Seldom, Somewhat, Very, Function.
3 Importers¶
FuzzyLite Language (fll), Fuzzy Inference System (fis), Fuzzy Control Language (fcl).
8 Exporters¶
Python, C++, Java, FuzzyLite Language (fll), FuzzyLite Dataset (fld), R script,
Fuzzy Inference System (fis), Fuzzy Control Language (fcl).
30+ Examples¶
Mamdani, Takagi-Sugeno, Tsukamoto, and Hybrid controllers from fuzzylite, Octave, and Matlab.
Examples in C++, Python, Java, fll, fld, R, fis, and fcl.
Flexibility¶
Easily extend the library by adding your own linguistic terms, activation methods, T-Norms and S-Norms, defuzzifiers, and hedges.
Reference¶
If you are using the FuzzyLite Libraries, please cite our article as follows:
Juan Rada-Vilela. The FuzzyLite Libraries for Fuzzy Logic Control, 2018. URL https://fuzzylite.com.
Or using bibtex:
@misc{
fl::fuzzylite,
author={Juan Rada-Vilela},
title={The FuzzyLite Libraries for Fuzzy Logic Control},
url={https://fuzzylite.com},
year={2018}
}
fuzzylite® is a registered trademark of FuzzyLite
pyfuzzylite™ is a trademark of FuzzyLite
jfuzzylite™ is a trademark of FuzzyLite
QtFuzzyLite™ is a trademark of FuzzyLite