热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AI动物识别专家系统实验报告

1、问题描述及实验要求动物识别专家系统设计,并编程实现。包含事实库和规则库查找与规则前提链中前提号相同的事实如果事实的断言为真则判断下一个前提,为假,则表示该规则不适合事实断言为不

1、 问题描述及实验要求

动物识别专家系统设计,并编程实现。
//包含事实库和规则库
//查找与规则前提链中前提号相同的事实
//如果事实的断言为真则判断下一个前提,为假,则表示该规则不适合
//事实断言为不知道的时候,向用户询问

规则I1 如果 该动物有毛发,那么 它是哺乳动物
规则I2 如果 该动物能产乳,那么 它是哺乳动物
规则I3 如果 该动物有羽毛,那么 它是鸟类动物
规则I4 如果 该动物能飞行,它能生蛋,那么 它是鸟类动物
规则I5 如果 该动物是哺乳动物,它吃肉,那么 它是食肉动物
规则I6 如果 该动物是哺乳动物,它长有爪子,它长有利齿,它眼睛前视,那么 它是食肉动物
规则I7 如果 该动物是哺乳动物,它长有蹄,那么 它是有蹄动物
规则I8 如果 该动物是哺乳动物,它反刍,那么 它是有蹄动物,并且是偶蹄动物
规则I9 如果 该动物是食肉动物,它的颜色是黄褐色,它有深色的斑点,那么它是猎豹
规则I10 如果 该动物是食肉动物,它的颜色是黄褐色,它有黑色条纹,那么它是老虎
规则I11 如果 该动物是有蹄动物,它有长腿,它有长颈,它的颜色是黄褐色,它有深色的斑点,那么 它是长颈鹿
规则I12 如果 该动物是有蹄动物,它的颜色是白的,它有黑色条纹,那么它是斑马
规则I13 如果 该动物是鸟类,它不会飞,它有长腿,它有长颈,它的颜色是黑、白色相杂,那么 它是鸵鸟
(规则I13的IF部分的条件“它有长腿”和“它有长颈”,也出现在规则I11的IF部分。I11是有蹄动物的,而I13是鸟的分类,无混淆)
规则I14 如果 该动物是鸟类,它不能飞行,它能游水,它的颜色是黑色和白色,那么 它是企鹅
规则I15 如果 该动物是鸟类,它善于飞行,那么 它是海燕

2、 算法描述

  1. 构造事实集
    对以上的15条规则提取取样,可总结出本次动物识别的特征,如下:
    [“有毛发”, “有奶”, “有羽毛”, “会飞”, “会下蛋”, “吃肉”, “有犬齿”, “有爪”, “眼盯前方”, “有蹄”, “嚼反刍”, “黄褐色”, “身上有暗斑点”, “身上有黑色条纹”,“有长脖子”, “有长腿”, “不会飞”, “会游泳”, “有黑白二色”, “善飞”, “哺乳动物”, “鸟”, “食肉动物”, “蹄类动物”, “猎豹”, “老虎”, “长颈鹿”, “斑马”, “鸵鸟”,“企鹅”, “海燕”]
  2. 构造规则集
    为规则集里面的特征从1开始编号,根据上述的15条规则可构造出规则集:
    [2] → [21]
    [1] → [21]
    [3] → [22]
    [4, 5] → [22]
    [8, 7, 9] → [23]
    [6] → [23]
    [21, 10] → [24]
    [21, 11] → [24]
    [21, 23, 12, 14] → [26]
    [21, 23, 12, 13] → [25]
    [24, 15, 16, 13] → [27]
    [24, 14] → [28]
    [22, 17, 16, 15, 19] → [29]
    [22, 17, 18, 19] → [30]
    [22, 4] → [31]
  3. 代码运行介绍
    i 首先定义了事实库和规则库,用于匹配查找,定义了全局变量new_answer用来存放输入的所有特征
    ii定义几个函数:
    1) displayInfor:用来把事实库里面的动物特征打印输出,方便用户选择
    2) input1:接收第一次的输入,以逗号为分隔符
    3) input2:对于那些有大于1个特征的规则,可以继续输入
    4) control:核心函数。识别动物。对每条规则进行判断,如果输入与规则集中的某一条相等的话,那么输出对应的结果。对于那些大于1条特征的规则,用set(A).issubset(set(B)),来判断两个集合的包含关系,如果包含的话,那么继续输入(即input2函数)。最后,如果都不符合,输出‘识别失败’。
    iii 运行:先打印显示菜单,然后输入第一次特征集,运行control控制器进行匹配

