title: 动物识别专家系统课程设计

date: 2017-12-23 18:44:13

tags:

categories: python

设计一个可以识别7种动物的专家系统,可以根据前提推导出结论,如果只有部分前提,询问提示。

RD.txt是规则库,一行一条,每条空格分隔,前面是前提,最后一个是结论。

用PyQt5设计界面

RD.txt

有毛发 哺乳动物

有奶 哺乳动物

有羽毛 鸟

会飞 下蛋 鸟

吃肉 食肉动物

有犬齿 有爪 眼盯前方 食肉动物

哺乳动物 有蹄 有蹄类动物

哺乳动物 嚼反刍动物 有蹄类动物

哺乳动物 食肉动物 黄褐色 暗斑点 金钱豹

哺乳动物 食肉动物 黄褐色 黑色条纹 虎

有蹄类动物 长脖子 长腿 暗斑点 长颈鹿

有蹄类动物 黑色条纹 斑马

鸟 长脖子 长腿 黑白二色 不飞 鸵鸟

鸟 会游泳 不飞 黑白二色 企鹅

鸟 善飞 信天翁

主要文件,包含界面

main.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets

import sys

class Ui_Form(object):

def setupUi(self, Form):

Form.setObjectName("Form")

Form.setGeometry(100, 200, 623, 300)

self.groupBox = QtWidgets.QGroupBox(Form)

self.groupBox.setGeometry(QtCore.QRect(10, -20, 600, 311))

self.groupBox.setTitle("")

self.groupBox.setObjectName("groupBox")

self.label = QtWidgets.QLabel(self.groupBox)

self.label.setGeometry(QtCore.QRect(30, 40, 61, 18))

self.label.setAlignment(QtCore.Qt.AlignCenter)

self.label.setObjectName("label")

self.label_2 = QtWidgets.QLabel(self.groupBox)

self.label_2.setGeometry(QtCore.QRect(470, 40, 101, 18))

self.label_2.setAlignment(QtCore.Qt.AlignCenter)

self.label_2.setObjectName("label_2")

self.pushButton = QtWidgets.QPushButton(self.groupBox)

self.pushButton.setGeometry(QtCore.QRect(230, 35, 88, 27))

self.pushButton.setObjectName("pushButton")

self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)

self.pushButton_2.setGeometry(QtCore.QRect(475, 190, 88, 27))

self.pushButton_2.setObjectName("pushButton_2")

self.pushButton_2.clicked.connect(self.btn2_click)

self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)

self.pushButton_3.setGeometry(QtCore.QRect(475, 240, 88, 27))

self.pushButton_3.setObjectName("pushButton_3")

self.pushButton_3.clicked.connect(QtCore.QCoreApplication.instance().quit)

self.pushButton_4 = QtWidgets.QPushButton(self.groupBox)

self.pushButton_4.setGeometry(475, 140, 88, 27)

self.pushButton_4.setObjectName("pushButton_4")

self.pushButton_4.clicked.connect(self.topological)

self.textEdit = QtWidgets.QTextEdit(self.groupBox)

self.textEdit.setGeometry(QtCore.QRect(20, 80, 80, 211))

self.textEdit.setObjectName("textEdit")

self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox)

self.textEdit_2.setGeometry(QtCore.QRect(110, 80, 331, 211))

self.textEdit_2.setObjectName("textEdit_2")

self.textEdit_2.setReadOnly(True)

self.lineEdit = QtWidgets.QLineEdit(self.groupBox)

self.lineEdit.move(460, 90)

self.lineEdit.setReadOnly(True)

self.pushButton.clicked.connect(self.go)

self.retranslateUi(Form)

QtCore.QMetaObject.connectSlotsByName(Form)

def btn2_click(self):

if self.pushButton_2.text() != "确定输入":

self.pushButton_2.setText("确定输入")

else:

self.pushButton_2.setText("修改知识库")

def retranslateUi(self, Form):

_translate = QtCore.QCoreApplication.translate

Form.setWindowTitle(_translate("Form", "动物识别专家系统"))

self.label.setText(_translate("Form", "输入事实"))

self.label_2.setText(_translate("Form", "显示推理结果"))

self.pushButton.setText(_translate("Form", "进行推理"))

self.pushButton_2.setText(_translate("Form", "修改知识库"))

self.pushButton_3.setText(_translate("Form", "退出程序"))

self.pushButton_4.setText(_translate("From", "整理知识库"))

# 将知识库做拓扑排序

def topological(self):

Q = []

P = []

ans = "" # 排序后的结果

for line in open('RD.txt'):

line = line.strip('\n')

if line == '':

continue

