用於模糊邏輯控制的 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 年。
或使用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 的商標