ファジー

ちょっと興味があったので、ファジー集合論について勉強してみました。

とりあえずファジー論理、ファジー集合について実装。→リポジトリ

何かものすごくシンプルな理論なんだという感想。実装も簡単でファジー集合はメンバーシップ度を返すだけのただのファンクタ。ファジー集合の和集合や共通集合とかはそれらを組み合わせて新しいファクタを作るだけ。(Boost.Functionを初めて使ってみたけれどこれは便利。)

後はファジー推論だけれども、ファジー集合の積分どうしよう。数値積分しかないか...。
あとファジー推論規則をどうやって記述するか。
Boost.Lambdaを真似てこんな感じで書けたら書きやすいかもしれない。fuzzy_setの羅列が気になるけれど。

// (温度、湿度)から快適度を推論するルールベース
fuzzy_rule_base<int, int, int> kaitekido( ..... );

fuzzy_set<int> ondo_takai = ....;
fuzzy_set<int> ondo_chotto_takai = ...;
....
fuzzy_set<int> shitsudo_takai = ...;
fuzzy_set<int> shitsudo_chotto_takai = ...;
...
fuzzy_set<int> sugoku_kaiteki = ...;
fuzzy_set<int> kaiteki = ...;
//温度が高い もしくは 湿度が高い ならば 快適ではない
kaitekido.add(ondo_takai(_1) || shitsudo_takai(_2) >> kaiteki_janai);
//温度も湿度も普通ならば快適
kaitekido.add(ondo_hutsuu(_1) && shitsudo_hutsuu(_2) >> sugoku_kaiteki);
...

// (20, 15)のペアが当てはまるすべてのルールの右辺集合の和集合を求めて、積分して重心を求める。
int kaitekisa = kaitekido.make_inference(20, 15); // 20℃ 15%