line = line.split(' ')

Q.append(line[line.__len__() - 1])

del (line[line.__len__() - 1])

P.append(line)

# 计算入度

inn = []

for i in P:

sum = 0

for x in i:

if Q.count(x) > 0: # 能找到,那么

sum += Q.count(x)

inn.append(sum)

while (1):

x = 0

if inn.count(-1) == inn.__len__():

break

for i in inn:

if i == 0:

str = ' '.join(P[x])

# print("%s %s" %(str, Q[x]))

ans = ans + str + " " + Q[x] + "\n" # 写入结果

# print("%s -- %s" %(P[x],Q[x]))

inn[x] = -1

# 更新入度

y = 0

for j in P:

if j.count(Q[x]) == 1:

inn[y] -= 1

y += 1

x += 1

print(ans)

# 将结果写入文件

fw = open('RD.txt', 'w', buffering=1)

fw.write(ans)

fw.flush()

fw.close()

# 进行推理

def go(self, flag=True):

# 将产生式规则放入规则库中

# if P then Q

# 读取产生式文件

self.Q = []

self.P = []

fo = open('RD.txt', 'r', encoding='utf-8')

for line in fo:

line = line.strip('\n')

if line == '':

continue

line = line.split(' ')

self.Q.append(line[line.__len__() - 1])

del (line[line.__len__() - 1])

self.P.append(line)

fo.close()

print("go按钮按下")

self.lines = self.textEdit.toPlainText()

self.lines = self.lines.split('\n') # 分割成组

self.DB = set(self.lines)

print(self.DB)

self.str = ""

print(self.str)

flag = True

temp = ""

for x in self.P: # 对于每条产生式规则

if ListInSet(x, self.DB): # 如果所有前提条件都在规则库中

self.DB.add(self.Q[self.P.index(x)])

temp = self.Q[self.P.index(x)]

flag = False # 至少能推出一个结论

# print("%s --> %s" %(x, self.Q[self.P.index(x)]))

self.str += "%s --> %s\n" % (x, self.Q[self.P.index(x)])

if flag: # 一个结论都推不出

print("一个结论都推不出")

for x in self.P: # 对于每条产生式

if ListOneInSet(x, self.DB): # 事实是否满足部分前提

flag1 = False # 默认提问时否认前提

for i in x: # 对于前提中所有元素

if i not in self.DB: # 对于不满足的那部分

btn = s.quest("是否" + i)

if btn == QtWidgets.QMessageBox.Ok:

self.textEdit.setText(self.textEdit.toPlainText() + "\n" + i) # 确定则增加到textEdit

self.DB.add(i) # 确定则增加到规则库中

flag1 = True # 肯定前提

# self.go(self)

if flag1: # 如果肯定前提,则重新推导

self.go()

return

self.textEdit_2.setPlainText(self.str)

print("----------------------")

print(self.str)

if flag:

btn = s.alert("啥也推不出来!!!")

# if btn == QtWidgets.QMessageBox.Ok: # 点击确定

# self.textEdit.setText(self.textEdit.toPlainText() + "\n确定")

else:

self.lineEdit.setText(temp)

# 判断list中至少有一个在集合set中

def ListOneInSet(li, se):

for i in li:

if i in se:

return True

return False

# 判断list中所有元素是否都在集合set中

def ListInSet(li, se):

for i in li:

if i not in se:

return False

return True

class SecondWindow(QtWidgets.QWidget):

def __init__(self, parent=None):

super(SecondWindow, self).__init__(parent)

self.setWindowTitle("修改知识库")

self.setGeometry(725, 200, 300, 300)

self.textEdit = QtWidgets.QTextEdit(self)

self.textEdit.setGeometry(8, 2, 284, 286)

# 警告没有推导结果

def alert(self, info):

QtWidgets.QMessageBox.move(self, 200, 200)

QtWidgets.QMessageBox.information(self, "Information", self.tr(info))

# 询问补充事实

def quest(self, info):

# 如果推理为空,需要询问用户是否要添加已知条件

QtWidgets.QMessageBox.move(self, 200, 200)

button = QtWidgets.QMessageBox.question(self, "Question",

self.tr(info),

QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel,

QtWidgets.QMessageBox.Cancel)

return button

def handle_click(self):

if not self.isVisible():

# 读取文件放到多行文本框中

str = ""

fo = open('RD.txt', 'r', encoding='utf-8')

for line in fo:

line = line.strip('\n')

if line == '':

continue

str = str + line + "\n"

fo.close()

self.textEdit.setText(str)

self.show()

else:

# 输出文本框内容

self.str = self.textEdit.toPlainText()

