がべーじこれくしょん

はじめまして、未熟者です。

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をダウンロードし、

arruda/pyfuzzy · GitHub

デスクトップ/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により標準化されているドメイン特化言語ある。

http://www.dimat.unina2.it/marrone/dwnld/Normative/IEC/IEC%2061131-7%20Programmable%20controllers%20-%20Fuzzy%20control%20programming.pdf

上記のリンクが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) ... ;

f:id:teftef111:20151008152550p:plain

上のようなランプ関数のメンバーシップ関数の定義には、

TERM lamp1 := (3, 1) (27, 0);

TERM lamp2 := (3, 0) (27, 0);

のように指定します。

このポイントの指定に、変数を使うことが可能で、

例えば下のような三角形のメンバーシップ関数を取り扱うとき、

TERM triangle := (5, 0) (15, 1) (25, 0);

f:id:teftef111:20151008153456p:plain

のように定義しますが、

TERM triangle := (var1, 0) (15, 1) (var2, 0);

というように定義してやることで、入力からメンバーシップ関数を変更することも可能である。

出力変数の非ファジィ化

  • DEFUZZIFY 対応変数名 ~ END_DEFUZZIFY

RANGE(min, max);

範囲指定

 

TERM メンバーシップ関数名 := (Point1x, Point1y) (Point2x, Point2y) ...;

後件部に用いるメンバーシップ関数の定義

 

METHOD: 非ファジィ化の手法;

非ファジィ化の手法
  1. CoG (Centre of Gravity) 重心法
  2. CoGS (Centre of Gravity for Singletons) 
  3. CoA (Centre of Area)
  4. LM (Left Most Maximum) 
  5. RM (Right Most Maximum) 

LM法とRM法は0について左右対称である。

重心法以外については、

IECのpdfを見て確認してほしい。数式が乗っている。

 

DEFAULT := デフォルト値;

デフォルト値を設定する。

 

ACCU:ファジィ集合の演算方法;

ファジィ集合の演算方法
  1. MAX 大きい方の値をとる
  2. BSUM 1か、二つの値を足し合わせた値のうち小さいほうをとる
  3. NSUM 1か、二つの値を足し合わせた値のうち大きいほうをとった値で、二つの値を足し合わせたものを割る

ファジィルールの設定

  •  RULEBLOCK ファジィルールブロック名 ~ END_RULEBLOCK

演算子定義: アルゴリズム;

OR演算子定義

OR: アルゴリズム;

  1. MAX 大きいほうの値をとる
  2. ASUM 二つの値を足したものから二つの値をかけたものを引く
  3. BSUM 1か、二つの値を足し合わせた値のうち小さいほうをとる
AND演算子定義

AND: アルゴリズム

  1. MIN 小さいほうの値をとる
  2. PROD 二つの値をかけたものをとる
  3. BDIF 0か、二つの値を足し合わせたものから1をひいたものをとる

 

ACT: アクティベート方法 (アクティベート方法はCoGS方式には影響がない)

  1. PROD 二つの値をかけたもの
  2. 二つの値のうち小さいほうをとる

 

RULE ルール番号: IF 状態 THEN 結論;

演算子の優先順位
  1. () 鍵かっこ
  2. NOT 否定
  3. AND 論理積
  4. OR 論理和

 

 

実際に実行するのはまた次回やります。