3、 代码

import sys
# 事实库
features = ["", "有毛发", "有奶", "有羽毛", "会飞", "会下蛋", "吃肉", "有犬齿", "有爪", "眼盯前方", "有蹄", "嚼反刍", "黄褐色", "身上有暗斑点", "身上有黑色条纹",
"有长脖子", "有长腿", "不会飞", "会游泳", "有黑白二色", "善飞", "哺乳动物", "鸟", "食肉动物", "蹄类动物", "猎豹", "老虎", "长颈鹿", "斑马", "鸵鸟",
"企鹅", "海燕"]
# 规则库
rule = [[], [2], [1], [3], [4, 5], [8, 7, 9], [6], [21, 10], [21, 11], [21, 23, 12, 14], [21, 23, 12, 13],
[24, 15, 16, 13], [24, 14], [22, 17, 16, 15, 19], [22, 17, 18, 19], [22, 4]]
new_answer = []
# 显示选项菜单
def displayInfor():
print('以下是一些动物的特征:\n')
i = 1
while i < 25:
print('%d' % i + '.' + features[i] + ' ', end='')
i = i + 1
if i % 6 == 1:
print('\n')
# 第一次添加
def input1():
answer = input('请选择动物的特征编号,用英文逗号分开,回车结束输入:')
try:
answer = list(answer.split(','))
new_answer = [int(x) for x in answer]
return new_answer
except Exception:
print('您输入的是数字格式有误')
sys.exit()
# 继续添加特征
def input2(arr):
answer = input('请继续添加动物的特征编号,用英文逗号分开,回车结束输入:')
try:
answer = list(answer.split(','))
new_answer = [int(x) for x in answer]
for val in new_answer:
arr.append(val)
except Exception:
print('您输入的是数字格式有误')
sys.exit()
# 控制器
def control():
while 1:
if new_answer == rule[1]:
print(features[21])
break
elif new_answer == rule[2]:
print(features[21])
break
elif new_answer == rule[3]:
print(features[22])
break
elif set(new_answer).issubset(set(rule[4])):
if new_answer == rule[4]:
print(features[22])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[5])):
if new_answer == rule[4]:
print(features[23])
break
else:
input2(new_answer)
elif new_answer == rule[6]:
print(features[23])
elif set(new_answer).issubset(set(rule[7])):
if new_answer == rule[7]:
print(features[24])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[8])):
if new_answer == rule[8]:
print(features[24])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[9])):
if new_answer == rule[9]:
print(features[26])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[10])):
if new_answer == rule[10]:
print(features[25])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[11])):
if new_answer == rule[11]:
print(features[27])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[12])):
if new_answer == rule[12]:
print(features[28])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[13])):
if new_answer == rule[13]:
print(features[29])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[14])):
if new_answer == rule[14]:
print(features[30])
break
else:
input2(new_answer)
elif set(new_answer).issubset(set(rule[15])):
if new_answer == rule[15]:
print(features[31])
break
else:
input2(new_answer)
else:
print('识别失败!')
displayInfor()
new_answer = input1()
control()

4、 实验结果分析

实验结果截图:
《AI动物识别专家系统-实验报告》
图1-动物识别专家系统


推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • Python之基础篇(三)
    基础篇之三:一,数据类型之set.总结:set无序,不重复。1,创建set:s{1,2,3}print(s,type(s))list1[1,2,3]s1(list1)prin ... [详细]
  • 这篇文章主要讲解了“怎么用Python写一个电信客户流失预测模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入, ... [详细]
  • 第八章 元组与集合
    目录​一、元组二、集合三、集合的数学操作四、集合的相关操作五、集合间的关系六、列表、元组、集合、字典区别一、元组元组是python内置的数据结构之一, ... [详细]
author-avatar
吴姿云68153
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有