用于模糊逻辑控制的 FuzzyLite 库指的是fuzzylite
(C++)、 pyfuzzylite
(Python) 和jfuzzylite
(Java)。
FuzzyLite 库的目标是遵循面向对象的编程模型,以最小化对外部库的依赖,轻松设计和高效操作模糊逻辑控制器。
fuzzylite
获得GNU GPL 3.0和商业用途专有许可证的双重许可。
强烈建议您通过购买QtFuzzyLite
许可证来支持 FuzzyLite 库的开发。
QtFuzzyLite
是最好的图形用户界面,可轻松实时设计和直接操作模糊逻辑控制器。适用于 Windows、Mac 和 Linux,其目标是显着加快模糊逻辑控制器的设计速度,同时提供非常有用、功能齐全且美观的用户界面。请访问 fuzzylite.com/downloads 免费下载并查看。
访问fuzzylite.com/documentation
(6) 控制器:Mamdani、Takagi-Sugeno、Larsen、Tsukamoto、Inverse Tsukamoto、Hybrid
(25) 语言术语: (5)基本:三角形、梯形、矩形、离散、半椭圆形。 (8)扩展:Bell、Cosine、Gaussian、GaussianProduct、PiShape、SigmoidDifference、SigmoidProduct、Spike。 (7)边:圆弧、二元、凹面、斜坡、S 形、SShape、ZShape。 (3)函数:常数、线性、函数。 (2)特殊:聚合、激活。
(7) 激活方式:一般、比例、阈值、第一、最后、最低、最高。
(9) 连取和蕴涵(T-范数) :Minimum、AlgebraicProduct、BoundedDifference、DrasticProduct、EinsteinProduct、HamacherProduct、Nilpotminum、LambdaNorm、FunctionNorm。
(11) 析取和聚合(S-范数) :Maximum、AlgebraicSum、BoundedSum、DrasticSum、EinsteinSum、HamacherSum、NilpotMaximum、NormalizedSum、UnboundedSum、LambdaNorm、FunctionNorm。
(7) 去模糊器: (5)积分:质心、平分线、最小最大值、最大最大值、平均值。 (2)加权:WeightedAverage、WeightedSum。
(7) 模糊限制语:任何、不、非常、很少、有些、非常、功能。
(3)导入器:FuzzyLite语言fll
、模糊推理系统fis
、模糊控制语言fcl
。
(7) 导出器: C++
、 Java
、FuzzyLite 语言fll
、FuzzyLite 数据集fld
、 R
脚本、模糊推理系统fis
、模糊控制语言fcl
。
(30+)来自fuzzylite
、Octave 和 Matlab 的 Mamdani、Takagi-Sugeno、Tsukamoto 和混合控制器示例,每个示例均采用以下格式: C++
、 Java
、 fll
、 fld
、 R
、 fis
和fcl
。
# File: 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
// File: ObstacleAvoidance.cpp
# include < fl/Headers.h >
fl::Engine* engine = fl::FllImporter().fromFile( " ObstacleAvoidance.fll " );
// File: ObstacleAvoidance.cpp
# include < fl/Headers.h >
using namespace fuzzylite ;
Engine* engine = new Engine;
engine-> setName ( " ObstacleAvoidance " );
engine-> setDescription ( " " );
InputVariable* obstacle = new InputVariable;
obstacle-> setName ( " obstacle " );
obstacle-> setDescription ( " " );
obstacle-> setEnabled ( true );
obstacle-> setRange ( 0.000 , 1.000 );
obstacle-> setLockValueInRange ( false );
obstacle-> addTerm ( new Ramp( " left " , 1.000 , 0.000 ));
obstacle-> addTerm ( new Ramp( " right " , 0.000 , 1.000 ));
engine-> addInputVariable (obstacle);
OutputVariable* mSteer = new OutputVariable;
mSteer -> setName ( " mSteer " );
mSteer -> setDescription ( " " );
mSteer -> setEnabled ( true );
mSteer -> setRange ( 0.000 , 1.000 );
mSteer -> setLockValueInRange ( false );
mSteer -> setAggregation ( new Maximum);
mSteer -> setDefuzzifier ( new Centroid( 100 ));
mSteer -> setDefaultValue (fl::nan);
mSteer -> setLockPreviousValue ( false );
mSteer -> addTerm ( new Ramp( " left " , 1.000 , 0.000 ));
mSteer -> addTerm ( new Ramp( " right " , 0.000 , 1.000 ));
engine-> addOutputVariable ( mSteer );
RuleBlock* mamdani = new RuleBlock;
mamdani-> setName ( " mamdani " );
mamdani-> setDescription ( " " );
mamdani-> setEnabled ( true );
mamdani-> setConjunction (fl::null);
mamdani-> setDisjunction (fl::null);
mamdani-> setImplication ( new AlgebraicProduct);
mamdani-> setActivation ( new General);
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);
using namespace fuzzylite ;
std::string status;
if ( not engine-> isReady (&status))
throw Exception( " [engine error] engine is not ready: n " + status, FL_AT);
InputVariable* obstacle = engine-> getInputVariable ( " obstacle " );
OutputVariable* steer = engine-> getOutputVariable ( " steer " );
for ( int i = 0 ; i <= 50 ; ++i){
scalar location = obstacle-> getMinimum () + i * (obstacle-> range () / 50 );
obstacle-> setValue (location);
engine-> process ();
FL_LOG ( " obstacle.input = " << Op::str (location) <<
" => " << " steer.output = " << Op::str (steer-> getValue ()));
}
一旦您有了用 C++ 编写的引擎,您就可以对其进行编译以创建链接到fuzzylite
库的可执行文件。链接可以是静态的或动态的。基本上,静态链接和动态链接之间的区别如下。
静态链接将fuzzylite
库包含到可执行文件中,从而增加了其大小,但可执行文件不再需要访问fuzzylite
库文件。
动态链接不会将fuzzylite
库包含到可执行文件中,从而减小其大小,但可执行文件需要访问fuzzylite
共享库文件。使用动态链接时,请确保共享库文件与可执行文件位于同一目录中,或者可以通过环境变量访问:
rem Windows:
set PATH = " pathtofuzzylitereleasebin;%PATH% "
# Unix:
export LD_LIBRARY_PATH= " /path/to/fuzzylite/release/bin/: $LD_LIBRARY_PATH "
在 Windows 中编译引擎的命令如下:
C++11(默认)
rem static linking:
cl.exe ObstacleAvoidance.cpp fuzzylite - static .lib / Ipath / to / fuzzylite / EHsc / MD
rem dynamic linking:
cl.exe ObstacleAvoidance.cpp fuzzylite.lib / Ipath / to / fuzzylite / DFL_IMPORT_LIBRARY / EHsc / MD
C++98
rem static linking:
cl.exe ObstacleAvoidance.cpp fuzzylite - static .lib / Ipath / to / fuzzylite / DFL_CPP98 = ON / EHsc / MD
rem dynamic linking:
cl.exe ObstacleAvoidance.cpp fuzzylite.lib / Ipath / to / fuzzylite / DFL_IMPORT_LIBRARY / DFL_CPP98 = ON / EHsc / MD
在 Unix 中编译引擎的命令如下:
C++11(默认)
# static linking
g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite-static --std=c++11
# dynamic linking
g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite
C++98
# static linking
g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite-static -DFL_CPP98=ON
# dynamic linking
g++ ObstacleAvoidance.cpp -o ObstacleAvoidance -I/path/to/fuzzylite -L/path/to/fuzzylite/release/bin -lfuzzylite -DFL_CPP98=ON
或者,您可以使用 CMake 构建链接到fuzzylite
项目。请参阅示例/应用程序中提供的示例应用程序。
您可以使用CMake
(cmake.org) 从源代码构建fuzzylite
库。
检查.github/workflows
了解详细信息。
cmake -B build/ -G " Unix Makefiles " .
cmake --build build/ --parallel
ctest --test-dir build/
cmake -B build/ -G " NMake Makefiles " .
cmake --build build/
ctest --test-dir build/
提供以下构建选项:
-DFL_USE_FLOAT=ON
使用fl::scalar
数据类型作为float
而不是double
构建二进制文件。默认情况下,二进制文件是使用-DFL_USE_FLOAT=OFF
构建的。如果fuzzylite
是使用-DFL_USE_FLOAT=ON
构建的,则链接到fuzzylite
应用程序也需要指定此编译标志。
-DFL_CPP98=ON
使用C++98
功能而不是C++11
构建二进制文件。默认情况下,二进制文件是使用-DFL_CPP98=OFF
构建的。如果您使用C++98
,您将无法使用Benchmark
类对引擎的性能进行基准测试,并且将无法运行任何测试。
-DFL_BACKTRACE=OFF
在发生错误时禁用回溯信息。默认情况下,二进制文件是使用-DFL_BACKTRACE=ON
构建的。在 Windows 中,回溯信息需要外部库dbghelp
,该库通常在您的系统中可用。
fuzzylite
的源代码使用doxygen
格式进行了很好的记录,并且可以在 fuzzylite.com/documentation 上获取该文档。如果您想在本地生成文档,可以使用命令行doxygen Doxyfile
从文件 Doxyfile 生成html
文档。文档将在docs
文件夹中创建。
从源代码构建后,以下是将在Release
模式下创建的相关二进制文件。在Debug
模式下,文件名以-debug
结尾(例如fuzzylite-debug.exe
)。
fuzzylite.exe
fuzzylite.dll
、 fuzzylite.lib
fuzzylite-static.lib
fuzzylite
libfuzzylite.so
libfuzzylite-static.a
fuzzylite
libfuzzylite.dylib
libfuzzylite-static.a
fuzzylite
的控制台应用程序允许您导入和导出引擎。可以通过执行控制台二进制文件来获取其用法。此外,控制台可以设置为交互模式。 FuzzyLite Interactive Console
允许您通过手动提供输入值来评估给定控制器。通过指定输入文件和输出格式来触发交互式控制台。例如,要与ObstacleAvoidance
控制器交互,交互式控制台按如下方式启动:
fuzzylite -i ObstacleAvoidance.fll -of fld
欢迎所有贡献,只要遵循以下准则:
如果您使用 FuzzyLite 库,请在文章中引用以下参考文献:
胡安·拉达-维莱拉。用于模糊逻辑控制的 FuzzyLite 库,2018 年。URL https://fuzzylite.com。
或者使用bibtex
:
@misc { fl::fuzzylite ,
author = { Juan Rada-Vilela } ,
title = { The FuzzyLite Libraries for Fuzzy Logic Control } ,
url = { https://fuzzylite.com } ,
year = { 2018 }
}
fuzzylite® 是 FuzzyLite Limited 的注册商标
jfuzzylite™ 是 FuzzyLite Limited 的商标
pyfuzzylite™ 是 FuzzyLite Limited 的商标
QtFuzzyLite™ 是 FuzzyLite Limited 的商标