print(self.str)

# 将文本框内容写入文件

self.fw = open('RD.txt', 'w')

self.fw.write(self.str)

self.fw.close() # 关闭文件

self.close() # 关闭窗口

def handle_close(self):

self.close()

if __name__ == "__main__":

app = QtWidgets.QApplication(sys.argv)

widget = QtWidgets.QWidget()

ui = Ui_Form()

ui.setupUi(widget)

widget.show()

s = SecondWindow()

ui.pushButton_2.clicked.connect(s.handle_click)

sys.exit(app.exec_())

linux下开发,在Windows下运行可能需要将open函数的encoding设定为gbk

动物识别系统代码python_动物识别专家系统课程设计相关推荐

  1. 动物识别系统代码python_动物识别 python 人工智能实验

    构建动物识别系统 系统分为两部分,第一部分是初始化综合数据库,分为两类,一类是间接数据库,即不指向最终动物的信息.另一类是直接数据库,即指向最终动物的信息.使用的是二维列表加上一个一维列表存储key与 ...

  2. 动物识别系统代码python_动物识别系统代码

    . 1 / 3 简易动物识别专家系统源代码(调试无错!) #include void birds() { int a; printf("*************************** ...

  3. 动物识别系统代码python_动物识别系统 代码

    1 动物识别专家系统 动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知 识,共 15 条规则.可以识别七种动物,这些规则既少又简单,可以改造他 们,也可以加进新的规则,还可以用来识别其 ...

  4. 动物识别系统代码python_动物识别系统__代码

    1 动物识别专家系统 动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知 识,共 15 条规则.可以识别七种动物,这些规则既少又简单,可以改造他 们,也可以加进新的规则,还可以用来识别其 ...

  5. 动物识别系统代码python_人工智能-动物识别专家系统算法Python + Pyqt 实现

    #-*- coding: utf-8 -*- #Form implementation generated from reading ui file '动物识别专家系统.ui'# #Created b ...

  6. java车牌识别系统_基于jsp的车牌识别系统-JavaEE实现车牌识别系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的车牌识别系统, 该项目可用各类java课程设计大作业中, 车牌识别系统的系统架构分为前后台两部分, 最终实现在线上 ...

  7. 为银行设计ATM菜单C语言,ATM银行管理系统代码及程序c语言课程设计【荐】.doc

    ATM银行管理系统代码及程序c语言课程设计[荐].doc #include #include #include #include struct bank{ int account; char name ...

  8. c语言仓库管理系统链表,仓库管理系统 C语言 C++ 数据结构 链表 课程设计

    仓库管理系统 C语言 C++ 数据结构 链表 课程设计 #include #include #include #include #define MAX 64 typedef struct node{ ...

  9. c语言仓库管理系统链表,仓库管理系统 C语言 C 数据结构 链表 课程设计.doc

    仓库管理系统 C语言 C 数据结构 链表 课程设计 #include #include #include #include #define MAX 64 typedef struct node{ /* ...

最新文章

  1. 4大工业物联网网络的实施战略
  2. 收藏 | Redis 使用 10 个小技巧
  3. taro 缺点_Taro小程序富文本解析4种方法
  4. maven依赖下载失败问题
  5. React组件复用的方式
  6. nginx https 配置
  7. org.apache.catalina.loader.StandardClassLoader@1af33d6
  8. ros 发布信息频率_ROS入门笔记二基础
  9. 【数据结构笔记37】表排序与物理排序
  10. java 实例域_Java实例域初始化
  11. 2017 5月12日上午
  12. servlet三种方式实现servlet接口
  13. 用Python写一个Excel汇总和比对小程序
  14. html手机端最小字体,移动端最小字体限制测试
  15. rmvb 转 avi 方法
  16. 一大波能提高编程技能的游戏
  17. 51单片机设计计算器
  18. 电商类-仿美团页面demo
  19. php中的逻辑运算符优先级,PHP运算符优先级 运算符分类
  20. 关于COM中变体类型VARIANT

热门文章

  1. 谷歌F12看不见请求
  2. 对伪装docx文件病毒的逆向分析
  3. 视角的本质能给我们带来什么?
  4. 奇虎360 -- 2013年校园招聘技术类笔试题
  5. oschina使用pages
  6. 黄金周在即,国家勒令禁止大数据杀熟,网友:早就该管管了!
  7. RDD简介,spark-shell,spark-submit提交任务简单示例
  8. 【技术分享】迅为i.MX6ULL开发板-Uboot-Logo修改方法
  9. 白皮书的参考文献格式怎么写?
  10. 西电计算机通信原理,西电通信原理大作业