ルールエンジンのアルゴリズム(2)

(前回の続き)
もっとも、入力データのチェックなどは、ルールのパターンマッチの側面こそ利用していますが、一方でルールの実行中に入力データが変わっていくわけではないので、先に挙げたルールの実行サイクルを何度も回して結果を出すという特徴的なところはあまり利用していないとも言えます。

では、よりルールエンジンの動きの特徴が表れている例というとどんな例があげられるでしょうか。思うに、たとえば質問に対して答えていき最後に結果を出すといったコンサルティングというか、レコメンドというか…といったシステムの例はそのひとつではないでしょうか。

この動きをルールエンジンの実行サイクルに合わせて見てみましょう。まずは、

1.システムは利用者に対して最初の質問を投げます。
2.利用者は質問に対する回答を行いその回答はデータとして(短期)記憶領域に書かれます。
3.システムはこの回答に合ったルールを選び出し、次の質問を利用者に投げます。
4.利用者はさらに回答を行い結果は記憶領域に書かれます。
5.システムは今までに出した質問の結果と今回の質問の結果を合わせて条件に合うルールを選び出し、さらに質問を繰り返していきます…。
6.そして最後に十分に絞り込まれた結果が得られそれ以上尋ねる質問がなくなった(マッチするルールがなくなった)ところで利用者に結果を返します。

これだけではあまりに抽象的なので、もう少しかみくだいた例として、たとえば、料理に合うワインをおすすめするといった場合を考えてみましょう(この具体的な実装は、Clipsというツールの例としてあげられています)。

まず質問としては、

1.料理は肉、魚、鳥料理のうちのどれですか?
2.料理にはソースがかかっていますか?
3.ソースは、スパイシー、甘口、クリーム、トマトのうちのどれですか?
4.料理の味は、繊細、ふつう、強めのうちのどれですか?
5.ワインとしてお好きなのは赤と白とどちらですか?
……

といった感じ。これら質問をルールとして保持し、ルールの実行部分で質問の回答を記憶領域に書くようにしておきます。
さて、まず最初に1.の質問のルールが動き、質問に対して「肉」という回答をすると、(短期)記憶領域に

・「料理は肉」

と書かれます。次に2.の質問に、「ソースがかかっていない」という回答をすると、記憶領域に

・「料理にはソースがかかっていない」

という事実が追加されます。
次に3.の質問。これは本来、料理にソースがかかっていなければ意味のない質問です。したがって、3.の質問を行うルールの条件部分には「料理にはソースがかかっている」という前提条件を加えておきます。そうすると、現在の記憶領域の状態

・「料理は肉」
・「料理にはソースがかかっていない」

に3.の質問ルールはマッチしないので、ルールは実行されません。一方、2.でソースがかかっていると回答すると自然に3.のルールもマッチしてきます。

このように、質問を行う各ルールの前提条件をきちんと書いておけば、意味のない質問をすることもなく、効率的に結果を求めることができましょう。

さて、実は上の議論では少々ゴマカシがあるのですが、お気づきでしょうか。上の議論では、1.から順に実行することが前提となっているような書き方になっていますが、ルールエンジンの一般的な動きでは上から順に動くという保証はありません。順番に関して何も指定していない(*1)と、上記のルールのうち1.2.4.5.のどのルールが最初に動くかの保証は何もありません。
まあ、論理的には最初に1.2.4.5.のどの質問から聞いても結果は同じなのですが、ワインの好みに対して聞く4.5.の順番はともかく、1.2.は気持ちとしては、1.の次に2.を聞くのがふつうかと。こんなときには、
A. 2.の前提条件に料理の種類が決まっている条件。
具体的には、「料理は○○」という事実があるという条件を加える。
B. ルールに優先度をつけて、1.が2.よりも先に動くようにする。
というような解決方法があります。まあ、ルールの一般的なお作法としては、A.のほうが推奨ですが、ケースバイケースで一概にどちらがいいというわけでもありません。
さらに質問のかたまり間で順番をつけたいという場合に、たとえば料理に関する質問のルール、ワインの好みに関する質問のルールといったかたまりの間での順番をつけたいというときには、ルールのかたまりとその順番を定義するという仕組みがたいていのルールエンジンに標準的に装備されています(Droolsでは、アジェンダグループとか、ルールフローとか)。

(*1) 実は、ルールが動く順番は全くのランダムというわけではなく、たいていの場合何らかの規則にしたがって、実行されるルールが選ばれます。この規則を競合解消戦略といって、考え方としては、「最新の情報を優先する」、「一般的な条件のルールと、より特殊な条件のルールと両方にマッチした場合は、特殊な条件のルールを優先する」などといった基準があります。

コメント

タイトルとURLをコピーしました