http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/index.html#d0e2752
III. Drools Runtime and Language
5. Hybrid Reasoning
5.1. Artificial Intelligence
AIの栄枯盛衰を語るでー
5.1.1. A Little History
1990年頃にAIは失墜したけど、2005年に "Spring comes to AI winter" が提唱される。実践的、商業的な領域でイケるレベル、状況に達した。
5.1.2. Knowledge Representation and Reasoning
これ "must read for anyone wanting to build strong foundations" だそうです。"Knowledge Representation and Reasoning" http://www.amazon.co.jp/gp/product/1558609326/
5.1.3. Rule Engines and Production Rule Systems (PRS)
Ontology = the representation model we use for our "things" (情報科学でのオントロジーは「概念体系」という訳が一般的なんですかね)
Rete の発音は REH-te or RAY-tay
when/then の2部構造ルールを Production Rule と呼ぶ
Drools5 -> ReteOO, Drools6 -> PHREAK
5.1.4. Hybrid Reasoning Systems (HRS)
forward chaining と backward chaining の比較。図が分かりやすい。
5.1.5. Expert Systems
5.1.6. Recommended Reading
これ "a must have, for anyone's bookshelf" だそうです。"Artificial Intelligence: A Modern Approach " http://www.amazon.co.jp/dp/0130803022/
5.2. Rete Algorithm
rete はラテン語で "net" or "network".
discrimination network ... データがネットワークを通ってフィルタされていく
- RootNode
- 入り口。すぐにObjectTypeNodeへつなぐ
- ObjectTypeNode
- Objectのタイプでまずフィルタする
- Drools内部ではHashMapにObjectTypeNodeのリストを持って、instance of処理を短縮する
- AlphaNode
- BetaNode (JoinNode / NotNode)
- two-input を持つ
- left input はオブジェクトのリスト(= Tuple)
- right input はひとつのオブジェクト
- left input は Beta Memory と呼ばれ、全ての incoming tuples を憶えている。right input は Alpha Memory と呼ばれ、全ての incoming objects を憶えている。
- Drools内部ではBetaNodeのインデックス化を行う(hashでlookupなど)
- two-input を持つ
- LeftInputAdapterNode
- Object を受け取り、single Object Tuple に変換して BetaNode につなぐ
- TerminalNode
- 終端。あるひとつのルールが、条件に完全にマッチしたことを示す。
Droolsでは複数のルールがノードをシェアすることができる。結果的に、ひとつの複雑なネットワークが出来上がる。
5.3. ReteOO Algorithm
ReteOOはReteの拡張。以下のfeature
- Node sharing
- Alpha indexing
- Beta indexing
- ここまで、上記で説明済み
- Tree based graphs
- tree graph により、asymmetrical propagationを実現。 faster and less impact on the GC, and more robust
- Modify-in-place
- delete + insert を避ける
- Property reactive
- factのpropertyが変更された際の再評価のreactをfine grained にする。
- Sub-networks
- Not, Exists and Accumulate のネストされた条件は、Sub-networkを構成する
- Backward Chaining
- Lazy Truth Maintenance
- Heap based agenda
- Agenda は binary heap queue を使う
- Dynamic Rules
- ルールの動的追加、削除
5.4. PHREAK Algorithm
Drools 6 で導入。ReteOOの拡張だけど、すごく変わったのでもはや別の名前なんだ。
- Three layers of contextual memory; Node, Segment and Rule memories.
- Rule, segment and node based linking.
- Lazy (delayed) rule evaluation.
- Isolated rule evaluation.
- Set oriented propagations.
- Stack based evaluations, with pause and resume.
[理解が間違っていたらスマヌ。後日もっとちゃんと勉強します]
- goal orientedなので、実行されることが期待されるルールのみ評価される。よって、insert/update/delete時より、fireAllRules時の処理が多くなる。
- tuple oriented ではなく set oriented。評価されるひとつのルールに対して、insert/update/deleteんのsetがまとめて、ノードを通過していく
- networkはセグメント化される。ビットマスクを各ノードに適用する。ビットがonだと、linkedであり、ゴールが生成される
以下、複数ルールからどのようにセグメントが構成され、ビットマスクが使われるかを図とともに解説。
- PHREAK はひとつのルールの処理速度では RETE と変わらないだろう
- しかし、非効率なルールに対して、PHREAK は RETE より、寛大だろう(ひどく性能が劣化したりしないだろう)
- 大量、複雑なルールに対して、PHREAK は RETE より、性能の低下が緩やかになる
- つまり、速くなるというよりは遅くなりにくい、ということ
- PHREAK では AgendaGroup と salience が性能向上に有効になる。これらにより、不要なルール評価が減らせる。