Drools决策表实践运用

news/2025/2/27 11:24:35/文章来源:https://www.cnblogs.com/jelly12345/p/18564222

决策表使用方式
在Drools中,决策表通常是以Excel(.xls或.xlsx)或者CSV格式存储的,这些格式的决策表并不能直接被Drools执行。它们需要被转换成Drools规则语言(DRL)的文本格式,之后才能被编译和执行。Drools提供了工具来帮助完成这一转换,主要使用org.drools.decisiontable.SpreadsheetCompiler类,以下是一个基本的转换过程
这是我的决策表:表一( Pricing bracket)

表二(Discounts)

文件名称:ExamplePolicyPricing.xls,的结构目录:

     // 加载决策表文件InputStream is = DecisionTableToDRL.class.getResourceAsStream("/path/to/decisiontable.xls");// 创建SpreadsheetCompiler实例SpreadsheetCompiler compiler = SpreadsheetCompilerFactory.newCompiler();// 转换决策表为DRLString drl = compiler.compile(is, "UTF-8", "decisiontable");// 打印DRL规则System.out.println(drl);

xls转为drl结果为:

package com.mk.examples.decisiontable;
//generated from Decision Table
import com.mking.drools.bean.decisiontable.*;
// rule values at B9, header at B4
rule "Pricing bracket_9"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "LOW", priorClaims == "1")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(450);
end// rule values at B10, header at B4
rule "Pricing bracket_10"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "MED")policy: Policy(type == "FIRE_THEFT")
thenpolicy.setBasePrice(200);System.out.println("Priors not relevant");
end// rule values at B11, header at B4
rule "Pricing bracket_11"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "MED", priorClaims == "0")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(300);
end// rule values at B12, header at B4
rule "Pricing bracket_12"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "LOW")policy: Policy(type == "FIRE_THEFT")
thenpolicy.setBasePrice(150);
end// rule values at B13, header at B4
rule "Pricing bracket_13"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "LOW", priorClaims == "0")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(150);System.out.println("Safe driver discount");
end// rule values at B14, header at B4
rule "Pricing bracket_14"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "MED", priorClaims == "1")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(700);
end// rule values at B15, header at B4
rule "Pricing bracket_15"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "HIGH", priorClaims == "0")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(700);System.out.println("Location risk");
end// rule values at B16, header at B4
rule "Pricing bracket_16"
whenDriver(age >= 18, age <= 24, locationRiskProfile == "HIGH")policy: Policy(type == "FIRE_THEFT")
thenpolicy.setBasePrice(550);System.out.println("Location risk");
end// rule values at B17, header at B4
rule "Pricing bracket_17"
whenDriver(age >= 25, age <= 30, priorClaims == "0")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(120);System.out.println("Cheapest possible");
end// rule values at B18, header at B4
rule "Pricing bracket_18"
whenDriver(age >= 25, age <= 30, priorClaims == "1")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(300);
end// rule values at B19, header at B4
rule "Pricing bracket_19"
whenDriver(age >= 25, age <= 30, priorClaims == "2")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.setBasePrice(590);
end// rule values at B20, header at B4
rule "Pricing bracket_20"
whenDriver(age >= 25, age <= 35, priorClaims == "3")policy: Policy(type == "THIRD_PARTY")
thenpolicy.setBasePrice(800);System.out.println("High risk");
end// rule values at B27, header at B22
rule "Discounts_27"
whenDriver(age >= 20, age <= 24, priorClaims == "0")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.applyDiscount(1);
end// rule values at B28, header at B22
rule "Discounts_28"
whenDriver(age >= 18, age <= 24, priorClaims == "0")policy: Policy(type == "FIRE_THEFT")
thenpolicy.applyDiscount(2);
end// rule values at B29, header at B22
rule "Discounts_29"
whenDriver(age >= 25, age <= 30, priorClaims == "1")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.applyDiscount(5);
end// rule values at B30, header at B22
rule "Discounts_30"
whenDriver(age >= 25, age <= 30, priorClaims == "2")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.applyDiscount(1);
end// rule values at B31, header at B22
rule "Discounts_31"
whenDriver(age >= 25, age <= 30, priorClaims == "0")policy: Policy(type == "COMPREHENSIVE")
thenpolicy.applyDiscount(20);
end

执行drl代码及结果

