实验-产生式系统

  • 实验内容
  • 实验数据
    • 规则库
  • 实验关键步骤
  • 实验要求
  • 实验过程
    • 数据保存
    • 代码展示
      • 不带GUI界面(命令行界面)
      • GUI界面
  • 实验结果
    • 命令行界面
    • GUI界面

实验内容

本实验要求创建一个植物识别系统,根据输入特征判断库中是否存在该植物,并输出查找结果

实验数据

规则库

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

实验关键步骤

1.根据已知的数据建立数据库,存储植物个体(玫瑰、荷花、仙人球、水棉、苹果树、油菜、海带、松树)、个体特征等
2.实现规则编码
3.实现推理:综合数据库存储初始已知事实,控制系统将其与已有知识进行匹配,被触发的知识,将其结论作为新的事实添加到综合数据库中。重复上述过程,用更新过的综合数据库中的事实再与知识库中另一条知识匹配,将其结论更新至综合数据库中,直到没有可匹配的新知识和不再有新的事实加入到综合数据库中为止。
4.根据最终的综合数据库得到结论,判断是否得到植物名,是则返回植物名,否则提示该系统中未找到匹配对象。

实验要求

1.展现推理过程(即综合数据库的变化)。
2.对应各种特征情况系统都需要有响应。
3.交互界面

实验过程

数据保存

将题目所给的规则库数据,分别保存到三个文本中,分别是:所有特征,植物名称,规则。以便后续的再添加,如图所示:



代码展示

不带GUI界面(命令行界面)

Plants = []  # 目标植物库
Feature = []  # 特征信息库
Rules = []  # 规则库
dy_data = []  # 综合数据库
tested_1 = []  # 存放当轮测试成功的规则,若为空,则匹配失败 ,!!!切记每新一轮都要设置为空
tested_2 = []  # 存放所有轮匹配成功的规则,避免重复匹配def Database(file1, file2, file3):  # 导入文件内容,建立相关库with open(file1, 'r', encoding='utf8') as f1:for line in f1.readlines():line = str(line).split()Plants.extend(line)f1.close()with open(file2, 'r', encoding='utf8') as f2:for line in f2.readlines():line = str(line).split()Feature.extend(line)f2.close()with open(file3, 'r', encoding='utf8') as f3:for line in f3:line = line.split()Rules.append(line)f3.close()def inference():  # 控制系统flag = 1  # 标记是否匹配成功while (flag):if (dy_data[-1] in Plants):  # 得出结果后退出匹配return dy_data[-1]else:tested_1 = []  # 切记每新一轮要重新赋值for i in range(len(Rules)):  # 用规则库的规则去一一检查现有的规则if (Rules[i] in tested_2):  # 防止规则重复匹配passelse:sub = Rules[i][:-1]  # Rules[i][-1]是结论for j in sub:if (j not in dy_data):  # 该规则前件不符合breakif (j == sub[-1]):if (Rules[i][-1] not in dy_data):  # 避免匹配到的规则后件重复加入dy_data.append(Rules[i][-1])print("匹配的规则是:", *Rules[i])print("目前的综合数据库中的信息为:", *dy_data)tested_1.append(Rules[i])tested_2.append(Rules[i])if (tested_1 == []):  # 当前现有的规则已经没有规则库里的规则可以与之匹配了,失败flag = 0return Falsefile1_path = "D:/Plants.txt"
file2_path = "D:/Feature.txt"
file3_path = "D:/Rule.txt"
Database(file1_path, file2_path, file3_path)print("所有植物的特征信息的知识库有:")
for i in range(len(Feature)):  # 使输出有序if (i == 0):print(str(i + 1) + ":", Feature[i], " ", end="  ")elif (i % 5 != 0):print(str(i + 1) + ":", Feature[i], " ", end=" ")else:print("\n" + str(i + 1) + ":", Feature[i], " ", end=" ")print("\n")
num = []  # 存储信息序号
num.append(list(map(int, input("请输入已有特征信息的序号:").split())))  # 放进去的为一整个数组
for i in num[0]:  # 将初始的已知信息放入综合数据库dy_data.append(Feature[i - 1])print("您初始输入的植物特征信息有:")
print(*dy_data)
infer = inference()
print("您得到的答案是:", infer)

