上篇分析到想通過運用規則間關係來儘量減少比較次數,然後初步得出的結果是比較亂,然後呢?
不能因為亂,這條路就不走了,規則間的關係是很好的資訊可供利用,那問題就是,為什麼運用這關係會比較亂?有沒有不亂的情況?
我們可以很容易的想到如下兩條規則,保證不亂:
1, {'price': '0
我們把之前的三條規則,連同上述兩個規則的2作為規則4,放在同乙個數軸上來看他們的範圍:
-------50----75----------------150------
1. --------------------------------
2. --------
3. --------------
4. ------------------------
從這個數軸可以直觀的看出規則間的重合的範圍,凡是落在兩個規則重合範圍內的資料,在匹配到1條規則的乙個邊界的時候,總是需要去判斷是否滿足另一條規則的另乙個邊界(包含關係中只要能匹配較小的範圍規則,較大的範圍規則一定能滿足,但是由於不好確定哪個較小的範圍需要被先匹配,因此若先匹配大的範圍,被包含的小範圍仍需被匹配兩個端點,因此計算量扯平了)。
由此我們得出乙個最簡單的認識:相異好,重疊壞!
假定在乙個沒有重合範圍的規則集合,規則範圍會是這樣的:
---10---20---30---40---50---60------>
1. -----
2. -----
3. --------------
當乙個規則被匹配到,其他的規則都是不能被匹配的,忠誠的都讓我感動了。
而且而且,對於放在數軸上的這些範圍段,難道我們還需要乙個乙個的匹配麼?難道我們還想不到一種方法叫做2分查詢麼!這個如此簡單而又強大的演算法,蘊含的是資訊理論世界的基石,用抽象而又具體的話來說,就是乙個蛋糕一切兩份,要想自己不吃虧,那就切均勻。至此,規則匹配的問題,我們可以變成了通過二分查詢資料所屬的範圍問題,o(n)和o(log2n)的差異我不用解釋了。
但是,我們還有個問題遺留著沒有解決。我們上述的樂觀,**於我們的假定「在乙個沒有重合範圍的規則集合中」,可這明顯又是不可能的,我們的4條規則明顯是不相異的。
但是,肯定是不可能的麼?我們能不能讓不可能變可能呢?
規則引擎研究 Rete演算法(2)
使用rete演算法的模組系統,有四個入口,分別是新增事實 add wme 去除事實 remove wme 新增規則 add production 去除規則 remove production 上面的主要介紹了建立rete網路後新增事實的過程。下面先具體介紹alpha網路的建立和新增事實的過程,然後再...
極其好用好學的規則引擎 A2D規則引擎
寫了個簡單的規則引擎,普通情況夠用了 比如2家公司有各自的利率計算規則,如下 在c 方面,沒有寫在c 的業務邏輯 中,而是移到了外部規則檔案中,如 acompanyratepolicy.r rule level 1 when alreadycostprice 0 alreadycostprice 1...
mysql 規則引擎 為什麼使用規則引擎?
一天,朱斯參加了一場code review研討會。會上的一群人正在討論著如何對祖傳 進行變更,大家你一言,我一語,場面十分熱鬧!突然,只見人群中的乙個人滿面愁容,說道 昨天在專案中看到下面這樣一段 分支太多了!維護起來很煩啊!if day 周一 else if day 周二 else if day ...