动物专家识别系统(Java)
动物专家识别系统(Java)
- 一·专家系统
- 二·产生式规则
- 2.1概念
- 2.2原理
- 2.3原理图示
- 三·设计思路
- 3.1规则文档
- 3.1.1识别动物种类
- 3.1.2Rule
- 3.2设计类
- 3.3设计规则
- 3.4代码实现思路
- 3.5正向推理
- 3.6时序图
- 3.7界面效果
- 四·后期迭代方向
- 五·源码
- 5.1RuleRepository
- 5.2Rule
- 5.3AnimalIdentificationExpertSystem
一·专家系统
专家系统是一个智能计算机程序系统,其内部含有大量的某个领域专家水平的知识与经验,能够利用人类专家的知识和解决问题的方法来处理该领域问题。也就是说,专家系统是一个具有大量的专门知识与经验的程序系统,它应用人工智能技术和计算机技术,根据某领域一个或多个专家提供的知识和经验,进行推理和判断,模拟人类专家的决策过程,以便解决那些需要人类专家处理的复杂问题。
二·产生式规则
2.1概念
产生式知识表示法是常用的知识表示方式之一。它是依据人类大脑记忆模式中的各种知识之间的大量存在的因果关系,并以“IF-THEN”的形式,即产生式规则表示出来的。这种形式的规则捕获了人类求解问题的行为特征,并通过认识–行动的循环过程求解问题。
2.2原理
产生式系统由规则库、推理机、综合数据库三部分组成。
- 规则库RB(Rule Base) 用于描述某领域内知识的产生式集合,包含着将问题从初始状态转换成目标状态(或解状态)的变换规则。是专家系统的核心。
- 综合数据库DB(Data Base) 又称为事实库,用于存放输入的初始事实、外部数据库输入的事实以及中间结果(事实)和最后结果的工作区。 是动态的。
- 推理机(Inference Engine) 是一个或一组程序,用来控制和协调规则库与综合数据库的运行,包含了推理方式、控制策略。 确定选用什么规则或如何应用规则。
2.3原理图示
三·设计思路
3.1规则文档
3.1.1识别动物种类
识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物
3.1.2Rule
3.2设计类
Rule类:存放一条规则的前提和结论;能根据给定条件判断该条规则是否满足;
RuleRepository类:存放事实库、规则库并实现推理机。
AnimalIdentificationExpertSystem类:,界面类。
3.3设计规则
1.规则表示方法:每条规则采用三元数组(int[ ][ ][ ])表示(规则序列,条件,结论)
"哺乳类", "鸟类", "肉食类", "蹄类", "企鹅", "信天翁", "鸵鸟", "斑马", "长颈鹿", "虎", "金钱豹"};
int[] | 初始条件 | int[] | 中间结果 | int[] | 结论 |
---|---|---|---|---|---|
0 | 有毛 | 20 | 哺乳类 | 24 | 企鹅 |
1 | 产奶 | 21 | 鸟类 | 25 | 信天翁 |
2 | 有羽毛 | 22 | 肉食类 | 26 | 鸵鸟 |
3 | 会飞 | 23 | 蹄类 | 27 | 斑马 |
4 | 会下蛋 | 28 | 长颈鹿 | ||
5 | 吃肉 | 29 | 虎 | ||
6 | 有犬齿 | 30 | 金钱豹 | ||
7 | 有爪 | ||||
8 | 眼睛盯前方 | ||||
9 | 有蹄 | ||||
10 | 反刍 | ||||
11 | 黄褐色 | ||||
12 | 有斑点 | ||||
13 | 有黑色条纹 | ||||
14 | 长脖 | ||||
15 | 长腿 | ||||
16 | 不会飞 | ||||
17 | 会游泳 | ||||
18 | 黑白两色 | ||||
19 | 善飞 |
2.规则库 事实库
List<Rule> rules = new ArrayList<>();
Set<Integer> conditions = new TreeSet<>();
3.4代码实现思路
- 初始化综合数据库(事实库)和规则库。
- 显示综合库并输入条件。
- 接下来是正向推理. 检测规则库中是否有与事实相匹配的规则,若有,则执行4,否则执行5。
- 更新综合数据库,即添加步骤3所检测到与综合数据库匹配的规则,并将所有规则做标记,接着执行5。
- 验证综合数据库是否包含解,若有,则终止求解过程,否则转3,继续检测规则库是否有事实相匹配规则。
- 若规则库中不再提供更多的所需信息,则问题求解失败,否则更新综合数据库,转3。
3.5正向推理
用户特征:是用户手动输入的 有20个
中间结果:“哺乳类”, “鸟类”, “肉食类”, “蹄类”
识别结果:“企鹅”, “信天翁”, “鸵鸟”, “斑马”, “长颈鹿”, “虎”, “金钱豹”
在用户输入条件到事实库后(这些条件就是事实),事实库并不是不变的。
比如用户输入了0(“有毛”)、5(“吃肉”),那么其实真正的事实库是(0、5),因为在匹配第一条规则:{{0}, {20}}的时候,有条件0,所以可以得到规则1的结论(20),并且该结论也应当加入事实库,因为这是已经知道的了,然后匹配到规则5:{{20, 5}, {22}}时,就可以得到结论22(“肉食类”)。
所以在从上到下匹配这15条产生式规则的过程中,如果匹配了某一条产生式规则,就该把这条规则的结论加入事实库;而且也发现了匹配规则是要注意顺序的,上面的例子中如果先匹配了规则5,那么此时事实库中只有(0和5),就得不到中间结论22。
3.6时序图
3.7界面效果
初始界面
勾选部分事实----得到中间结论
中间结论
最终结论
不符合条件
四·后期迭代方向
- UI设计迭代方向:
摒弃掉JFrame,采用前后端分离的方式,前端利用vue框架设计界面。前后端利用Socket 编程,实现有效链接。 - 知识库的迭代方向:
本期采用的是类来表示的rule,后面可以建立一张rule表,保存对应的规则库。然后采用MyBatis框架实现。 - 功能迭代:
产生式表示法具有高度的自由性,但同时由于本次的知识不足,导致有些推理信息并不准确,根据后续“专家”知识的增加,对知识库和事实库进行补充,可以进行更多更有效的动物识别。
五·源码
5.1RuleRepository
package expertsystem;import java.util.*;
//规则图
public class RuleRepository {//规则库List<Rule> rules = new ArrayList<>();//结论库Set<Integer> conditions = new TreeSet<>();//printString animals = "";// 构造函数,传入用户输入的条件编号public RuleRepository(int[] conditions){for(int i = 0; i < conditions.length; i++) {this.conditions.add(conditions[i]);}init();}// 初始化规则库,初始有15条规则,总共能识别7种动物private void init(){// 15条规则int[][][] expr = new int[][][]{{{0}, {20}},{{1}, {20}},{{2}, {21}},{{3, 4}, {21}},{{5}, {22}},{{6, 7, 8}, {22}},{{20, 10}, {23}},{{20, 9}, {23}},{{20, 22, 11, 12}, {30}},{{22, 11, 13}, {29}},{{23, 14, 15, 12}, {28}},{{23, 13}, {27}},{{21, 14, 15, 16,18}, {26}},{{21, 19}, {25}},{{21, 17, 18, 16}, {24}}};for(int i = 0; i < expr.length; i++){//设置一个规则Rule rule = new Rule();for(int j = 0; j < expr[i][0].length; j++){//添加一个条件rule.addCondition(expr[i][0][j]);}//设置结论rule.setConclusion(expr[i][1][0]);//将设置好的条件和结论添加进去rules.add(rule);}}// 正向推理public String reasoning(){String result = "";for (int i = 0; i < rules.size(); i++) {Rule rule = rules.get(i);if(rule.isSatisfied(conditions.toArray())){result += rule.toString();int con = rule.getConclusion();// 注意:满足的话要把结论加到已知条件中,且要维持有序(条件序列满足拓扑结构)conditions.add(rule.getConclusion());if(con >= 24){animals += con;animals += " ";}}}return result;}public String getAnimals() {return animals;}
}
5.2Rule
package expertsystem;import java.util.ArrayList;
import java.util.List;
//规则类
public class Rule {List<Integer> conditions = new ArrayList<Integer>();int conclusion;String[] features = {"有毛", "产奶", "有羽毛", "会飞", "会下蛋", "吃肉", "有犬齿", "有爪", "眼睛盯前方", "有蹄","反刍", "黄褐色", "有斑点", "有黑色条纹", "长脖", "长腿", "不会飞", "会游泳", "黑白两色", "善飞","哺乳类", "鸟类", "肉食类", "蹄类", "企鹅", "信天翁", "鸵鸟", "斑马", "长颈鹿", "虎", "金钱豹"};// 添加一个条件public void addCondition(int condition) {conditions.add(condition);}// 设置结论public void setConclusion(int conclusion) {this.conclusion = conclusion;}public int getConclusion() {return conclusion;}// 这条规则是否满足public boolean isSatisfied(Object[] conditions) {boolean satisfied = true;for (int i = 0; i < this.conditions.size(); i++) {int rule = this.conditions.get(i);boolean ok = false;for(int j = 0; j < conditions.length; j++) {if(Integer.parseInt(conditions[j].toString()) == rule){ok = true;break;}}if(!ok){// 有一个条件不满足都不满足satisfied = false;break;}}return satisfied;}public String toString() {String expr = "因为";for (int i = 0; i < conditions.size(); i++) {expr += features[conditions.get(i)];if (i != conditions.size() - 1) {expr += "、";}}expr += ", 所以是";expr += features[conclusion];expr += "。\n";return expr;}
}
5.3AnimalIdentificationExpertSystem
package expertsystem;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//界面ui
public class AnimalIdentificationExpertSystem extends JFrame {//创建一个勾选列表String[] features = {"有毛", "产奶", "有羽毛", "会飞", "会下蛋", "吃肉", "有犬齿", "有爪", "眼睛盯前方", "有蹄","反刍", "黄褐色", "有斑点", "有黑色条纹", "长脖", "长腿", "不会飞", "会游泳", "黑白两色", "善飞"};private JCheckBox[] checkBoxes = new JCheckBox[features.length];private String input = "";private int[] conditions;private RuleRepository ruleRepository;private AnimalIdentificationExpertSystem() {//界面titlesuper("动物识别专家系统");Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();dimension.width = (int) (dimension.width * 0.6);dimension.height = (int) (dimension.height * 0.6);this.setLayout(new FlowLayout());JPanel option = new JPanel();option.setLayout(new GridLayout(2, 10));option.setPreferredSize(new Dimension((int)(dimension.width * 0.95), (int) (dimension.height * 0.2)));for (int i = 0; i < features.length; i++) {checkBoxes[i] = new JCheckBox(features[i]);option.add(checkBoxes[i]);}this.add(option);Box box = Box.createVerticalBox();JPanel leftPanel = new JPanel();JLabel[] pictures = new JLabel[7];Icon[] icons = new ImageIcon[7];//TODO
// pictures[0] = new JLabel();
// icons[0]=new ImageIcon("E:\\IdeaProjects\\System\\animals\\src\\images\\1.png");
// pictures[0].setIcon(icons[0]);
// leftPanel.add(pictures[0]);//插入图片for (int i = 1; i <= 7; i++) {pictures[i - 1] = new JLabel();//DEBUG:用的是相对路径,移植代码后可能有bugicons[i - 1] = new ImageIcon("E:\\IdeaProjects\\System\\animals\\src\\images\\" + i + ".png");//icons[i - 1] = new ImageIcon("src/images/" + i + ".png");pictures[i - 1].setIcon(icons[i - 1]);leftPanel.add(pictures[i - 1]);}box.add(leftPanel);JPanel rightPanel = new JPanel();rightPanel.setPreferredSize(new Dimension(dimension.width, (int) (dimension.height * 0.38)));rightPanel.setBackground(Color.red);JTextArea showResult = new JTextArea("我叫,这是我制作的动物识别专家系统\n");showResult.setPreferredSize(new Dimension(dimension.width, (int) (dimension.height * 0.38)));rightPanel.add(showResult);box.add(rightPanel);JButton confirm = new JButton("开始");confirm.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent actionEvent) {// 清空上一次的结果input = "";showResult.setText("");for(int i = 0; i < features.length; i++) {if(checkBoxes[i].isSelected()) {input += i;input += " ";}}for(int i = 0; i < 7; i++) {pictures[i].setBorder(BorderFactory.createLineBorder(Color.white, 0));}// 转化为数组,按空格分割String[] inputs = input.split("\\s+");conditions = new int[inputs.length];for(int i = 0; i < inputs.length; i++) {conditions[i] = Integer.parseInt(inputs[i]);}ruleRepository = new RuleRepository(conditions);String res = ruleRepository.reasoning();showResult.setText(res);String animalString = ruleRepository.getAnimals();String[] animals = animalString.split("\\s+");for(int i = 0; i < animals.length; i++){if(animals[i].contentEquals("")) continue;int pic = Integer.parseInt(animals[i]) - 24;pictures[pic].setBorder(BorderFactory.createLineBorder(Color.red, 3));}}});box.add(confirm);this.add(box);this.setSize(dimension);this.setVisible(true);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent arg0) {AnimalIdentificationExpertSystem.this.dispose();System.exit(0);}});}public static void main(String[] args) {try {UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");} catch (Exception e) {System.out.println(e.toString());}AnimalIdentificationExpertSystem animalIdentificationExpertSystem = new AnimalIdentificationExpertSystem();}}
Gitee:https://gitee.com/wang-hegong/Java/tree/master/animals
动物专家识别系统(Java)相关推荐
- java车牌识别系统_基于jsp的车牌识别系统-JavaEE实现车牌识别系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的车牌识别系统, 该项目可用各类java课程设计大作业中, 车牌识别系统的系统架构分为前后台两部分, 最终实现在线上 ...
- 基于JAVA动物大全和智能识别系统(Springboot框架+AI人工智能) 开题报告
本科生毕业论文 基于Java(springboot框架)动物大全和智能识别系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- 人工智能实验-动物识别系统
** 实验一:产生式系统实验 ** 一.实验目的: 熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于规则推理的基本方法. 二.实验内容: 设计并编程实现一个小型产生式系统(如分类.诊 ...
- 基于产生式规则的动物识别系统
基于产生式规则的动物识别系统 先放效果图 控制台 推理失败截图: 推理成功截图: MFC 推理失败截图: 推理成功界面: 实验目的: 熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于 ...
- java实现 手写体识别_java手写体英文数字识别系统 识别预处理如何实现 采用什么语言比较好...
展开全部 转载 1 引言 手写体数字识别是文字识别中的一个研究课题,是多年来的研究热点,也是模62616964757a686964616fe4b893e5b19e31333337373638式识别领域 ...
- Springboot毕业设计毕设作品,动物大全和智能识别系统 开题报告
本科生毕业论文 基于Java(springboot框架)动物大全和智能识别系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- java 人脸识别jar包_java版天网人脸识别系统,获取视频流人脸识识别推送服务器展示...
java版天网人脸识别系统,获取视频流 进行人脸识别后推送到流媒体服务器实时展示 获取视频流 进行人脸识别后推送到red5服务器(人脸识别技术由虹软®提供) 整个系统共有两个项目组成 red5_hls ...
- 基于产生式表示的动物识别系统
实验目的 理解和掌握产生式知识表示方法及产生式系统的基本过程,能够利用编程技术建立一个基于产生式知识表示的简单的智能系统. 例 建立一个动物识别系统的规则库,用以识别虎.豹.斑马.长颈鹿.企 ...
- 动物识别系统代码python_动物识别 python 人工智能实验
构建动物识别系统 系统分为两部分,第一部分是初始化综合数据库,分为两类,一类是间接数据库,即不指向最终动物的信息.另一类是直接数据库,即指向最终动物的信息.使用的是二维列表加上一个一维列表存储key与 ...
最新文章
- oracle生成xml方法,oracle存储过程生成xml==转
- 如何在敏捷中管理和减少技术负债?
- SAP CRM product hierarchy和category的三个问题问答
- 模板:BSGS(数论)
- appweb ejs_EJS部分
- canvas - drawImage()方法绘制图片不显示的问题
- android message to iphone,这款应用可以将苹果的iMessage带到安卓系统
- 人员基础信息一体化采集设备
- GIS和RS数据查找下载网址整合
- 如何下载m3u8格式视频
- 三极管死区电压和导通电压的区别
- 结对开发石家庄地铁线路
- 对话DeepMind创始人:建立通用人工智能
- vue-cli项目代理proxyTable配置exclude的方法
- NVIDIA_CUDA和AMD_AMD APP
- 利用51单片机和DS12C887时钟芯片制作万年历
- Arduino-ESP8266库接口:Ticker.h
- chtMultiRegionSimpleFoam求解器的热源不在边界上【翻译】
- UltraEdit| UltraEdit使用帮助
- 大端(Bid Endian)、小端(Little Endian)含义
热门文章
- 2023年,云计算还有发展前景吗?
- Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
- 【计算机毕业设计】Java 基于微信小程序的高校游泳馆管理系统
- 神经网络论文研究--图像处理方向5-yolov1的研读
- java csv导出用excel打开乱码_java导出csv文件使用Excel打开乱码问题
- linux 驱动之设备树基础概念
- android授权新浪微博 服务端,Android 集成新浪微博分享及授权
- 做到这些,考研就成功了一半
- OpenStack官方镜像无法ssh登陆
- EFcore与动态模型