`
- 浏览:
109446 次
- 性别:
- 来自:
广州
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- package org.drools.benchmark.manners
-
- # 从客人中找出一位放入第一个座位
- # 根据Drools引擎的特性,应当是最后一个加入的Guest
- # 利用Context.state属性控制该规则只执行一次
- rule assignFirstSeat
- when
- # Context用于流程控制
- context : Context( state == Context.START_UP )
- #
- # 原例中使用的是 Guest() , 获得最后插入的Fact,但是这样会引起之前提到的Bug
- # 因此在下面进行了改进,保证找出三个兴趣都有的客人
- #
- guest : Guest( $name:name , $hobby : hobby )
- Guest ( name == $name , hobby != $hobby , $hobby1 : hobby )
- Guest ( name == $name , hobby != $hobby , hobby != $hobby1 )
-
- count : Count()
- then
- String guestName = guest.getName();
-
- # Seating用于记录每个座位上的客人,是寻找下一个座位的客人的依据
- Seating seating = new Seating( count.getValue(), 1, true, 1, guestName, 1, guestName);
- insert( seating );
-
- # Path用来避免已经入座的客人再次被选中
- Path path = new Path( count.getValue(), 1, guestName );
- insert( path );
-
- # 用于计数,并作为Seating的ID
- count.setValue( count.getValue() + 1 );
- update( count );
-
- System.out.println( "assign first seat : " + seating + " : " + path );
-
- # 进入找下一个座位环节
- context.setState( Context.ASSIGN_SEATS );
- update( context );
- end
-
- # 寻找相邻的同伴
- rule findSeating
- when
- context : Context( state == Context.ASSIGN_SEATS )
- # 获得最近安排好座位的客人
- $s:Seating( seatingId:id, seatingPid:pid, pathDone == true, seatingRightSeat:rightSeat, seatingRightGuestName:rightGuestName )
- # 找到一位有共同兴趣但性别不同的相邻客人
- Guest( name == seatingRightGuestName, rightGuestSex:sex, rightGuestHobby:hobby )
- Guest( leftGuestName:name , sex != rightGuestSex, hobby == rightGuestHobby )
-
- count : Count()
- # 排除已经入座的客人
- #
- # 原例中使用了Path.id作为一个约束条件,而事实上要排除已经入座的客人只要判断guestName就可以了
- # 因此原例中的makePath规则如果注释掉,然后将下面的语句改为
- # not ( Path( guestName == leftGuestName) )
- # 执行后也可以得到完全相同的结果
- # Manners是作为规则引擎的测试基准发布的,因此这里完全按照标准实现,所以这里虽然
- # 可以进行改进,但是可能因为为了测试规则引擎,因此保留这种算法
- #
- not ( Path( id == seatingId, guestName == leftGuestName) )
-
- # 排除入座客人已经和使用过的兴趣,保证两边相邻的客人共同兴趣不一样
- not ( Chosen( id == seatingId, guestName == leftGuestName, hobby == rightGuestHobby) )
- then
- int rightSeat = seatingRightSeat;
- int seatId = seatingId;
- int countValue = count.getValue();
-
- # 安排一个新的座位
- Seating seating = new Seating( countValue, seatId, false, rightSeat, seatingRightGuestName, rightSeat + 1, leftGuestName );
- insert( seating );
- # 记录已经入座的客人
- Path path = new Path( countValue, rightSeat + 1, leftGuestName );
- insert( path );
- # 记录已经使用的兴趣爱好
- Chosen chosen = new Chosen( seatId, leftGuestName, rightGuestHobby );
- insert( chosen );
-
- System.err.println( "find seating : " + seating + " : " + path + " : " + chosen);
- count.setValue( countValue + 1 );
- update( count );
-
- context.setState( Context.MAKE_PATH );
- update( context );
-
- retract ( $s );
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- rule makePath
- when
- Context( state == Context.MAKE_PATH )
- Seating( seatingId:id, seatingPid:pid, pathDone == false )
- $path : Path( id == seatingPid, pathGuestName:guestName, pathSeat:seat )
- not Path( id == seatingId, guestName == pathGuestName )
- then
- System.out.println ( "makePath :" + $path );
- insert( new Path( seatingId, pathSeat, pathGuestName ) );
- end
-
- # 结束座位的路径设置
- rule pathDone
- when
- context : Context( state == Context.MAKE_PATH )
- seating : Seating( pathDone == false )
- then
- seating.setPathDone( true );
- update( seating );
-
- context.setState( Context.CHECK_DONE );
- update( context );
- end
-
- # 检查是否安排的客人座位已经到达指定人数,结束规则运算
- rule areWeDone
- when
- context : Context( state == Context.CHECK_DONE )
- LastSeat( lastSeat: seat )
- Seating( rightSeat == lastSeat )
- then
- context.setState(Context.PRINT_RESULTS );
- update( context );
- end
-
- # 如果之前的areWeDone规则没有允许,则继续座位查找
- rule continue
- when
- context : Context( state == Context.CHECK_DONE )
- then
- context.setState( Context.ASSIGN_SEATS );
- update( context );
- end
-
- # 打印完成提示
- rule allDone
- when
- context : Context( state == Context.PRINT_RESULTS )
- then
- System.out.println( "All Done" );
- end
-
-
-
-
-
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Drools4 Demo 实例 Drools4示例 Drools4例子
drools-示例:Drools:规则引擎
使用Java开源框架Drools实现的一个示例 可以直接运行
NULL 博文链接:https://wu1g119.iteye.com/blog/2287940
drools学习的各个知识点的小示例,与springboot的整合项目,动态从库中加载规则的项目
你好Drools 示例项目
使用Drools5.1 规则引擎做的一个关于规则流的小示例,含规则流的rf 和 Xml 格式文件,以及一个自动生成顺序规则流的方法。 在 eclipse indigo 上运行通过。
drools drools drools drools drools
Drools入门-环境搭建,分析及示例
Drools是一个Java语言版本的基于Charles Forgy's Rete算法研究的规则引擎实现。结合Rete到一个面向对象接口中,允许业务对象处理业务表达式。Drools由Java语言开发,但是可以运行在Java环境和.NET环境下。 Drools被...
Drools规则引擎是一种嵌套在应用程序中的组件, 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。 它实现了将业务规则从程序代码忠分离出来,规则引擎使用特定的语法编写业务规则,规则引擎...
流口水示例Drools 规则引擎示例。
drools7.5.0和spring 4.3.12集成示例,替换了最新的包,借鉴了csdn另外一个网友的代码,再次基础上做了调整。主要调整了pom.xml,升级了版本
Drools4 insurance例子 j2ee环境!用jboss会更好
很不错的drools6学习的例子 里面有入门的实例及一些语法的例子。
储存库初始化内容 您的项目描述在这里。
不关闭服务,修改规则文件条件,使得原来不能通过的条件通过,实现规则的动态加载。
drools
JPA+DROOLS4整合的例子,JPA+DROOLS4整合的例子,
这个是本人在研究drools flow总结的报告,希望对大家有帮助