人工智能-动物识别专家系统算法Python + Pyqt 实现
一、基础知识库
有毛发 哺乳动物 -
有奶 哺乳动物 -
有羽毛 鸟 -
会飞 会下蛋 鸟 -
吃肉 食肉动物 -
有犬齿 有爪 眼盯前方 食肉动物 -
哺乳动物 有蹄 有蹄类动物 -
哺乳动物 反刍动物 有蹄类动物 -
哺乳动物 食肉动物 黄褐色 身上有暗斑点 金钱豹 *
哺乳动物 食肉动物 黄褐色 身上有黑色条纹 虎 *
有蹄类动物 长脖子 有长腿 身上有暗斑点 长颈鹿 *
有蹄类动物 身上有黑色条纹 斑马 *
鸟 长脖子 有长腿 不会飞 有黑白二色 鸵鸟 *
鸟 会游泳 不会飞 有黑白二色 企鹅 *
鸟 善飞 信天翁 *
最后一个字符为 - 表示结论为中间结果 为 * 表示为一种动物
二、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 实现的更多相关文章
- 数据结构与算法-Python/C(目录)
第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3. 1.失焦检测. 衡量画面模糊的主要方 ...
- pageRank算法 python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- 前端车牌识别SDK算法提取
同行业中,别人标配有的产品我有,别人没有的产品我们也有,如此才能增强竞争力,通过优化创新,前端车牌识别SDK功能,性能上,都是行业NO.1的水平.车牌识别sdk这个用于越来越多人集成了,汽车保有量日益 ...
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
- 人工智能时代,应立即学习python
人工智能时代,应立即学习python 应用:web开发,自动化运维开发,自动化测试,数据分析,机器学习 1.python 快速易学习2.python 基于web开发(zhihu:tornad web框 ...
随机推荐
- nginx配置相关问题
1. nginx配置ssl相关问题 1.1 报错nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in ...
- webpack请求文件路径代理
在开发模式下,访问页面请求会跑到根路径,因为写的都 ./images 而index又在根目录, 所以访问地址会是 http://localhost:8080/images/abc.jpg 而实际 ...
- JS 获取json key和value
var json= { "Type": "Coding", "Height":100 }; for (var key in json) { ...
- Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- Selenium:火狐Try Xpath插件替代Firebug和Firepath
什么是Xpath? XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素. 工具 Xpath的练习建议大家安装火狐浏览器后,下载插件,try path. 在Selenium中 ...
- EasyUI的datagrid表格行高度增加
这里以easyui的default样式为例: 找到easyui--->themes-->default-->easyui.css-->Ctrl+F找到.datagrid-row ...
- UVA1629_Cake slicing
Cake slicing 给你一个矩形大小,和每个樱桃的坐标,现在让你去切使得切之后的小矩形包含一个樱桃,每次切的代价是切痕的长度,问你最小代价是多少 思路: 首先要明白一点,不能切除一个不含樱桃的矩 ...
- Select.snippet
<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http:/ ...
- C# 下载模板
/// <summary> /// 模板下载 /// </summary> /// <returns></returns> public ActionR ...
- 将循环结果通过管道传递给其他命令处理(done |)