一、基础知识库

有毛发 哺乳动物 -
有奶 哺乳动物 -
有羽毛 鸟 -
会飞 会下蛋 鸟 -
吃肉 食肉动物 -
有犬齿 有爪 眼盯前方 食肉动物 -
哺乳动物 有蹄 有蹄类动物 -
哺乳动物 反刍动物 有蹄类动物 -
哺乳动物 食肉动物 黄褐色 身上有暗斑点 金钱豹 *
哺乳动物 食肉动物 黄褐色 身上有黑色条纹 虎 *
有蹄类动物 长脖子 有长腿 身上有暗斑点 长颈鹿 *
有蹄类动物 身上有黑色条纹 斑马 *
鸟 长脖子 有长腿 不会飞 有黑白二色 鸵鸟 *
鸟 会游泳 不会飞 有黑白二色 企鹅 *
鸟 善飞 信天翁 *

最后一个字符为 - 表示结论为中间结果  为 * 表示为一种动物

二、QT界面 源码

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

# Form implementation generated from reading ui file '动物识别专家系统.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QFont
class Ui_Animals(object):
def setupUi(self, Animals):
Animals.setObjectName("Animals")
Animals.resize(1127, 710)
Animals.setAutoFillBackground(True)
self.TL = QtWidgets.QTextEdit(Animals)
self.TL.setGeometry(QtCore.QRect(670, 200, 251, 211))
self.TL.setObjectName("TL")
self.input = QtWidgets.QTextEdit(Animals)
self.input.setGeometry(QtCore.QRect(240, 100, 151, 321))
self.input.setAutoFillBackground(False)
self.input.setObjectName("input")
self.result = QtWidgets.QTextEdit(Animals)
self.result.setGeometry(QtCore.QRect(670, 100, 251, 51))
self.result.setObjectName("result")
self.result.setReadOnly(True)
self.input_lable = QtWidgets.QLabel(Animals)
self.input_lable.setGeometry(QtCore.QRect(100, 80, 141, 41))
self.input_lable.setObjectName("input_lable")
self.input_lable.setFont(QFont("Roman times", 10, QFont.Bold))
self.TL_label = QtWidgets.QLabel(Animals)
self.TL_label.setGeometry(QtCore.QRect(750, 150, 101, 61))
self.TL_label.setObjectName("TL_label")
self.TL_label.setFont(QFont("Roman times", 10, QFont.Bold))
self.result_label = QtWidgets.QLabel(Animals)
self.result_label.setGeometry(QtCore.QRect(750, 70, 111, 31))
self.result_label.setObjectName("result_label")
self.result_label.setFont(QFont("Roman times", 10, QFont.Bold))
self.scrollArea = QtWidgets.QScrollArea(Animals)
self.scrollArea.setGeometry(QtCore.QRect(90, 120, 141, 20))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 139, 18))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.comboBox = QtWidgets.QComboBox(self.scrollAreaWidgetContents)
self.comboBox.setGeometry(QtCore.QRect(0, 0, 141, 21))
self.comboBox.setObjectName("comboBox")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.pushButton = QtWidgets.QPushButton(Animals)
self.pushButton.setGeometry(QtCore.QRect(500, 240, 93, 28))
self.pushButton.setObjectName("pushButton")
self.pushButton.setFont(QFont("Roman times", 10, QFont.Bold))
self.checkBox = QtWidgets.QCheckBox(Animals)
self.checkBox.setGeometry(QtCore.QRect(500, 190, 91, 19))
self.checkBox.setObjectName("checkBox")
self.checkBox.setFont(QFont("Roman times", 10, QFont.Bold))
self.pushButton_2 = QtWidgets.QPushButton(Animals)
self.pushButton_2.setGeometry(QtCore.QRect(10, 120, 61, 21))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_2.setFont(QFont("Roman times", 10, QFont.Bold))
self.pushButton_3 = QtWidgets.QPushButton(Animals)
self.pushButton_3.setGeometry(QtCore.QRect(500, 300, 91, 31))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_3.setFont(QFont("Roman times", 10, QFont.Bold)) self.retranslateUi(Animals)
self.pushButton.clicked.connect(Animals.test)
self.comboBox.activated['int'].connect(Animals.selectChange)
self.checkBox.stateChanged['int'].connect(Animals.checkChange)
self.pushButton_2.clicked.connect(Animals.selectInit)
self.pushButton_3.clicked.connect(Animals.rules)
QtCore.QMetaObject.connectSlotsByName(Animals) def retranslateUi(self, Animals):
_translate = QtCore.QCoreApplication.translate
Animals.setWindowTitle(_translate("Animals", "Form"))
self.input_lable.setText(_translate("Animals", "请输入已知事实"))
self.TL_label.setText(_translate("Animals", "推理过程"))
self.result_label.setText(_translate("Animals", "专家分析结果"))
self.pushButton.setText(_translate("Animals", "推理"))
self.checkBox.setText(_translate("Animals", "反向推理"))
self.pushButton_2.setText(_translate("Animals", "初始化"))
self.pushButton_3.setText(_translate("Animals", "修改规则库"))

