`
hxpwork
  • 浏览: 111691 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Drools4:对Fibonacci 示例的分析

阅读更多
Fibonacci - 斐波纳契数列(一种整数数列, 其中每数等于前面两数之和)

1、Fact 设置

  1. session.insert( new Fibonacci( 50 ), false );  

2、Fibonacci对象定义

  1. public class Fibonacci {   
  2.     private int  sequence;   
  3.   
  4.     private long value;   
  5.        
  6.     public Fibonacci() {   
  7.            
  8.     }   
  9.        
  10.     public Fibonacci(final int sequence) {   
  11.         this.sequence = sequence;   
  12.         this.value = -1;   
  13.     }   
  14.   
  15.     public int getSequence() {   
  16.         return this.sequence;   
  17.     }   
  18.   
  19.     public void setValue(final long value) {   
  20.         this.value = value;   
  21.     }   
  22.   
  23.     public long getValue() {   
  24.         return this.value;   
  25.     }   
  26.   
  27.     public String toString() {   
  28.         return "Fibonacci(" + this.sequence + "/" + this.value + ")";   
  29.     }   
  30. }   

3、规则说明

  1. /*  
  2.     说明:  
  3.     斐波纳契数列(一种整数数列, 其中每数等于前面两数之和)计算  
  4.  
  5.     本例中最值得思考的是对递归的处理方式,如何开始和结束递归  
  6.     本例中对递归的控制是通过一个sequence整型字段来控制的  
  7. */  
  8. package org.drools.examples   
  9.   
  10. import org.drools.examples.FibonacciExample.Fibonacci;   
  11.   
  12. # Recurse规则的实际作用就是不断向Working Memory中插入新的Fibonacci实例,但每次Sequence减1  
  13. # 每个新的Fibonacci实例又再次引起该规则被激活,这样不断循环下去   
  14. # 该规则是当插入第49个Fibonacci实例后,   
  15. # 此实例中sequence等于1时被具有更高优先级的Bootstrap1规则打断   
  16. #   
  17. # 问题1:为何每次都是新插入的Fibonacci激发规则,之前的Fibonacci为什么不会再次匹配   
  18. #   要理解这点,首先要记住Drools的规则激活并不是在Fact插入Working Memory后再去寻找规则   
  19. #   而是在Fact插入时就完成了需要激活规则的判断,激发只是在完成插入后统一激发激活的规则   
  20. #   因此这里每次插入新的Fibonacci同时就再次激活了Recurse规则,直到被Bootstrap1规则打断   
  21. #   
  22. # 问题2:为何要将salience设为10,salience为0也可以被Bootstrap1中止啊?   
  23. #   当插入第48个Fibonacci实例时,此时同时有Recurse和Bootstrap2两个规则被激活   
  24. #   因为Recurse的优先级较高先执行,然后因为插入Fibonacci引起Bootstrap1的执行,接着再回来执行Bootstrap2   
  25. #   规则激活顺序:Recurse -> Bootstrap2 -> Recurse -> Bootstrap1   
  26. #   规则激发顺序:Recurse -> Recurse -> Bootstrap1 -> Bootstrap2   
  27. #   请留意激活与激发的不同,激活相当于规则放入待执行队列   
  28. #   但是具体的执行由冲突执行策略决定,并且可能因为其它规则的执行改变了激活该规则的Fact状态而废除   
  29. #   
  30. # 问题3:如果将Recurse的salience设为0,将发生什么情况?(暂时注释Calculate)   
  31. #   当插入第48个Fibonacci实例时,此时同时有Recurse和Bootstrap2两个规则被激活   
  32. #   而它们的优先级相同,而Drools在一个Working Memory中并不是一个并发的执行引擎,也就是必然有一个规则先激发   
  33. #   假设Recurse先执行,则激发顺序为 Recurse->Bootstrap1->Bootstrap2,另一个Recurse因为Bootstrap1的执行被中止   
  34. #   假设Bootstrap2先执行,则激发顺序为 Bootstrap2,当前的Recurse因为Bootstrap2的执行被中止   
  35. #   这样会有两种不同的执行结果,引擎到底会怎样处理呢?随机发生显然是不合理的。   
  36. #   ——秘密就在规则在Drl中的排列顺序,当规则的salience相同,又出现执行顺序冲突时,按照LIFO(后进先出)策略   
  37. #   ——排在Drl文件后面的规则插入引擎的顺序在后面,因此执行时先执行,也就是说Bootstrap2会先执行   
  38. #   ——如果将Bootstrap2移到Recurse前面,你就会发现是Recurse先执行了   
  39. #   
  40. #   注:Drools引擎对规则执行冲突的解决方案除了上面两种以及外部规则流定义外,是否还存在其它隐含算法,   
  41. #      因为作者没有实际阅读源码不能给出定论,需要按照实际情况多进行研究探索。   
  42. #      要用好规则引擎,除了理解规则的思想外,掌握引擎的执行算法也是非常重要的!   
  43. #   
  44. rule Recurse   
  45.     salience 10  
  46.     when   
  47.         f : Fibonacci ( value == -1 )   
  48.     then   
  49.         insert( new Fibonacci( f.getSequence() - 1 ) );   
  50.         # System.out.println( "recurse for " + f.getSequence() );   
  51. end     
  52.   
  53. # Bootstrap1规则的作用是结束Recurse规则的递归调用   
  54. # 当第49个Fibonacci实例插入后,同时匹配的有Recurse和Bootstrap1规则   
  55. # Bootstrap1规则因为优先级更高先执行,对激活规则的Fibonacci进行了修改,将Value设为1  
  56. # 因为这个Fibonacci实例也是激活另一个Recurse的Fact,因此当Value被更改后,   
  57. # Recurse的执行条件因为失败而被取消执行   
  58. #   
  59. rule Bootstrap1   
  60.     salience 20  
  61.     when   
  62.         f : Fibonacci( sequence == 1, value == -1 )   
  63.     then    
  64.         f.setValue( 1 );           
  65.         update( f );   
  66.         System.out.println( "Bootstrap1:" + f.getSequence() + " == " + f.getValue() );   
  67. end   
  68.   
  69. # Bootstrap2规则的作用是对倒数第二个插入的Fibonacci实例进行修改   
  70. # 并引发Calculate规则的执行。   
  71. # Bootstrap2规则的激活与激发已经在Recurse中详细讨论过,请参考前面   
  72. # 要特别留意的是因为Bootstrap2的执行,   
  73. # 引擎在对倒数第二个Fibonacci重新评估时发现Calculate规则满足激活条件并激发它   
  74. #   
  75. rule Bootstrap2   
  76.     when   
  77.         f : Fibonacci( sequence == 2, value == -1 )   
  78.     then    
  79.         f.setValue( 1 );           
  80.         update( f );   
  81.         System.out.println( "Bootstrap2:" + f.getSequence() + " == " + f.getValue() );         
  82. end   
  83.   
  84. # Calculate规则是进行斐波纳契数列计算的核心,之前的规则都是在进行Fact的准备以及控制递归   
  85. # 从规则的激活条件看,需要的是三个sequence值连续的Fibonacci实例   
  86. #    
  87. # 规则执行时,简单的将前面两个Fibonacci的value相加后赋值给第三个Fibonacci   
  88. # 至于retract第一个Fibonacci实例这个操作本身不对执行逻辑有什么影响   
  89. # 在这里使用retract,可能只是为了让逻辑思路更加清晰   
  90. #   
  91. rule Calculate   
  92.     when   
  93.         f1 : Fibonacci( s1 : sequence, value != -1 )   
  94.         f2 : Fibonacci( s2 : sequence == (s1 + 1 ), value != -1 )   
  95.         f3 : Fibonacci( sequence == (s2 + 1 ), value == -1 )                   
  96.     then       
  97.         f3.setValue( f1.getValue() + f2.getValue() );   
  98.         update( f3 );   
  99.         retract( f1 );   
  100.         System.out.println( "Calculate:" + f3.getSequence() + " == " + f3.getValue() );   
  101. end    
分享到:
评论

相关推荐

    Drools报错:The Eclipse JDT Core jar is not in the classpath

    - janino-2.5.16.jar:这是一个轻量级的Java源代码编译器,Drools可能用它作为替代编译器,特别是在对Eclipse JDT Core有特殊需求或者无法使用的情况下。 - droolsjbpm-ide-common.jar:这个文件可能包含了Drools与...

    Drools4Demo 示例 非常不错

    通过研究和理解Drools4Demo中的各个示例,开发者可以快速掌握Drools的用法,并将其应用于自己的业务场景,实现高效、灵活的业务规则管理。此外,Drools4Demo还提供了详细的文档和注释,帮助开发者更好地理解和学习...

    drools的使用示例代码

    Drools是一款强大的规则引擎,它...通过分析和实践这个项目,开发者不仅可以掌握Drools的基本用法,还能了解如何在实际项目中灵活运用Drools,实现业务规则的动态管理。这将对提升企业的业务敏捷性和决策效率大有裨益。

    drools5.1 规则流示例

    本示例旨在演示如何在Drools 5.1中使用规则流(Rule Flow)进行复杂的业务流程管理。规则流是Drools提供的一种工具,它允许用户通过图形化方式定义规则执行的顺序和条件,从而更好地控制业务逻辑的执行流程。 首先...

    drools5 规则动态加载示例

    在这个"drools5 规则动态加载示例"中,我们将探讨如何在不重启服务的情况下,实现规则的热更新,即动态加载修改后的规则文件,使得业务逻辑能够实时适应变化。 在传统的软件开发中,一旦应用部署,若需更改业务规则...

    Drools入门-环境搭建,分析及示例.docx

    4. **Drools Fusion**:专为事件处理和时间推理而设计,它能够实时分析和响应来自不同源的事件,适用于实时决策系统。 5. **Drools Planner**:这是一个自动规划引擎,用于解决复杂的优化问题,如车辆路线规划、...

    drools代码示例包

    这个“drools代码示例包”提供了与CSDN博客文章《Drools实战:一个详尽的指南》相关的示例代码,帮助读者深入理解Drools的工作原理和使用方法。 在Drools中,主要涉及以下几个核心概念: 1. **规则**:规则是...

    drools drools drools drools drools

    4. drools-examples:这可能是一个包含drools使用示例的目录,帮助开发者理解如何在实际项目中应用drools,涵盖了各种规则的创建、加载和执行。 drools 使用DRL(Drools Rule Language)作为规则定义的语言,它支持...

    drools6学习例子

    这部分可能包括各种Drools规则的语法示例,如条件语句(IF-THEN)、逻辑运算符、函数调用、事实模式、积累函数、约束条件等。通过这些例子,你可以了解到如何编写规则来匹配特定的事实对象,并在满足条件时执行相应...

    Drools规则引擎实现原理及示例

    Drools规则引擎是一种嵌套在应用程序中的组件, 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。 它实现了将业务规则从程序代码忠分离出来,规则引擎使用特定的语法编写业务规则,规则引擎...

    Drools规则引擎实现示例

    4. **插入事实**:在示例中,可能会创建一个或多个`Customer`对象并将其插入到工作内存中,例如: ```java KieSession ksession = ...; // 初始化KieSession Customer customer = new Customer(); customer.set...

    drools-示例:Drools:规则引擎

    ** drools-examples-master 文件夹内容分析 ** `drools-examples-master` 压缩包很可能包含了 Drools 的示例项目,这些示例通常会演示如何创建、加载和执行规则,以及如何处理事实和规则结果。项目可能包括以下内容...

    Drools4Demo.rar

    标题"Drools4Demo.rar"中的"Drools"是一个关键术语,它指的是Drools规则引擎,这是一个开源的业务规则管理系统(BRMS),主要用于在Java应用程序中实施复杂的业务逻辑和决策。Drools提供了一个强大的框架,使得业务...

    drools7.5.0和spring 4.3.12集成示例

    在这个集成示例中,"drools7.5.0" 是 Drools 的一个特定版本,它包含了对规则定义、解析和执行的改进。"spring 4.3.12" 是 Spring 框架的一个稳定版本,提供了大量的增强和修复,包括对 Java 8 的全面支持。 集成...

    drools:流量MVN的实现示例

    标题 "drools:流量MVN的实现示例" 指涉的是使用 Drools 这一规则引擎来处理流量管理的场景,而该场景是通过 Maven(MVN)构建工具来实现的。Drools 是一个强大的业务规则管理系统,它允许开发者通过声明式的方式定义...

    drools使用的jar包

    drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行...

    Drools4 insurance例子

    【Drools4保险例子详解】 Drools4保险例子是一个基于Drools规则引擎的实战项目,展示了如何在J2EE环境下,特别是在使用JBoss应用服务器时,利用Drools进行业务规则管理。这个例子旨在帮助开发者理解如何将Drools...

    hellodrools:Drools 示例项目

    【标题】"hellodrools:Drools 示例项目"是一个基于Drools规则引擎的实践教程,旨在帮助开发者了解和掌握如何在Java应用程序中使用Drools进行业务规则的管理和执行。 【描述】"你好,Drools 示例项目"表明这是一个...

    Drools4.x实例

    7. 性能优化:在Drools4.x中,对性能进行了优化,包括更快的规则匹配和执行,以及更有效的内存管理。这使得Drools能够在处理大规模数据和复杂规则时仍然保持高效。 8. 社区支持:Drools拥有活跃的开发社区,提供了...

    drools7.25中文文档+drools技术指南.zip

    10. **案例研究与示例**:为了更好地理解和应用Drools,文档通常会包含多个实际的案例和示例,让你能够动手实践。 "Drools技术指南"可能会更深入地探讨上述某些主题,或者涵盖更高级的特性,如事件处理、规则流、...

Global site tag (gtag.js) - Google Analytics