On this page |
概要 ¶
エージェントを以下のように動かしたい場合…
-
妨げられない限り、前方へ動く。
-
障害物に近づいた場合、スペースがあれば左または右へ曲がる。
-
スペースがない場合、速度を落として停止する。
この挙動をブール論理を使って定義しようとすると、“パスがどのようにブロックされるか”, “十分なスペースの大きさとはどのくらいか”, “どのくらい曲がるのか”などの難しい定義をすぐに考え出す必要があります。
例えば、障害物が20m以下の距離
にある場合を“ブロックする”と考えると、エージェントは20.1mの距離にある障害物に反応しません。
ファジィ論理では、20mの距離には、1の“ブロック”値があり、40mの距離には、0の“ブロック”値があると考えることができます。20mの距離での“ブロックなし”から“ブロック”への明確な切り替えではなく、 40mから20mまでの距離には、“ブロックの度合い”の増加勾配があることになります。
ファジィ論理の基本 ¶
ファジィ論理 は、複雑な群衆挙動の構築に役立つツールです。 ブール論理では、各変数はfalseかtrueのどちらかですが、ファジィ論理では、0(完全にfalse)と1(完全にtrue)の間で考えられる真理値の範囲を許容します。 これにより、障害物に対して比較的形式張らない反応の仕方などの挙動を指定することができます。
ファジィ集合 ¶
ブール論理では、ステートメントはfalseかtrueのどちらかです。 例えば、“Xは背が高い”というステートメントは、trueまたはfalseになり…Xは背が高い、または背が高くないということになります。 ステートメントをテスト可能にするために、例えば180cmという区切りを設定すると、180cm以上の身長のみを“背が高い”と言うことができます。
しかし、これでは我々が実際に現実で考えている方法に合っていません。これは、(例えば179cmと180cmの)極めて身長が近い2人を“背が低い”および“背が高い”と分けるような直観的でない状況になってしまいます。 我々は、明確な区別を行なわずに、様々な度合い(例えば、“高くない”, “高い方”, “やや高い”, “非常に高い”など)で“背が高い”と考えます。“背が高い”という我々の概念が ファジィ です。
truth |
||
height |
ファジィ論理では、ステートメントは 真の度合い をとることができます。 これは、入力値(例えば身長)を取得し、“Xは背が高い”というステートメントが指定された身長に対して、 どの程度、真であるか を表現する 真理値 を出力する関数として表現することができます。 例えば、1.6mの身長はやや“背が高い”が、1.8mほど高くないということになります。
また、 Xは“背が高い”という集合のメンバーである度合い として考えることもできます。
truth |
||
height |
単一の入力値は、いろいろな度合いで複数の集合のメンバーとなることができます。 例えば、3個の集合: “short”, “medium”, “tall”を設定することができます。これは、指定した値からメンバーシップを決定するのに3つの関数を持ちます。
メンバーシップは重複が可能です。例えば、Xは同時に“0.1 short且つ0.9 medium”になることができます。(物事を理解しやすくするために、異なる集合の真理値は、常に合計が1になります。)
truth |
||
height |
入力値を集合毎にそれらの真理値に変換することを入力のファジィ化と言います。
規則 ¶
if…then 規則により、最初のメンバーシップから他の集合のメンバーシップを派生することができます。 例えば、電車の制御システムを構築している場合を考えてみます。 乗客の乗り心地を保証するために、電車のブレーキ加速度が、電車から前方の次の電車までの距離および電車の現行速度から決まるようにします。
2個の 入力 ファジィ変数: distance と speed を設定します。
-
distanceは、電車から次の電車までの距離です。距離のファジィ集合は、 near , medium , far です。
-
speedは、電車の現行速度です。速度のファジィ集合は、 slow , normal , fast です。
派生した ファジィ変数: braking を設定します。braking
は、distance
とspeed
から計算されます。braking
は、 none , low , medium , high のファジィ集合のメンバーとなることができます。
以下の規則により、speed
とdistance
をbraking
に変換します:
If… |
Then |
---|---|
|
|
|
|
|
|
else |
|
ブール論理がAnd, Or, Notを使用することでtrue/false値を組み合わせることができるのと同様に、 ファジィ論理には、それと同等のFuzzy And, Fuzzy Or, Fuzzy Not演算があります。 ファジィ入力とファジィ演算子を組み合わせて、ファジィ集合を出力します。 例えば、指定したspeedとdistanceで上記の規則を出力すると、braking変数は、“0 none, 0.1 low, 0.7 medium, 0.2 high”になります。
出力の非ファジィ化 ¶
ほとんどの場合、集合のメンバーシップが分かっても、挙動の指示には役に立ちません。 それよりむしろ、どこかで使用できる具体的な数字が必要です。 上記の電車のブレーキのサンプルでは、ファジィブレーキ集合を、ブレーキに適用するフォース量(例えば、0-100の範囲)に対する単一の数字に置き換える必要があります。
非ファジィ化は、ファジィ集合のメンバーシップを取得して、 クリスプ 値(明確な値)に変換するプロセスです。
例えば、ファジィbraking
変数が、“0 low, 0.2 medium, 0.7 high”の場合、これは、braking = 60
というクリスプ出力(明確な出力)に変換されます。
非ファジィ化は、ファジィ集合の統合を伴います。 Houdiniでは、この統合をするのに2つのメソッドがあります: 最も強い真理値を持つ関数(maximum)を使用、またはメンバーシップ関数を合算(sum)することです。
統合前に、各メンバーシップ関数は、そのファジィ集合の真理値によりクリップされます。真理値よりも大きい値は、真理値に制限されます。
つまり、統合されたファジィ集合は、システム(定義されたメンバーシップ関数)と入力(各集合の真理を推測する変数)の両方の関数です。
統合集合は、このグラフのようにポリゴンとして生じます。Houdiniは、グラフの重心を取り、クリスプ出力値を取得します。
Houdiniのファジィ論理 ¶
Houdiniでは、VOPを使用して、ファジィ論理のネットワークを作成することができます。 例えば、POP VOP DOP内のファジィ論理ノードを使用して、群衆シミュレーションでエージェントに対するアトリビュートを制御することができます。
-
Fuzzy Input VOPを作成して、クリスプ入力変数をファジィ化します。入力は、通常、速度, 近接度, またはBind VOPによりインポートするターゲットまでの距離などのエージェントアトリビュートです。Fuzzy Inputノードは、各アトリビュートをファジィ集合に変換します。
Fuzzy Inputノードのランプパラメータを使用して、ファジィ集合のメンバーシップ関数を設定することができます。ノードには、一般的に使用される関数に対して、いくつかのランププリセットがあります。
-
Fuzzy Inputの出力は、ファジィ値の浮動小数点(集合メンバーシップ強度)で、メンバーシップ関数と強度の両方を持つ
FuzzySet
構造体です。 -
論理ネットワークの出力をFuzzy Inference VOP内に接続します。このノードは、その入力に基づいて新しい集合を生成します。これは、規則の“then”の部分を表します。
電車のブレーキのサンプルでは、ネットワークの“if
fast
andnear
…”の部分を、ファジィブレーキ変数high
の強度を推測する推理ノードへ接続することになります。つまり、fast
とnear
の強度は、ブレーキhigh
の強度を意味します。他の論理を接続すると、他のファジィ出力変数が作成されます。例えば、
normal
の速度とnear
またはmid
の近接度は、medium
のブレーキを意味します。これは、ネットワークが決めているのではない部分であることに留意してください。 例えば、ブレーキは、
high
,low
, またはmedium
のいずれかになります。 現行の入力のメンバーシップの強度がhigh
,medium
, またはlow
の集合にあるかを計算しています。 -
ファジィ集合をクリスプ値に非ファジィ化するには、推測されたFuzzySet構造体をFuzzy Defuzz VOP内へ接続します。ファジィネットワークから計算したいそれぞれのクリスプ変数に対して、Fuzzy Defuzzが設定されます。
Fuzzy Defuzzには、 Aggregation method のパラメータがあり、ファジィ入力を どのように クリスプ値に変換するかを制御します。
Fuzzy VOP ¶
以下のVOPにより、ファジィ論理ネットワークを実装することができます。
クリスプ入力を、単一のファジィ集合に対する真理値にファジィ化します。このノードにより、新しい集合用にプリセットのメンバーシップ関数の集合から選択したり、ランプパラメータによりカスタムのカーブを描くことができます。 Fuzzy Inputは、真理値(0-1間の浮動小数点)と、(範囲, メンバーシップ関数, 真理値などの)ファジィ集合に関する情報を含む |
|
ファジィ変数を組み合わせます。これらの演算のネットワークは、規則の“If”の部分に対応します。出力は 規則の強度 です。 |
|
新しいファジィ集合を派生します。このノードは、規則の“Then”の部分に対応します。 Fuzzy Inferenceは、(最大または合計)関数により、複数の規則の強度を統合することができます。 そして、規則の強度およびメンバーシップ関数を使用して、新しいファジィ集合で真理値を導きます。このノードは、真理値と新しいファジィ集合に関する情報を含む |
|
Fuzzy Inferenceに似ていますが、 2個 の新しいファジィ集合を作成します: つまり、Fuzzy Inferenceとその逆数から作成されます。これは、trueの度合いに基づく挙動もあれば、trueでない度合いに基づく挙動もあるという状況が必要な場合に役立ちます。 |
|
|
ファジィ入力としてのセンスの使い方 ¶
Fuzzy Obstacle Sense VOPは、エージェントの正面の視野の円錐内に、いくつかの光線を最大距離まで送出します。これにより、距離の配列が作成されます。
便宜上、ヒットの距離は、最大値から減算されるため、近くでヒットすると数字が大きくなり、外れると0
です。
このサンプルでは、3個の光線がエージェントの近くでヒットし、2個が外れ、{20, 60, 0, 0, 30}
という配列が作成されています。
Fuzzy Obstacle Senseにより作成された配列をFuzzy Input VOPに接続することができます。Fuzzy Inputノードは、関数またはランプパラメータを使用して、配列の値にウェイトをかけ、それらを単一の真理値とファジィ集合へ変換します。
このサンプルでは、赤いバーは、センサーノードからの“近さ”値の配列です。 “Left Side is Blocked”のファジィ集合を作成するには、右側の角度よりも左側の角度に大きくウェイトをかけるランプを描きます。 Fuzzy Inputノードは、基本的に、カーブの下に残っている領域によりバーの領域を分割し、単一の真理値を取得します。