一、基础知识库

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

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

二、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. Java并发:搞定线程池(上)

    原文地址:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0 本文是在原文的基础+理解,想要 ...

  2. Jmeter中动态获取jsessionid来登录

    Jmeter中很多请求的url里会包含jsessionid,如 http://www.xxx.com/xxx_app;jsessionid=xxxxxxxxxx?a=x&b=x.jsessio ...

  3. 系统安装1---U盘启动器制作

    1.下载PE制作工具,现在有很多的PE制作工具,如老毛桃,大白菜等.下面我使用的是IT天空的U盘PE制作工具. 下载地址:https://www.itiankong.net/thread-369670 ...

  4. VS2013编译程序出现error C4996: 'std::_Fill_n': Function call with parameters that may be unsafe

    最近按照BiliBil网站Visual C++网络项目实战视频教程,使用VS2013编写一个基于MFC的对话框程序HttpSourceViewer,采用了WinHttp库.Boost xpressiv ...

  5. javaIO流(二)--字节流与字符流

    一.流的基本概念 在java.io包中,File类是唯一一个与文件本身有关的程序处理类,但是File类只能操作文件本身,而不能操作文件内容,IO操作的核心意义在于输入和输出操作.而对于程序而言,输入和 ...

  6. 这么简单的 Redis 面试题都不懂,怎么拿offer?

    来源:mp.weixin.qq.com/s/daBkliC8dAT_zYyoLiS7WA 随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点.而缓存的使用成为一个重点.redis 作为缓 ...

  7. poj3252 Round Numbers(数位dp)

    题目传送门 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16439   Accepted: 6 ...

  8. 牛客网挑战赛24 青蛙(BFS)

    链接:https://www.nowcoder.com/acm/contest/157/E来源:牛客网 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始踏上了旅途 一直这 ...

  9. 48.Course Schedule(课程安排)

    Level:   Medium 题目描述: There are a total of n courses you have to take, labeled from 0 to n-1. Some c ...

  10. MySQLSyntaxErrorException: Row size too large 转摘自:https://confluence.atlassian.com/display/CONFKB/MySQLSyntaxErrorException%3A+Row+size+too+large

    Symptoms The following appears in the atlassian-confluence.log: Caused by: com.mysql.jdbc.exceptions ...