使用java规则引擎Drools自动排班前言.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用java规则引擎Drools自动排班前言

使用java规则引擎Drools自动排班前言 本文以一个经简化的运输车队自动排班需求为例,详细讲解了如何使用java规则 引擎Drools进行商业规则的形式语言描述,并编写java代码实现问题求解。 ? 背景介绍(引自Drools中文文档) ??? A.I.(Artificial Intelligence)是一个关注于“使计算机像人类一样思考” 的广泛的研究领域,包括Neural Networks(神经网络), Genetic Algorithms (遗传算法), Decision Trees(决策树), Frame Systems(框架系统) and Expert 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 "司机" when ?shift : Shift(driver == null, $date : workDate, $no : no) 爓orker : Worker(type == 1, easyDay >= 6, maxDay <= 4, $total : shiftTotal ) 爀val( !shift.getWorkDate().containsWorker(worker) ) 爊ot Worker(type == 1, shiftTotal <呈现和 $total ) 爊ot Shift(driver == null, workDate.day < $date.day) 爊ot Shift(driver == null, workDate.day == $date.day, no < $no ) then 爏hift.setDriver( worker ); 爓orker.addShift( shift ); 爑pdate( shift ); 牋?update( worker ); end rule "外勤1" when ?shift : Shift(assistant1 == null, $date : workDate, $no : no) ?worker : Worker(easyDay >= 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 < $no ) then ?shift.setAssistant1( worker ); ?worker.addShift( shift ); ?update( shift ); ?update( worker ); end ? rule "外勤2" when ?shift : Shift(assistant2 == null, $date : workDate, $no : no) 爓orker : Worker(easyDay >=

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档