




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用java规则引擎Drools自动排班前言本文以一个经简化的运输车队自动排班需求为例,详细讲解了如何使用java规则引擎Drools进行商业规则的形式语言描述,并编写java代码实现问题求解。背景介绍(引自Drools中文文档) A.I.(Artificial Intelligence)是一个关注于“使计算机像人类一样思考”的广泛的研究领域,包括Neural Networks(神经网络), Genetic Algorithms(遗传算法), Decision Trees(决策树), Frame Systems(框架系统) andExpert Systems(专家系统)。Knowledge representation(知识呈现)是A.I.的一部分,关注于如何呈现和操纵知识。专家系统使用知识表示把知识编码简化成一个可用于推理的知识库比如,我们可以用知识库处理数据以推出结论。专家系统又叫基于知识的系统、基于知识的专家系统,并被认为是A.I.的一个应用。开发一个专家库系统的过程被称为知识工程。EMYCIN是最早的专家系统Shell(外壳)之一,它从医学诊断专家系统MYCIN发展而来。早期的专家系统有自己的logic hard coded shells(逻辑硬件编码环境),把逻辑与系统相分离,为用户输入提供一个简单的使用环境。 Drools是一个使用基于规则的方法实现的专家系统的规则引擎,更准确的说属于产生式规则系统。术语“产生式规则”从形式语法中产生,形式语法使用一种抽象结构来准确描述形式语言。知识(facts,事实,环境):1,员工分为两种:司机,外勤2,每天分白、中、晚三个班次3,每班3人,一个司机,两个外勤规则(rules):1,司机可以当外勤,外勤不可以当司机2,每个员工每个月至少休息6天3,每个员工连续上班不能超过5天4,工作分配应尽可能均匀目标(goal):1,按日期和班次打印排班表2,按员工打印各人的班次任务排班规则的形式语言描述(drl, drools rule language):package TEST;import TEST.*;rule 司机whenshift : Shift(driver = null, $date : workDate, $no : no)worker : Worker(type = 1, easyDay = 6, maxDay = 4, $total : shiftTotal )eval( !shift.getWorkDate().containsWorker(worker) )not Worker(type = 1, shiftTotal $total )not Shift(driver = null, workDate.day $date.day)not Shift(driver = null, workDate.day = $date.day, no = 6, maxDay = 4, $total : shiftTotal)eval( !shift.getWorkDate().containsWorker(worker) )not Worker( shiftTotal $total )not Shift(assistant1 = null, workDate.day $date.day)not Shift(assistant1 = null, workDate.day = $date.day, no = 6, maxDay = 4, total : shiftTotal)eval( !shift.getWorkDate().containsWorker(worker) )not Worker( shiftTotal total )not Shift(assistant2 = null, workDate.day $date.day)not Shift(assistant2 = null, workDate.day = $date.day, no $no )thenshift.setAssistant2( worker );worker.addShift( shift );update( shift );update( worker );endrule 移除班次when shift : Shift() eval( shift.isDone() )then retract( shift );end规则说明:1,“司机”:表示为司机分配班次2,“外勤1”:表示为外勤1分配班次3,“外勤2”:表示为外勤2分配班次4,“移除班次”:从“工作区”中移除已分配司机和外勤的班次,以加快后续运算速度java代码实现:/WorkDate.java package TEST;import java.util.HashMap; import java.util.Collection; public class WorkDate private Integer _day; private HashMap _shifts = new HashMap(7); public WorkDate(int i) this(); _day = i; public WorkDate() /创建班次 for(int i = 1;i = 3;i+) this.addShift(new Shift(i); public Integer getDay() return _day; public void setDay(Integer d) _day = d; public void addShift(Shift s) s.setWorkDate(this); _shifts.put(s.getNo(), s); public Collection getShifts() return _shifts.values(); public boolean containsWorker(Worker w) for(Shift s : this.getShifts() if (s.containsWorker(w) return true; return false; /Worker.java package TEST; import java.util.*; public class Worker private Integer _type; private String _name; public String getName() return _name; public void setName(String n) _name = n; public Worker() public Worker(int i, String n) _type = i; _name = n; public Integer getType() return _type; public void setType(Integer i) _type = i; private Integer _max_day = 0; private Integer _easy_day; private HashMap _shifts = new HashMap(30); public Integer getEasyDay() return _easy_day; public void setEasyDay(Integer i) _easy_day = i; public Integer getMaxDay() return _max_day; public void addShift(Shift s) _shifts.put(s.getWorkDate().getDay(), s); _easy_day-; /_load+; /计算最大连续工作天数 int m = 0; for(int i = 1;i = 31;i+) if (_shifts.containsKey(i) m+; _max_day = Math.max(_max_day, m); else m = 0; public Integer getShiftTotal() return _shifts.size(); public Collection getShifts() return _shifts.values(); /Shift.java package TEST; public class Shift implements Comparable private Integer _no; public Shift() public Shift(int i) _no = i; public Integer getNo() return _no; public void setNo(Integer i) _no = i; private WorkDate _date; public WorkDate getWorkDate() return _date; public void setWorkDate(WorkDate d) _date = d; private Worker _driver; private Worker _assistant1; private Worker _assistant2; public Worker getDriver() return _driver; public void setDriver(Worker w) _driver = w; public Worker getAssistant1() return _assistant1; public void setAssistant1(Worker w) _assistant1 = w; public Worker getAssistant2() return _assistant2; public void setAssistant2(Worker w) _assistant2 = w; public boolean containsWorker(Worker w) return _driver = w | _assistant1 = w | _assistant2 = w; public boolean isDone() return _driver != null & _assistant1 != null & _assistant2 != null; public int compareTo(Shift shift) int a = this.getWorkDate().getDay() * 10 + _no; int b = shift.getWorkDate().getDay() * 10 + shift.getNo(); return a - b; /RuleTest.java package TEST; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.StatefulSession; import piler.PackageBuilder; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Collections; import java.util.Date; public class RuleTest public static void main(String args) throws Exception /创建工作日 ArrayList lstDate = new ArrayList(); for (int i = 1; i = 31; i+) lstDate.add(new WorkDate(i); /创建员工 ArrayList lstWorker = new ArrayList(); int a = 0, b = 0; for(int i = 1;i = 5;i+) Worker w = new Worker(1, 司机 + (+a); w.setEasyDay(lstDate.size(); lstWorker.add(w); for(int i = 1;i = 10;i+) Worker w = new Worker(2, 外勤 + (+b); w.setEasyDay(lstDate.size(); lstWorker.add(w); /read in the source Reader source = new InputStreamReader(RuleTest.class.getResourceAsStream(test.txt), GBK); PackageBuilder builder = new PackageBuilder(); /this wil parse and compile in one step builder.addPackageFromDrl(source); / Check the builder for errors if (builder.hasErrors() System.out.println(builder.getErrors().toString(); throw new RuntimeException(Unable to compile.); /get the compiled package (which is serializable) org.drools.rule.Package pkg = builder.getPackage(); /add the package to a rulebase (deploy the rule package). RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage(pkg); /创建会话 StatefulSession session = ruleBase.newStatefulSession(); / setup the debug listeners /session.addEventListener( new DebugAgendaEventListener() ); /session.addEventListener( new DebugWorkingMemoryEventListener() ); /插入数据 for(WorkDate date : lstDate) session.insert(date); for(Shift s : date.getShifts() session.insert(s); for(Worker worker : lstWorker) session.insert(worker); /执行运算 System.out.println(begin + new Date(); session.fireAllRules(); System.out.println(finish + new Date(); /按日期和班次打印 ArrayList lstShift = new ArrayList(); for(WorkDate date : lstDate) lstShift.clear(); lstShift.addAll(date.getShifts(); Collections.sort(lstShift); for(Shift shift : lstShift) String s = String.format( %s日%s班:%s, %s, %s, date.getDay(), shift.getNo(), shift.getDriver() = null ? 无 : shift.getDriver().getName(), shift.getAssistant1() = null ? 无 : shift.getAssistant1().getName(), shift.getAssistant2() = null ? 无 : shift.getAssistant2().getName() ); System.out.p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 姜堰二中入校考试题目及答案
- 山西体重管理师考试题库及答案
- 肠道菌群失调研究-洞察与解读
- 2025零售药店培训试题库及答案
- 低功耗广域通信-第3篇-洞察与解读
- 2025年福建省事业单位招聘考试计算机类综合能力测试试卷及答案
- 2025年广东省阳江市事业单位招聘考试综合类面试真题模拟试卷
- 2025年事业单位招聘考试综合类专业能力测试试卷(计算机类)-2025年春季试题答案
- 2025年事业单位招聘考试综合类专业能力测试试卷(旅游类)真题模拟解析试题
- 2025年湖北省事业单位招聘考试电子商务类综合能力测试真题模拟解析
- 美术基础 课件全套 第1-5章 美术简介 -中国民间美术
- 2025年青少年法制知识竞赛题库
- 小学德育工作会议记录
- 《中职工程测量技术专业《GNSS测量技术与应用》课程标准》
- 公安部门大数据管理办法
- 骨科患者围手术期营养管理
- 竞业限制培训
- 水厂培训课件
- 类风湿关节炎达标治疗
- 变电运行与检修考试题(附答案解析)
- 衢州学院十五五校园及校园文化建设规划
评论
0/150
提交评论