人工智能及其应用-产生式系统实验-植物识别系统-java

实验一 产生式系统实验

一、实验目的:熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于规则推理的基本方法。
二、实验内容
设计并编程实现一个小型产生式系统(如:分类、诊断等类型)
三、实验要求
1.具体应用领域自选,具体系统名称自定。
2.用一阶谓词逻辑和产生式规则作为知识表示,利用产生式系统实验程序,建立知识库,分别运行正、反向推理。
四、实验报告要求
1.系统设置,包括系统名称和系统谓词,给出谓词名及其含义。
⒉.编辑知识库,通过输入规则或修改规则等建立规则库。
3.建立事实库((综合数据库),输入多条事实或结论。
4.运行推理,包括正向推理和反向推理,给出相应的推理过程、事实区和规则区。
5.总结实验心得体会。


1. 系统设置

系统名称:植物识别系统

谓词定义

在这里插入图片描述

2. 编辑知识库

默认规则库:
R1:种子有果皮 -> 被子植物
R2:种子无果皮 -> 裸子植物
R3:无茎叶 & 无根 -> 藻类植物
R4:被子植物 & 有托叶 & 有刺 -> 玫瑰
R5:被子植物 & 水生 & 可食用 & 结果实 -> 荷花
R6:被子植物 & 缺水环境 & 有刺 -> 仙人球
R7:藻类植物 & 水生 & 药用 -> 水棉
R8:被子植物 & 有托叶 & 木本 & 可食用 & 结果实 -> 苹果树
R9:被子植物 & 吸引菜粉蝶 & 十字形花冠 & 黄色花 & 可食用 & 结果实 -> 油菜
R10:藻类植物 & 水生 & 可食用 -> 海带
R11:裸子植物 & 木本 & 叶片针状 & 结果实 -> 松树

3. 建立事实库((综合数据库)

(1) 植物个体:
玫瑰、荷花、仙人球、水棉、苹果树、油菜、海带、松树。
(2) 区别个体的特征:
有刺、水生、喜阳、药用、木本、可食用、有白色粉末、叶片针状、结果实、黄色花。
(3) 区别种类的特征:
种子有果皮、种子无果皮、无茎叶、无根、有托叶、吸引菜粉蝶、十字形花冠、缺水环境。
(4) 种类:
被子植物、裸子植物、藻类植物、蔷薇科、十字花科、仙人掌科。

4. 运行推理

具体源码见:demo.java
https://download.csdn.net/download/hgxiaojiujiu/28342999

import java.util.*;

/**
 * 产生式系统 --- 植物识别系统
 *
 * @author  whj | CSDN@hgxiaojiujiu
 * 
 */
public class demo {
    
    
    //记录数据库植物特征
    public static final String data[] = {
    
    
            "有刺", "水生", "药用", "木本", "可食用", "叶片针状", "结果实", "黄色花",//区别个体的特征
            //0      1       2      3       4       5           6          7
            "种子有果皮", "种子无果皮", "无茎叶", "无根", "有托叶", "吸引菜粉蝶", "十字形花冠", "缺水环境",//区别种类的特征
            //  8           9         10      11      12          13         14          15
            "被子植物", "裸子植物", "藻类植物", //种类
            //  16          17         18
            "玫瑰", "荷花", "仙人球", "水棉", "苹果树", "油菜", "海带", "松树", "无此类植物"};  //植物个体
    // 19   20     21          22     23      24     25     26     27
    //规则
    public static Map<String, Integer> rule = new HashMap<>();

    //记录用户选择
    public static List<String> userList = new ArrayList<>();

    public static int plant = 0;

    public static Integer flag = 1;

    //系统运行入口
    public static void main(String[] args) {
    
    
        System.out.println("------------欢迎*植物识别系统*-------------");
        InitSys();
        System.out.println();
        while (flag == 1) {
    
    
            System.out.print("输入植物特征:");
            Scanner scanner = new Scanner(System.in);
            String choose = scanner.nextLine();
            //正向推理
            if (choose.length() > 3) {
    
    
                ChooseComputer_pos(choose);
                flag = 0;
                break;
            }
            // 结束
            if (Integer.parseInt(choose) == -1) {
    
    
                flag = 0;
                break;
            }
            userList.add(choose);
            ChooseComputer_rev(userList);  //条件逐步逆向推断
        }
        System.out.print("推理过程:");
        //推理显示
        for (String s : userList) {
    
    
            System.out.print(data[Integer.parseInt(s)] + "->");
        }
        System.out.print(data[plant]);

    }

已经明确植物的所有特征,直接得出植物

在这里插入图片描述

已知植物的部分特征,逐步推理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

明确植物目标,但不明确植物特征进行推理
在这里插入图片描述

5 .总结实验心得体会。

本系统的规则库是静态的,不能很好的进行增删改操作,这使得在实际运用是不便于系统数据库的修改和维护,对于系统功能更方便地实现增加了一定难度。

猜你喜欢

转载自blog.csdn.net/hgxiaojiujiu/article/details/120602671