动态加载drl可以参考该文:Drools实践与动态加载
以下是drl解析过程:

 KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL);KieSession ksession = kieHelper.build().newKieSession();
Driver def = new Driver();
Policy policy = new Policy();
ksession.insert(def);
ksession.insert(policy);
int count = ksession.fireAllRules();
ksession.dispose();

总结:决策表其实就是Excel转化为DRL文件的过程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/839771.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Economies of Scale

规模经济(Economies of Scale) 规模经济指的是随着生产规模的扩大,单位产品的平均成本下降的现象。这通常发生在企业生产规模增加到一定程度时,由于固定成本(如厂房、机器设备等)被更多的产品分摊,单位产品的固定成本降低,同时由于规模的扩大,企业可能会享受到采购原材…

Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET

在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET binary.一、现象 在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应…

【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)

通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤:副标题:Cloud Service Extend…

hhdb数据库介绍(8-1)

部署 自动部署 自动部署为管理平台在界面中支持自动化安装部署计算节点集群的功能。目前管理平台从V2.5.0及以后拥有“集群部署”、“单机部署”两个自动化安装功能。“集群部署”适合从0开始一次性部署整套计算节点集群的场景,“单机部署”适合再已部署好的集群上新增个别集群…

玩手机打电话行为识别检测系统

玩手机打电话识别检测系统通过在指定区域安装监控摄像头,玩手机打电话识别检测系统实现7*24小时的实时监测,一旦发现有员工在上班时间抽烟或打电话,系统会立即触发告警机制。告警信息不仅会通过系统内部的警报系统发出,还会通过短信或邮件等方式通知管理人员,确保管理人员…

AO3400A-ASEMI中低压N沟道MOS管AO3400A

AO3400A-ASEMI中低压N沟道MOS管AO3400A编辑:ll AO3400A-ASEMI中低压N沟道MOS管AO3400A 型号:AO3400A 品牌:ASEMI 封装:SOT-23 批号:最新 最大漏源电流:5.8A 漏源击穿电压:30V RDS(ON)Max:30mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、低压MOS管 漏电流:ua 特…

图神经网络在欺诈检测与蛋白质功能预测中的应用概述

金融交易网络和蛋白质结构存在共同特征:它们在欧几里得(x, y)空间中难以建模,需要通过复杂、大规模且异构的图结构进行精确编码和表征。图是表示关系数据的自然结构范式,特别是在金融网络和蛋白质结构等领域。这类图能够捕捉实体间的复杂关系和交互模式,例如金融系统中的…

高空抛物智能抓拍摄像头

高空抛物智能抓拍摄像头基于C语言和Python视觉算法识别技术,高空抛物智能抓拍摄像头实现了对高空抛物行为的实时监控和预警。该系统通过安装在现场的监控摄像头,对小区现场进行7*24小时不间断的监测,当监控摄像头捕捉到可疑行为时,系统会立即进行分析,一旦确认为抛物行为,…

人员工服穿戴检测系统

人员工服穿戴检测系统基于先进的视觉算法,人员工服穿戴检测系统利用Python结合Opencv通过现场安装的监控摄像头实时捕捉画面,识别其是否正确穿戴了工作服、安全帽、护目镜、口罩和工鞋等个人劳保用品。一旦系统检测到有员工未按规定穿戴相应的劳保用品,它会立即进行抓拍,并…

CDH6.3.2集成ranger2.1.0

有需要已经打好的包和源码的 打赏一杯咖啡 30,发送邮件463951510@qq.com每天进步一点,加油!

【往届知网均已检索】第三届数字化经济与管理科学国际学术会议(CDEMS 2025)

会议亮点:1.知网检索稳定:AEBMR-Advances in Economics, Business and Management Research(ISSN: 2352-5428)出版2.参会人数多,口头报告和海报展示均提供正式的参会证书3.线下参会包含三餐,茶歇、会议物料:定制手提袋、会议手册、会议通知、会议日程、会议邀请函4.举办地…

出售短视频平台,多节点实例数据同步触发的方式

出售短视频平台,多节点实例数据同步触发的方式今天标题的内容,主要讲同步如何触发?内容已经圈定死,因此就不谈数据同步涉及的一致性,只谈如何触发这个动作。多节点实例触发的关键是,一旦触发,各个节点都要通知到位。那如何进行多个节点通知呢?答案就是通过广播。 本案例…