三、后端处理 Python源码

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

# Form implementation generated from reading ui file 'animal.py'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!
from 动物识别专家系统 import Ui_Animals
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import sys
import os
import tkinter
from tkinter import messagebox def IsEvidence(x):
for i in mywindow.fact:
if x == i[-2]:
return False
return True def getData(x):
data = []
for i in mywindow.fact:
tr = []
if x == i[-2]:
for j in range(0, len(i) - 1):
tr.append(i[j])
data.append(tr)
return data def backs(data):
c = 0
flag = False
for i in data:
d = "if "
for s in range(0, len(i)):
if s == len(i)-2:
d = d + str(i[s]) + " then "
else:
d = d + str(i[s]) + " "
window.TL.append(d)
for j in range(0, len(i) - 1):
if (IsEvidence(i[j])):
root = tkinter.Tk()
root.withdraw()
a= messagebox.askquestion("提示", i[j]+"吗")
#print(i[j] + "吗?")
#r = input()
print(a)
if a == "yes":
c = c + 1
else:
temp = getData(i[j])
if (backs(temp)):
c = c + 1
if c >= i.__len__() - 1:
flag = True
print(i[-1])
print("验证成功")
break
else:
flag = False
print(i[-1])
print("验证失败")
if (flag):
return True
else:
return False class mywindow(QtWidgets.QWidget,Ui_Animals):
fact = []
conditions = set("")
res = set("")
def __init__(self):
super(mywindow, self).__init__() f = open("rules.txt", "r")
for line in f:
ls = line.strip('\n').split(" ")
mywindow.fact.append(ls)
f.close()
for i in mywindow.fact:
for j in range(0,len(i)-2):
mywindow.conditions.add(i[j])
mywindow.res.add(i[-2])
self.setupUi(self) def resizeEvent(self, event):
palette = QtGui.QPalette()
pix = QtGui.QPixmap('images/3.jpg')
pix = pix.scaled(self.width(), self.height())
palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(pix))
self.setPalette(palette)
def test(self):
if self.checkBox.isChecked():#逆向推理
i = self.comboBox.currentIndex()
s = self.comboBox.itemText(i)
print(s)
data=getData(s)
print(data)
if (backs(data)):
root = tkinter.Tk()
root.withdraw()
a = messagebox.showinfo("提示", "该动物是" + data[0][-1])
self.result.setText("专家分析该动物是"+data[0][-1])
else:
root = tkinter.Tk()
root.withdraw()
self.result.setText("专家分析该动物不是" + data[0][-1])
a = messagebox.showinfo("提示", "该动物不是" + data[0][-1])
else: #正向推理
s= self.input.toPlainText()
tl =""
description = s.split("\n")
print("des")
print(description)
line = 0
for i in mywindow.fact:
same = 0
for j in range(0, len(i)):
if j >= len(i) - 2:
break
for k in range(0, len(description)):
if i[j] == description[k]:
same = same + 1
break
if k == len(description):
break if same == i.__len__() - 2:
print("same=i")
line = 1
if i[-1] == "*": # 是结论
d = "if "
for s in range(0,len(i)-1) :
if s == len(i)-3:
d=d+str(i[s])+" then "
else:
d=d+str(i[s])+" "
tl = tl + d + "\n"
self.TL.setText(tl)
self.result.setText("专家分析该动物是"+i[-2])
print(i[-2])
else:
line = 1
d = "if "
for s in range(0, len(i) - 1):
if s == len(i) - 3:
d = d + str(i[s]) + " then "
else:
d = d + str(i[s]) + " "
tl = tl + d +"\n"
self.TL.setText(tl)
self.result.setText("专家也不知道具体是什么动物,大概率推测是"+i[-2])
# print(i[-1])
description.append(i[-2])
if line ==0:
self.result.setText("专家也不知道具体是什么动物") def selectInit(self):
mywindow.fact.clear()
mywindow.conditions.clear()
mywindow.res.clear()
f = open("rules.txt", "r")
for line in f:
ls = line.strip('\n').split(" ")
mywindow.fact.append(ls)
f.close()
for i in mywindow.fact:
for j in range(0, len(i) - 2):
mywindow.conditions.add(i[j])
mywindow.res.add(i[-2])
self.comboBox.clear()
self.input.clear()
self.result.clear()
self.TL.clear()
if(self.checkBox.isChecked()):
for x in mywindow.res:
self.comboBox.addItem(str(x))
else:
for x in mywindow.conditions:
self.comboBox.addItem(str(x))
def selectChange(self):
if self.checkBox.isChecked():
self.input.clear()
i = self.comboBox.currentIndex()
s = self.comboBox.itemText(i)
self.input.append(s)
else:
i = self.comboBox.currentIndex()
s = self.comboBox.itemText(i)
self.input.append(s)
def checkChange(self):
self.comboBox.clear()
if self.checkBox.isChecked():
for x in mywindow.res:
self.comboBox.addItem(str(x))
else:
for x in mywindow.conditions:
self.comboBox.addItem(str(x)) def rules(self):
os.startfile('rules.txt') app = QtWidgets.QApplication(sys.argv)
window = mywindow()
window.show()
sys.exit(app.exec_())