GUI界面

from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide2.QtWidgets import QPlainTextEdit
from PySide2.QtWidgets import QMessageBox# 2 9 15 为玫瑰
Plants = []  # 目标植物库
Feature = []  # 特征信息库
Rules = []  # 规则库
dy_data = []  # 综合数据库
tested_1 = []  # 存放当轮测试成功的规则,若为空,则匹配失败 ,!!!切记每新一轮都要设置为空
tested_2 = []  # 存放所有轮匹配成功的规则,避免重复匹配
num = []  # 存储初始所得信息的序号
mid_result = []  # 保存中间结果(匹配的规则,数据库变化等)的信息class GUI():  # 与用户交互def __init__(self):self.window = QMainWindow()self.window.resize(550, 400)self.window.move(300, 310)self.window.setWindowTitle('产生式系统')self.textEdit = QPlainTextEdit(self.window)self.textEdit.setPlaceholderText("请输入已有特征信息的序号(以空格分隔)")self.textEdit.move(10, 25)self.textEdit.resize(300, 350)self.button1 = QPushButton('输入完成', self.window)self.button1.move(380, 220)self.button1.clicked.connect(self.handle)self.button2 = QPushButton('所有植物特征信息', self.window)self.button2.resize(150, 100)self.button2.move(360, 80)self.button2.clicked.connect(self.display_init)def handle(self):global numinit_info = []  # 存放初始输入的信息info = self.textEdit.toPlainText()num = list(map(int, info.split()))for i in num:  # 将初始的已知信息放入综合数据库dy_data.append(Feature[i - 1])init_info.append(Feature[i - 1])infer = inference()QMessageBox.about(self.window, '结果', f'''您初始输入的植物特征信息有:\n{' '.join(init_info)}\n{'            '.join(mid_result)}\n您得到的答案是:\n{infer}''')def display_init(self):  # 显示特征信息info = []for i in range(len(Feature)):  # 使输出有序s = "%d: %s " % (i + 1, Feature[i])info.append(s)QMessageBox.about(self.window, '所有植物特征信息',f'''如下:\n\n{'       '.join(info)}''')def Database(file1, file2, file3):  # 导入文件内容,建立相关库with open(file1, 'r', encoding='utf8') as f1:for line in f1.readlines():line = str(line).split()Plants.extend(line)f1.close()with open(file2, 'r', encoding='utf8') as f2:for line in f2.readlines():line = str(line).split()Feature.extend(line)f2.close()with open(file3, 'r', encoding='utf8') as f3:for line in f3:line = line.split()Rules.append(line)f3.close()def inference():  # 控制系统flag = 1  # 标记是否匹配成功while (flag):if (dy_data[-1] in Plants):  # 得出结果后退出匹配return dy_data[-1]else:tested_1 = []  # 切记每新一轮要重新赋值for i in range(len(Rules)):if (Rules[i] in tested_2):  # 防止规则重复匹配passelse:sub = Rules[i][:-1]for j in sub:if (j not in dy_data):  # 该规则前件不符合breakif (j == sub[-1]):if (Rules[i][-1] not in dy_data):  # 避免匹配到的规则后件重复加入dy_data.append(Rules[i][-1])s = "匹配的规则:"for g in Rules[i]:s += gs += '、'mid_result.append(s)ss = "目前综合数据库信息:"for g in dy_data:ss += gss += '、'mid_result.append(ss)tested_1.append(Rules[i])tested_2.append(Rules[i])if (tested_1 == []):flag = 0  # 匹配失败,查找不到return Falsefile1_path = "D:/Plants.txt"
file2_path = "D:/Feature.txt"
file3_path = "D:/Rule.txt"
Database(file1_path, file2_path, file3_path)
app = QApplication([])
gg = GUI()
gg.window.show()
app.exec_()

实验结果

命令行界面

GUI界面



