PyFuzzyによるFCLファイル読み込みファジィ推論
Python2.6.6での環境をセットアップ
学校の課題で使用するファジィのパッケージを探していたが、
PyPIで検索してみてもFuzzyとPyFuzzyしかめぼしいものがなかった。
その上Fuzzyはpipでインストールするとエラーが発生するため、
公式ホームページでデモなどが豊富だったPyFuzzyを選択した。
現時点での環境はWindows7、Python3.4である。
pip install pyfuzzy
ではインストールできず、
easy_install pyfuzzy
で発見。しかしエラーが発生。どうやらprint文に互換性がなかったようだ。
そこでPython2.6.6をデスクトップにインストール
Python 2.6.6 Release | Python.org
コマンドプロンプトからデスクトップのインストール済みフォルダ内へ。
python.exe
と指定すると3.4ではなく2.6.6が起動することがわかる。
ez_setup.pyを下記リンクからPython26内にダウンロード
https://bootstrap.pypa.io/ez_setup.py
python.exe ez_setup.py
を実行するとPython26ディレクトリ内にScriptsが作成される。
次はScripts内に移動し、
easy_install.exe pyfuzzy
でPyFuzzyをインストールする。今度は問題なくインストールできる。
この時点でのPyFuzzyは、何故かfuzzy.storage以下がインストールされていないため、
下記リンクからpyfuzzyをダウンロードし、
デスクトップ/Python26/Lib/site-packages/pyfuzzy-0.1.0-py2.6.egg/fuzzy/storage/ 内に
対応するfclディレクトリをコピーする。
しかしまだantlr3のインポートエラーが発生するので、
easy_install.exe antlr_python_runtime
でantlr3をインストールする。
これでようやく準備が整った。
FCLファイルの作成
FCL(Fuzzy Control Language)とは、ファジィ論理を実行するための言語であり、
IEC 61131-7により標準化されているドメイン特化言語ある。
上記のリンクがIEC 61131-7の書類PDFであり、この中にFCLファイルの書き方が全て載っているがあまりにも長いため今回必要最小限を解説していく。
ファジィの単位ブロック
- FUNCTION_BLOCK ファジィブロック名 ~ END_FUNCTION_BLOCK
ファジィ推論の一つの単位であるブロック名の定義
入力変数の定義
- VAR_INPUT ~END_VAR
変数名: データ型; (* RANGE(下限 .. 上限) *)
FCLで取り扱えるデータ型は
実数:REAL
整数:INT
である。
出力変数の定義
- VAR_OUTPUT~END_VAR
入力変数ど同様
変数のファジー化
- FUZZIFY 対応変数名 ~ END_FUZZIFY
変数をファジィ化する。(メンバーシップ関数の定義)
TERM メンバーシップ関数名 := (Point1x, Point1y) (Point2x, Point2y) ... ;
上のようなランプ関数のメンバーシップ関数の定義には、
TERM lamp1 := (3, 1) (27, 0);
TERM lamp2 := (3, 0) (27, 0);
のように指定します。
このポイントの指定に、変数を使うことが可能で、
例えば下のような三角形のメンバーシップ関数を取り扱うとき、
TERM triangle := (5, 0) (15, 1) (25, 0);
のように定義しますが、
TERM triangle := (var1, 0) (15, 1) (var2, 0);
というように定義してやることで、入力からメンバーシップ関数を変更することも可能である。
出力変数の非ファジィ化
- DEFUZZIFY 対応変数名 ~ END_DEFUZZIFY
RANGE(min, max);
範囲指定
TERM メンバーシップ関数名 := (Point1x, Point1y) (Point2x, Point2y) ...;
後件部に用いるメンバーシップ関数の定義
METHOD: 非ファジィ化の手法;
非ファジィ化の手法
- CoG (Centre of Gravity) 重心法
- CoGS (Centre of Gravity for Singletons)
- CoA (Centre of Area)
- LM (Left Most Maximum)
- RM (Right Most Maximum)
LM法とRM法は0について左右対称である。
重心法以外については、
IECのpdfを見て確認してほしい。数式が乗っている。
DEFAULT := デフォルト値;
デフォルト値を設定する。
ACCU:ファジィ集合の演算方法;
ファジィ集合の演算方法
- MAX 大きい方の値をとる
- BSUM 1か、二つの値を足し合わせた値のうち小さいほうをとる
- NSUM 1か、二つの値を足し合わせた値のうち大きいほうをとった値で、二つの値を足し合わせたものを割る
ファジィルールの設定
- RULEBLOCK ファジィルールブロック名 ~ END_RULEBLOCK
OR演算子定義
OR: アルゴリズム;
- MAX 大きいほうの値をとる
- ASUM 二つの値を足したものから二つの値をかけたものを引く
- BSUM 1か、二つの値を足し合わせた値のうち小さいほうをとる
AND演算子定義
AND: アルゴリズム
- MIN 小さいほうの値をとる
- PROD 二つの値をかけたものをとる
- BDIF 0か、二つの値を足し合わせたものから1をひいたものをとる
ACT: アクティベート方法 (アクティベート方法はCoGS方式には影響がない)
- PROD 二つの値をかけたもの
- 二つの値のうち小さいほうをとる
RULE ルール番号: IF 状態 THEN 結論;
演算子の優先順位
実際に実行するのはまた次回やります。