一、基础知识库

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

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

二、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. PHP+JS的信息提示弹窗

    基于PHP函数的Msg信息提示框 1.可以设置弹出信息,跳转地址,跳转的时间,跳转的信息标题提示: 2.代码实例: <?php function ShowMsg($msg, $gourl,$ti ...

  2. [BOI 2008]Elect 选举

    题目描述 N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党 ...

  3. Python中的装饰器,迭代器,生成器

    1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...

  4. 实验报告(七)&第九周课程总结

    班级 计科二班 学号 20188425 姓名 IM 完成时间2019/10/24 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: ...

  5. 微信小程序实战篇-分类页面制作

    https://blog.csdn.net/u012927188/article/details/73650264

  6. luoguP1080 国王游戏 题解(NOIP2012)(贪心+高精)

    luoguP1080 国王游戏 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

  7. element UI的使用

    npm install --save element-ui main.js里面添加 import ElementUI from 'element-ui' import 'element-ui/lib/ ...

  8. php yield关键字以及协程的实现

    php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解 Iterator接口 在php中,除了数组,对象可以被foreach遍历之外,还 ...

  9. PROXY——代理模式

    代理,说白了就是中介.假设有俩对象A和B,A想访问B,但是根据迪米特法则,我们不能喝陌生人说话,简而言之就是A要减少知道B的相关情况,要降低A与B的耦合度.这时我们使用中介C,而C拥有B的相关情况,A ...

  10. Codeforces 1185G2 Playlist for Polycarp (hard version) 背包,暴力

    题意及思路:https://www.cnblogs.com/Als123/p/11061147.html 代码: #include <bits/stdc++.h> #define LL l ...