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

ルール・エンジンで使用される既存のReteアルゴリズムおよびNon-Reteアルゴリズムの概要を取得します。

2.1 概要

Reteアルゴリズムはチャールズ・フォーギー氏により発明されたもので、彼が1979年に発表した博士論文のテーマでした。当時のエキスパート・システムで使用するために考案されたもので、ルール・エンジンの作業メモリー内のファクトは一連の推論サイクルにわたって徐々に変化するという知見に基づいています。その威力のほとんどは、パフォーマンス向上とメモリー使用量増大のトレードオフの上に成り立っています。

以前のルール条件の評価結果をキャッシングしておけば、作業メモリーに小さな変更を加えるたびに、すべてのルール条件を再評価する必要がなくなります。しかし、ビジネス・ルールのユース・ケースの多くは、このような使用プロファイルには適合しないため、Reteアルゴリズムを使用するメリットが得らないうえに、このアルゴリズム特有のメモリー消費に関するオーバーヘッドも発生します。

Non-Reteアルゴリズム(NRE)は、Reteアルゴリズムの代替で、Reteアルゴリズムと比較して消費メモリーが少なくなります。ビジネス・ルールのユース・ケースの多くでは、パフォーマンスも向上します。NREアルゴリズムの中核は、新しいルール条件評価アプローチにあります。ルール・エンジンの大部分は変更されることなく、ReteアルゴリズムとNREアルゴリズムで共有されます。外部で定義された既存のReteアルゴリズムのセマンティクスは、NREアルゴリズムでも保持されます。次に、新しいアルゴリズムの重要なポイントをいくつか示します。

  • より簡素化された内部ルール表現。

  • ルール・テスト、ルール・アクション、およびユーザー定義の関数のために生成されたバイト・コード。

  • より効率的な変更操作。

  • ルール条件は、それを含んでいるルールセットがスタックの先頭になるまでは評価されない。最初の評価の後、必要に応じてファクト操作で再評価が行われる。

  • ルール実行中にルールセット・スタックにルールセットが1回のみ存在する場合は、不要な再評価を回避できる。

2.1.1 ReteアルゴリズムとNREアルゴリズムの違い

2つのアルゴリズムの間の2つの主な相違は次のとおりです。

  • ルール条件の評価:

    • Reteアルゴリズムでは、ルール条件はファクト操作(アサート、変更、リトラクト)が行われるときに評価されます。

    • 非Reteアルゴリズムでは、ルール条件は、そのルールセットがスタックの先頭になったときに初めて評価され、その後のファクト操作で評価されます。

  • ルールの起動順序。ルールの起動順序が定義されていない場合があります。たとえば、1つのファクトによって複数のルールが同時にアクティブ化され、それらのプロパティが同一である場合です。このような場合、ルールのアクティブ化の起動順序は異なることがあります。

    ノート:

    ルールの既存のセットが、Reteアルゴリズムでのそのルールの起動順序が定義されていない可能性があっても、その順序に明示的に依存していることがあります。Non-Reteアルゴリズムではその順序が異なる場合があるため、作成したルールの潜在的な不具合の原因になりかねません。

2.2 非Reteアルゴリズムの構成

使用するアルゴリズムの選択は、RuleSessionまたはRuleSessionPoolの作成時に行う必要があります。

後方互換性を確保するために、デフォルトはReteアルゴリズムになります。アルゴリズム構成パラメータでキーとなるのはRuleSession.CFG_ALGORITHMで、次の2つの値があります。

  • RuleSession.ALGORITHM_RETE

  • RuleSession.ALGORITHM_NRE

また、RuleSession.CFG_ALLOW_ERROR_SUPPRESSIONという構成パラメータもあります。これはブール型です。デフォルトは、trueです。falseに設定すると、エラーの抑制が有効化されないことがルール・エンジンに通知されます。この場合、エラーの抑制を有効にしようとすると、例外がスローされます。この設定により、Non-Reteアルゴリズムではヒープをさらに節約できます。

ルールの実行中に複数のルールセットが実行されることがよくあります。また、各ルールセットがルールセット・スタックにプッシュされて、そのルールセット内のルールが起動されたら、そのルール実行中にはスタックに再プッシュされないのが一般的です。Non-Reteアルゴリズムでは、スタックにおけるルールセットの出現回数を1回に限定して指定することで、このようなケースでのパフォーマンスの向上を実現できます。この設定は、次のRL組込み関数で設定および問合せ可能です。

  • function setRulesetsOnStackOnce(boolean bv) returns boolean

  • function isRulesetsOnStackOnce() returns boolean