八字命理应用drools规则引擎
调研规则引擎用于八字命理中介绍了easyrules,easyrules比较轻量,但实际使用规则引擎,还是drools更能胜任复杂的业务。因为决策表可以让这个逻辑更加优雅
为什么一定要研究规则引擎,因为边缘计算中规则引擎是一个技术趋势,但是drools在边缘中运行就有些重了。当你看了很多命理书的时候,感觉还是用规则引擎来做,比使用java设计模式要强的多。
我的目的是八字命理,并不想把kie-spring再来一遍,于是就使用到fast-drools-spring-boot-starter这个插件
<properties><version.fast-drools>8.0.7</version.fast-drools><version.lombok>1.16.14</version.lombok><version.spring-cloud>2.0.1.RELEASE</version.spring-cloud></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>com.github.hongwen1993</groupId><artifactId>fast-drools-spring-boot-starter</artifactId><version>${version.fast-drools}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${version.lombok}</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId><version>${version.spring-cloud}</version></dependency></dependencies>
1 决策表
出现下面的错误是因为dto这个对象没有解析到,这里主要dto的位置要填写那个格,按照上图说明
2021-02-27 16:53:56.160 ERROR 1824 --- [pool-1-thread-1] com.drools.core.KieTemplate : file not fount.
2021-02-27 16:53:56.478 WARN 1824 --- [ main] o.d.c.kie.builder.impl.KieBuilderImpl : File 'file0.drl' is in folder '' but declares package 'com.dzmsoft.qingqiu'. It is advised to have a correspondance between package and folder names.
2021-02-27 16:53:57.269 ERROR 1824 --- [ main] o.d.c.kie.builder.impl.KieProject : Unable to build KieBaseModel:defaultKieBase
Predicate 'dto.setResult("旺")' must be a Boolean expression
编译出了错误,这个时候就可以参照Drools决策表的使用将决策表转化为drl查看发生了什么
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;@Testpublic void test02() throws FileNotFoundException {File file = new File("F:\\bazi_rules\\shy.xlsx");InputStream is = new FileInputStream(file);SpreadsheetCompiler compiler = new SpreadsheetCompiler();String drl = compiler.compile(is, InputType.XLS);System.out.println(drl);}
下面有两个地方有异常,
① dto.setResult(旺)
说明ACTION应该写成dto.setResult("$1");
,加上引号
② when条件不正确,故提示then这个错误。第二个condition没有解析,解决方案是引用同一个对象的condition合并为一个单位格,赋值dto:ShyGenYinDto
package com.dzmsoft.qingqiu.rule;
//generated from Decision Table
import com.dzmsoft.qingqiu.rule.dto.ShyGenYinDto;
import java.lang.Integer;
import java.lang.String;
// rule values at B8, header at B3
rule "根根在年支、月支"whendto:ShyGenYinDto(yz == "助")mzthendto.setResult(旺);
end// rule values at B9, header at B3
rule "根印在年支、月支"whendto:ShyGenYinDto(yz == "助")mzthendto.setResult(旺);
2021-02-27 17:10:09.325 ERROR 8744 --- [pool-1-thread-1] com.drools.core.KieTemplate : file not fount.
2021-02-27 17:10:09.634 WARN 8744 --- [ main] o.d.c.kie.builder.impl.KieBuilderImpl : File 'file0.drl' is in folder '' but declares package 'com.dzmsoft.qingqiu'. It is advised to have a correspondance between package and folder names.
2021-02-27 17:10:09.729 ERROR 8744 --- [ main] o.d.c.kie.builder.impl.KieProject : Unable to build KieBaseModel:defaultKieBase
[11,1]: [ERR 102] Line 11:1 mismatched input 'then' in rule "根根在年支、月支"
正确的决策表生成规则是这样的了
rule "根根在年支、月支"whendto:ShyGenYinDto(yz == "助", mz == "助")thendto.setResult("旺");
end
可以看到决策表中如果出现tgbqcn>=Integer.valueOf($1) and tgbqcn<=Integer.valueOf($2)
,生成drl的时候就出现问题了,解决方案也比较简单,采用tgbqcn>=Integer.valueOf($1) , tgbqcn<=Integer.valueOf($2)
,用逗号代替and就可以了
rule "月支根,年支、日支克月支,根本气透干2个以上"whendto:ShyGenYinDto(yz == "克", mz == "助", dz == "克", bqtg == "是", tgbqcn>=Integer.valueOf(2) and tgbqcn<=Integer.valueOf(3))thendto.setResult("弱");
end
这里再思考一个问题,决策表的规则那么多,它们之间怎么样保证互斥关系的呢?就好比我的实验,发现实施效果并不理想。
为防止冲突,增加了两个配置ACTIVATION-GROUP
对规则进行分组和Sequential
设置为顺序执行,设置好后,发现还是不行
将决策表生成的规则,写入到drl文件中,进行调试。
原则上根根在年支、时支,天干不是印比一片(包括合化)
的salience要高于年支根,月支泄根一次,本气透干
为什么,匹配到后者呢?
activation-group设置的一组规则,只需要一个执行,其他的就不执行了,相当于组内的规则是互斥的。那么只要年支根,月支泄根一次,本气透干
的activation-group
为2,同一个规则,就可以匹配到正确的了。
但是不同activation-group之间的呢?并不影响。
agenda-group是同一组的规则都会执行。
package com.dzmsoft.qingqiu.rules;
//generated from Decision Table
import com.dzmsoft.qingqiu.rules.dto.ShyGenYinDto;
import java.lang.Integer;
// rules values at B90, header at B4
rule "根根在年支、时支,天干印比一片"salience 65454activation-group "2"whendto:ShyGenYinDto(yz == "助", hz == "助", tgybyp == "1")thendto.setResult("旺");dto.setDesc("根根在年支、时支,天干印比一片");
end// rules values at B91, header at B4
rule "根根在年支、时支,天干合化印比一片"salience 65453activation-group "2"whendto:ShyGenYinDto(yz == "助", hz == "助", tghhybyp == "1")thendto.setResult("旺");dto.setDesc("根根在年支、时支,天干合化印比一片");
end// rules values at B92, header at B4
rule "根根在年支、时支,天干不是印比一片(包括合化)"salience 65452activation-group "2"whendto:ShyGenYinDto(yz == "助", hz == "助", tghhybyp == "0", tgybyp == "0")thendto.setResult("弱");dto.setDesc("根根在年支、时支,天干不是印比一片(包括合化)");
endrule "年支根,月支泄根一次,本气透干"salience 65439activation-group "4"whendto:ShyGenYinDto(yz == "助", mz == "泄", bqtg == "1")thendto.setResult("弱");dto.setDesc("年支根,月支泄根一次,本气透干");
end// rule values at B106, header at B4
rule "年支根,月支泄根一次,合化本气透干"salience 65438activation-group "4"whendto:ShyGenYinDto(yz == "助", mz == "泄", hhbqtg == "1")thendto.setResult("弱");dto.setDesc("年支根,月支泄根一次,合化本气透干");
end
解决规则冲突,另外的办法,就是就规则设置更加清晰,问题也就能解决。比如把某些规则的值设置的更加清晰一些
八字命理应用drools规则引擎相关推荐
- 调研规则引擎用于八字命理
熟悉命理书的朋友都知道,书上计划都是一些条文组成的断语,从下表可以看到,命理大师们习惯描述什么条件,会出现什么样的情况,这样看起来是不是很像规则引擎的职能呢?于是我就想调研一下java相关的规则引擎, ...
- drools规则引擎可视化_一文看懂开源工作流引擎 Flowable「转」
原文链接:[https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c]. 一.工作流引擎使用场景 工作流在企业管理系统中是高频使用的功能,一个最常见 ...
- 详解:Drools规则引擎探究
引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...
- 使用 Drools 规则引擎实现业务逻辑,可调试drl文件
http://www.srcsky.com/tech/arts/389.html 代码下载http://download.csdn.net/detail/zhy011525/2462313 使用 Dr ...
- drools规则引擎因为内存泄露导致的内存溢出
进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...
- SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...
- SpringBoot整合Drools规则引擎动态生成业务规则
最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...
- drools规则引擎 java_Drools规则引擎的使用总结
前一段时间在开发了一个做文本分析的项目.在项目技术选型的过程中,尝试使用了Drools规则引擎.让它来作为项目中有关模式分析和关键词匹配的任务.但后来,因为某种原因,还是撇开了Drools.现将这个过 ...
- 大数据风控项目实战 Drools规则引擎
可以借鉴的干货 1,统一存储服务,包含:多种存储库连接封装和服务封装 在统一存储服务 2.获取配置的环境 类:EnvVariable 一.风控项目介绍 对一个复杂支付系统提供统一.全面.高效的风险控制 ...
最新文章
- 组合特征(二)tfidf(word+article)+lsa
- innerText与innerHTML的区别
- 不是HR,Leader你会面试应聘者吗
- 聊一下我们团队的理念
- opython3l_Python从小白到攻城狮(3)——列表和元组,到底用哪个?
- Sentinel集群流控
- jdk12 jdk1.8_JDK 12的Files.mismatch方法
- 处理移动端pdf展示问题
- Lua: 给 Redis 用户的入门指导
- java redis hash存取_我爱java系列---【redis中如何存取hash类型的值(key field value)】...
- Mysql的简单使用(二)
- int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LPTSTR”
- 【秒懂音视频开发】16_AAC解码实战
- Python(PyCharm)的下载安装汉化(2022)
- 2021有什么好的入耳式耳机推荐?耳机热销性价比牌子排行榜单推荐!
- 和林格尔新区打造先进算力的“蓄水池”
- 打卡赠书的几点重要说明
- cscd期刊是c刊吗_武工商C刊和北大核心期刊论文发表数量位列全省同类高校前三甲...
- 时空日期审核错误修正
- NX二次开发-UFUN读取图纸尺寸的值UF_DRF_ask_dimension_text
热门文章
- Selector.select()
- (step4.3.6)hdu 2660(Accepted Necklace)
- 绕过CSP之Dangling markup技术
- Y05 - 001、Python是什么?
- 智能手机场景展示音乐可视化AE模板
- 使用CSS将图片转换成黑白(灰色、置灰)
- shell 中利用sqlplus 执行sql脚本 传参
- 人口普查数据集独热编码转换
- 基于Gabor纹理特征的图像检索
- 考计算机二级能带帽子吗,教资报名要注意这几点,否则无法通过审核,考区问题最容易出错...