动物专家识别系统(Java)
一·专家系统
专家系统是一个智能计算机程序系统,其内部含有大量的某个领域专家水平的知识与经验,能够利用人类专家的知识和解决问题的方法来处理该领域问题。也就是说,专家系统是一个具有大量的专门知识与经验的程序系统,它应用人工智能技术和计算机技术,根据某领域一个或多个专家提供的知识和经验,进行推理和判断,模拟人类专家的决策过程,以便解决那些需要人类专家处理的复杂问题。
二·产生式规则
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<>();
//print
String 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}}