深入探索Rete算法与知识工程:构建规则系统的关键路径
1. Rete算法性能剖析
Rete算法的性能精确分析比简单规则查找事实算法更具挑战性。在首轮循环中,这两种算法的性能基本相同,因为Rete算法需要对工作内存中的每个事实进行模式匹配,且没有先前结果可供参考。在最坏情况下,即每个循环中所有事实都发生变化,且规则间无网络共享时,后续循环的性能也相似。这意味着,如果在工作内存中填充数据,仅运行一轮模式匹配,然后重置并重新填充工作内存,Jess的效率将不高。
但在工作内存缓慢变化、网络适度共享且索引有效的典型情况下,Rete算法在首轮循环后的所有循环中,性能将远超朴素算法。其运行时间大致与R’F’P’成正比,其中R’小于规则数量R,F’是每次迭代中变化的事实数量,P’大于1且小于每条规则的平均模式数量。
2. 节点索引哈希值的作用
Jess使用复杂的数据结构来表示每个连接节点中的两个内存,本质上是一个固定桶数的哈希表。哈希函数利用每个令牌中与特定连接节点测试最相关的部分,这使得Jess在运行连接节点测试前能对令牌进行预排序。在很多情况下,可完全避免部分或全部测试,因为令牌排序到哈希桶后,关于槽数据比较的问题通常可对整个桶进行明确回答。
节点索引哈希值是一个可调整的性能相关参数,可全局设置或按规则设置,即每个哈希表使用的桶数。较小的值节省内存,但可能牺牲性能;较大的值使用更多内存,但在一定程度上可加快模式匹配。若未明确声明,默认值是为实现最佳性能而选择的。
一般而言,对于可能产生大量部分匹配的规则,可声明较大的值,通常质数是较好的选择。确定特定规则的最佳值只能通过实验。例如,若n为项目事实的数量,以下规则的第三个连接节点