实验-产生式系统(python)相关推荐

  1. python实训总结报告书_20172304 实验四python综合实践报告

    20172304 实验四python综合实践报告 姓名:段志轩 学号:20172304 指导教师:王志强 课程:Python程序设计 实验时间:2020年5月13日至2020年6月14日 实验分析 本 ...

  2. python语言基础实验_实验二Python语言基础函数包练习.doc

    实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...

  3. 实验报告-python文库_Python实验报告

    目 录 次序 1 2 3 4 5 实验项目名称 实验一.熟悉Python环境及及基本数据类型的使用实验 实验二.程序控制结构编程设计实验 实验三.函数和代码复用实验 实验四.组合数据类型的使用实验 实 ...

  4. 数据可视化实验:python数据可视化-柱状图,条形图,直方图,饼图,棒图,散点图,气泡图,雷达图,箱线图,折线图

    数据可视化实验:python数据可视化 实验8-12:大数据可视化工具-python 目录 1柱状图 2条形图 3直方图 4饼图 5棒图 6散点图 7气泡图 8雷达图 9箱线图 10折线图 1柱状图 ...

  5. 《Python程序设计》实验四 Python综合实践实验报告

    <Python程序设计>实验四 Python综合实践实验报告 1.实验内容 Python综合应用:爬虫.数据处理.可视化.机器学习.神经网络.游戏.网络安全等. 在华为ECS服务器(Ope ...

  6. python综合程序设计-实验四 Python综合实践

    课程:<Python程序设计> 班级:1843 姓名:章森洋 学号:20184307 实验教师:王志强 实验日期:2020年5月16日 必修/选修: 公选课 1.实验内容 此处填写实验的具 ...

  7. 数字图像处理——实验一 Python中数字图像处理的基本操作

    数字图像处理--实验一 Python中数字图像处理的基本操作 一.实验目的 二.实验主要仪器设备 三.实验原理 3.1 数字图像的表示和类别 3.2 opencv-python图像文件格式 四.实验内 ...

  8. Python—SJ—实验1—Python基本操作

    Python-SJ-实验1-Python基本操作 2020.1.9日 共五个部分 ①总体实验内容的文字介绍 ②实验的未作答版本 ③实验报告模板 ④实验作答版代码(不确保正确,仅供参考) ⑤实验报告(我 ...

  9. python实验目的_实验五 Python文件操作实验

    实验五 Python文件操作实验 一.实验目的与要求 1.掌握文件的打开和关闭. 2.掌握文件的不同操作,如读写.重命名.删除. 3.熟悉闭包.装饰器以及常见内置函数的使用. 二.实验原理 在pyth ...

  10. python 编程入门-实验一 Python程序设计入门

    学号20184307 2019-2020-2 <Python程序设计>实验1报告 课程:<Python程序设计> 班级: 1843 姓名: 章森洋 学号:20184307 实验 ...

最新文章

  1. git原理及常见使用方法
  2. python输出特别的矩阵
  3. 事务管理最佳实践全面解析
  4. leetcode算法题--全排列
  5. pymongo 使用测试
  6. Tecplot云图锯齿状边界解决办法
  7. 神经网络为什么需要随机初始化模型参数
  8. python载入图像
  9. 实现远程访问局域网内的多台电脑
  10. [转]英特尔为什么能在CPU方面领跑?
  11. Altium Designer(3)-绘制PCB封装库
  12. Ubuntu安装ffmpeg教程
  13. opnet如何进行C语言编程,OPNET学习小记(五)
  14. border-sizing属性
  15. 决策树及matlab实现
  16. 小米手机系统服务组件是干什么的_小米手机的云服务也太好用了吧?!手机丢了完全不用怕了...
  17. vertica资源管理
  18. 微信ios接入-Objc -all_load的坑
  19. DNA甲基化测序方法介绍
  20. Spark基础编程实践

热门文章

  1. 信息系统项目管理之进度管理过程
  2. 使用云函数+云调用,四步实现微信支付
  3. CG100汽车编程器
  4. layui怎么设置select默认选中,修改回显
  5. win10虚拟打印服务器,win10系统安装虚拟打印机的图文方法
  6. 为什么高斯滤波器被广泛用于图像处理?
  7. js 获取ip和浏览器信息
  8. 最全的权限系统设计方案(图解)
  9. Advanced Auto Layout
  10. 中望cad自定义快捷键命令_cad中望_中望cad常用快捷键及命令