人工智能-动物识别专家系统算法Python + Pyqt 实现的更多相关文章

  1. 数据结构与算法-Python/C(目录)

    第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...

  2. 北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  3. Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...

  4. Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3.  1.失焦检测. 衡量画面模糊的主要方 ...

  5. pageRank算法 python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  6. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  7. 前端车牌识别SDK算法提取

    同行业中,别人标配有的产品我有,别人没有的产品我们也有,如此才能增强竞争力,通过优化创新,前端车牌识别SDK功能,性能上,都是行业NO.1的水平.车牌识别sdk这个用于越来越多人集成了,汽车保有量日益 ...

  8. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...

  9. 人工智能时代,应立即学习python

    人工智能时代,应立即学习python 应用:web开发,自动化运维开发,自动化测试,数据分析,机器学习 1.python 快速易学习2.python 基于web开发(zhihu:tornad web框 ...

随机推荐

  1. nginx配置相关问题

    1. nginx配置ssl相关问题 1.1 报错nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in ...

  2. webpack请求文件路径代理

    在开发模式下,访问页面请求会跑到根路径,因为写的都  ./images  而index又在根目录, 所以访问地址会是 http://localhost:8080/images/abc.jpg  而实际 ...

  3. JS 获取json key和value

    var json= { "Type": "Coding", "Height":100 }; for (var key in json) { ...

  4. Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  5. Selenium:火狐Try Xpath插件替代Firebug和Firepath

    什么是Xpath? XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素. 工具 Xpath的练习建议大家安装火狐浏览器后,下载插件,try path. 在Selenium中 ...

  6. EasyUI的datagrid表格行高度增加

    这里以easyui的default样式为例: 找到easyui--->themes-->default-->easyui.css-->Ctrl+F找到.datagrid-row ...

  7. UVA1629_Cake slicing

    Cake slicing 给你一个矩形大小,和每个樱桃的坐标,现在让你去切使得切之后的小矩形包含一个樱桃,每次切的代价是切痕的长度,问你最小代价是多少 思路: 首先要明白一点,不能切除一个不含樱桃的矩 ...

  8. Select.snippet

    <?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http:/ ...

  9. C# 下载模板

    /// <summary> /// 模板下载 /// </summary> /// <returns></returns> public ActionR ...

  10. 将循环结果通过管道 传递给其他命令处理(done |)