# expertSystem.iml **Repository Path**: yangdelong/expertSystem.iml ## Basic Information - **Project Name**: expertSystem.iml - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-25 - **Last Updated**: 2021-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 工种认证专家系统 用产生式系统设计的一个简单工种推理专家系统,正向推理,支持规则维护 ## 1. 开发环境 Java8实现服务端逻辑 GUI编辑ScenceBuilder实现前端交互 ## 2. 运行效果 ![主页](https://gitee.com/yangdelong/expertSystem.iml/raw/master/.idea/indx.jpg) ![规则库界面](https://gitee.com/yangdelong/expertSystem.iml/raw/master/.idea/rule.png) ## 3. 设计实现 #### 步骤一:规则库、目标集、数据库的建立 1. 规则库采用全局变量方式声明,类型为List,泛型的Rule对象是包括规则前提条件P和结论Q的实体类。 2. 数据库Set 即用户输入的事实、规则前提,作为输入参数传入推理机推理。Set使用HashSet实现类,利用HashSet实现数据去重保证服务端数据有效 3. 目标集Set 也为全局变量,元素是要求识别的工种:动画绘制人员、灭火人员。Set也是使用HashSet实现 #### 步骤二:推理机的设计和实现 推理机的推理逻辑过程如下: 1. 遍历规则库中的所有规则,对于每条规则,判断当前数据库是否包括当前结果的所有前提P。如果是,把推出的结论Q加入数据库。 2. 多次循环遍历,直到遍历的规则的结论Q属于目标集aims,推理结束,识别结果为Q,或者所有规则遍历结束后,数据库也不再变化,推理结束,无法识别具体职业。 ```java /** * 推理机 * @param dataBase 用户输入的事实检索条件,即当前数据库 * @return 推理过程和结果对象ResultDto */ public static ResultDto reason(Set dataBase) { ResultDto resultDto = new ResultDto(); resultDto.process = ""; int count = 0; while (true) { // 判断是否有新的推理可用 boolean change = false; for (Rule rule : ruleBase) { // 判断数据库是否包含当前规则的所有条件 boolean flag = true; for (String condition : rule.p) { if (!dataBase.contains(condition)) { flag = false; break; } } // 满足当前规则所有条件 if (flag) { // 将当前规则结果加入数据库 if (!dataBase.contains(rule.q)) { dataBase.add(rule.q); change = true; resultDto.process += count + ".使用规则: " + rule.toString() + ", 推出了: " + rule.q + "\n"; resultDto.process += "当前数据库: " + dataBase + "\n\n"; } // 如果是目标集元素,推理结束 if (aims.contains(rule.q)) { resultDto.answer = rule.q; return resultDto; } } } // 没有新推理可用 if (!change) break; } resultDto.answer = "无法识别具体职业"; return resultDto; } ```