一、基础知识库

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

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

二、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. mac 上查看python3的各种安装路径

    1.mac chromedriver的安装目录:/usr/local/bin 2.mac htmltestrunner的存放目录:命令行下 import sys sys.path/Library/Fr ...

  2. POJ1426-Find The Multiple-bfs

    Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal repr ...

  3. 关于函数lower_bound()如何使用的问题

    这个函数是c++ STL里自带的函数,应该需要引用头文件#include<iostream> 功能:在一个有序的序列中查找可以将value(一个变量)放在队列里面而不会引起序列长度变化,单 ...

  4. LeetCode刷题: 【120】三角形最小路径和

    1. 题目: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小 ...

  5. docker使用记录二:mysql安装与配置

    docker 安装mysql 和挂载 仓库位置: https://hub.docker.com/_/mysql/ 安装的同时挂载data资料卷和config 配置的资料卷刀磁盘上 docker run ...

  6. leetcode.分治.241为运算表达式设计优先级-Java

    1. 具体题目 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: & ...

  7. jQuery封装轮播图插件

    // 布局要求,必须有一个容器,图片和两个按钮,布局方式自定,小圆点样式固定 // <div class="all"> // <img src="img ...

  8. 如何优雅地在React中处理事件响应&&React绑定onClick为什么要用箭头函数?

    React绑定onClick为什么要用箭头函数? https://segmentfault.com/q/1010000010918131 如何优雅地在React中处理事件响应 https://segm ...

  9. 2019牛客暑期多校训练营(第五场) maximum clique 1

    题意:给出n个不相同的数,问选出尽量多的数且任两个数字二进制下不同位数大于等于2. 解法:能想到大于等于2反向思考的话,不难发现这是一个二分图,那么根据原图的最大团等于补图的最大独立点集,此问题就变成 ...

  10. php7类型约束的意义

    在PHP7之前,函数和类方法不需要声明变量类型,任何数据都可以被传递和返回,导致几乎大部分的调用操作都要判断返回的数据类型是否合格. 为了解决这个问题,PHP7引入了类型声明. 目前有两类变量可以声明 ...