人工智能-产生式系统实验(动物识别)

1.实验目的

1.熟悉知识的表示方法
2.掌握产生式系统的运行机制
3.产生式系统推理的基本方法。

2.实验内容

运用所学知识,设计并编程实现一个小型动物识别系统,能识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。
规则库:
r1: IF 该动物有毛发 THEN 该动物是哺乳动物
r2: IF 该动物有奶 THEN 该动物是哺乳动物
r3: IF 该动物有羽毛 THEN 该动物是鸟
r4: IF 该动物会飞 AND 会下蛋 THEN 该动物是鸟
r5: IF 该动物吃肉 THEN 该动物是食肉动物
r6: IF 该动物有犬齿 AND 有爪 AND 眼盯前方 THEN 该动物是食肉动物
r7: IF 该动物是哺乳动物 AND 有蹄 THEN 该动物是有蹄类动物
r8: IF 该动物是哺乳动物 AND 是反刍动物 THEN 该动物是有蹄类动物
r9: IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色 AND 身上有暗斑点 THEN 该动物是金钱豹
r10:IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色 AND 身上有黑色条纹 THEN 该动物是虎
r11:IF 该动物是有蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是长颈鹿
r12:IF 该动物有蹄类动物 AND 身上有黑色条纹 THEN 该动物是斑马
r13:IF 该动物是鸟 AND 有长脖子 AND 有长腿 AND 不会飞 AND 有黑白二色 THEN 该动物是鸵鸟
r14:IF 该动物是鸟 AND 会游泳 AND 不会飞 AND 有黑白二色 THEN 该动物是企鹅
r15:IF 该动物是鸟 AND 善飞 THEN 该动物是信天翁
要求给定初始条件,能识别出是哪种动物。
比如已知初始事实存放在综合数据库中:
有毛发 吃肉 是黄褐色 身上有黑色条纹
运行后得该动物是:虎

3.实验原理

产生式通常用于表示事实、规则以及它们的不确定性度量,适合于表示事实性知识和规则性知识。

确定性规则知识的产生式表示
不确定性规则知识的产生式表示
确定性事实性知识的产生式表示
不确定性事实性知识的产生式表示
产生式与谓词逻辑中的蕴含式的区别:

除逻辑蕴含外,产生式还包括各种操作、规则、变换、算子、函数等。例如,“如果炉温超过上限,则立即关闭风门”是一个产生式,但不是蕴含式。
蕴含式只能表示精确知识,而产生式不仅可以表示精确的知识,还可以表示不精确知识。蕴含式的匹配总要求是精确的。产生式匹配可以是精确的,也可以是不精确的,只要按某种算法求出的相似度落在预先指定的范围内就认为是可匹配的。
产生式的形式描述及语义——巴科斯范式BNF(backus normal form)

符号“::=”表示“定义为”;符号“|”表示“或者是”;符号“[ ]”表示“可缺省”。

产生式系统的基本结构

产生式系统

1,规则库:用于描述相应领域内知识的产生式集合
2,综合数据库:一个用于存放问题求解过程中各种当前信息的数据结构
3,控制系统:由一组程序组成,负责整个产生式系统的运行,实现对问题的求解。控制系统要做以下几项工作:
从规则库中选择与综合数据库中的已知事实进行匹配。
匹配成功的规则可能不止一条,进行冲突消解。
执行某一规则时,如果其右部是一个或多个结论,则把这些结论加入到综合数据库中:如果其右部是一个或多个操作,则执行这些操作。
对于不确定性知识,在执行每一条规则时还要按一定的算法计算结论的不确定性。
检查综合数据库中是否包含了最终结论,决定是否停止系统的运行
产生式表示法的特点
优点:自然性、模块性、有效性、清晰性
缺点:效率不高、不能表达结构性知识


4.解题思路

 

5.Python编程实现

# 动物识别系统# 规则库
txt_rule = '''有毛发,是哺乳动物
有奶,是哺乳动物
有羽毛,是鸟
会飞,会下蛋,是鸟
吃肉,是肉食动物
有犬齿,有爪,眼盯前方,是食肉动物
是哺乳动物,有蹄,是蹄类动物
是哺乳动物,是咀嚼反刍动物,是蹄类动物
是哺乳动物,是食肉动物,是黄褐色,身上有暗斑点,金钱豹
是哺乳动物,是肉食动物,是黄褐色,身上有黑色条纹,虎
是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
是蹄类动物,身上有黑色条纹,斑马
是鸟,有长脖子,有长腿,不会飞,有黑白二色,鸵鸟
是鸟,会游泳,不会飞,有黑白二色,企鹅
是鸟,善飞,信天翁'''# 特征值字典
character_dict = {'1': '有毛发', '2': '有奶', '3': '有羽毛', '4': '会飞', '5': '会下蛋','6': '吃肉', '7': '有犬齿', '8': '有爪', '9': '眼盯前方', '10': '有蹄','11': '是咀嚼反刍动物', '12': '是黄褐色', '13': '身上有暗斑点','14': '身上有黑色条纹', '15': '有长脖子', '16': '有长腿','17': '不会飞', '18': '会游泳', '19': '有黑白二色','20': '善飞', '21': '是哺乳动物', '22': '是鸟','23': '是食肉动物', '24': '是蹄类动物', }
# 结果值字典
result_dict = {'25': '信天翁', '26': '鸵鸟', '27': '斑马', '28': '长颈鹿','29': '虎', '30': '金钱豹', '31': '企鹅'}
# 数据库对应的过程,合并两个字典
database = {**character_dict, **result_dict}# 规则库数据转换为了列表
def get_data_list():# 用于储存中间过程data_process_list = []# 用于存储过程对应的结果data_result_list = []# 将规则库数据预处理data_str = txt_rule.split('\n')for data in data_str:data = data.split(',')data_process_list.append(data[:-1])data_result_list.append(data[-1].replace('\n', ''))return data_process_list, data_result_list# 特征值字典转为提示词
def character_dict_trans():# 使用enumerate()函数获取字典的键值对及其索引indexed_data = list(enumerate(character_dict.items()))rsp_str = ''# 使用for循环遍历这些键值对,每5个元素输出为1行for i in range(0, len(indexed_data), 5):line = ''for j in range(5):if i + j < len(indexed_data):line += str(indexed_data[i + j][1][0] + ':' + indexed_data[i + j][1][1]) + '  '# print(line)rsp_str += line + '\n'return rsp_str# 通过传入的列表寻找结果
def find_data(process_data_list, dict_output):# 依次进行循环查找并对过程排序for index, data_process in enumerate(data_process_list):# 用于判断此过程是否成立num = 0for data in process_data_list:if data in data_process:num += 1# 过程成立则数值相同,可以进入下一步if num == len(data_process):# 此过程中结果是否为最终结果,不是将此过程结果加入到过程中if data_result_list[index] not in result_dict.values():# 弹出过程和此过程结果,因为此过程已经进行过,此结果存入需要查找的过程中result = data_result_list.pop(index)process = data_process_list.pop(index)# 判断结果是否已经存在过程中,存在则重新寻找,不存在则加入过程,并将其存入最终结果if result not in process_data_list:dict_output[','.join(process)] = resultend_result = find_data(process_data_list + [result], dict_output)if end_result == 1:return 1else:return 0# 存在则直接寻找else:end_result = find_data(process_data_list, dict_output)if end_result == 1:return 1else:return 0# 找到最终结果,取出结果后返回else:process = data_process_list.pop(index)dict_output[','.join(process)] = data_result_list[index]return 1# 快速排序算法
def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)if __name__ == '__main__':# 规则库数据转换为了列表data_process_list, data_result_list = get_data_list()print_str_start = '''输入对应条件前面的数字编号:
*************************************************************
'''print_str_end = '''*************************************************************
*********************当输入数字0时!程序结束******************
'''# 特征值字典转为提示词character_str = character_dict_trans()character_all_str = print_str_start + character_str + print_str_endprint(character_all_str)# 存储用于查询的数据list_data = []# 循环进行输入,直到碰见0后退出while 1:input_num = input("请输入数字编号:")# 当输入数字0时!程序结束if input_num == '0':break# 输入数字编号,不在查询数据的列表中if input_num not in list_data:# 则加入查询列表list_data.append(input_num)# 将查询数字编号从小到大排序sorted_list_data = quick_sort([int(i) for i in list_data])# 打印查询条件list_data_str = [character_dict[str(i)] for i in sorted_list_data]print('查询条件为:' + ' '.join(list_data_str) + '\n')# 用于存储输出结果dict_output = {}# 进行递归查找,直到找到最终结果,返回1则找到最终结果end_result = find_data(list_data_str, dict_output)# 查找成功时if end_result == 1:print('查询成功,推理过程如下:')# 将结果进行打印for data in dict_output.keys():print(f"{data}->{dict_output[data]}")# 得到最终结果即输出所识别动物if dict_output[data] in result_dict.values():print(f'所识别的动物为:{dict_output[data]}')else:  # 查找失败时print('条件不足,无匹配规则,查询失败.')

6.运行测试效果

 ==========结束==========

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/226106.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows服务设置多个服务依赖项避免服务启动失败找不到数据库

添加多个服务依赖项建议通过命令行的方式添加&#xff1a; winr键打开命令行 cmd 命令行添加命令如下&#xff1a; sc config "thinvent-auth" depend "MySQL57"/"RabbitMQ"/"Redis" sc config "服务A" depend "服务…

【傻瓜级JS-DLL-WINCC-PLC交互】4.DLL读取WINCC内部变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

联邦学习Federated Learning(FL)

联邦学习Federated Learning 序言FL流程细节FL代码实现&#xff08;Pytorch&#xff09;Reference 序言 手机的数据涉及到个人隐私和安全&#xff0c;如果将客户端的数据上传到服务端&#xff0c;终究是很容易泄漏出用户的信息&#xff0c;何况 用户也不愿意把自己的数据交给服…

Life Beyond 工作室 x Incredibuild

Life Beyond 工作室简介 Life Beyond 工作室&#xff08;前身为 Darewise&#xff09;是 Animoca Brands 旗下的一家游戏工作室&#xff0c;由 AAA 游戏行业的资深人士创立&#xff0c;目前正在开发 Life Beyond 游戏&#xff0c;一款边玩边赚的科幻类大型多人在线游戏。工作室…

食材管家,轻松搞定!商户选择生鲜配送系统的原因

随着消费者对生鲜食品的需求不断增加&#xff0c;生鲜市场逐渐成为了电商领域中的热门行业。而生鲜配送系统&#xff0c;则是生鲜电商发展中不可或缺的一部分。本文将探讨商户选择生鲜配送系统的几个原因。 1. 提高效率 生鲜配送系统通过智能化的订单处理、路线规划和配送优化…

Unity中Shader的BRDF解析(三)

文章目录 前言一、BRDF中的镜面反射项二、分别解析每一个参数1、D、G函数&#xff1a;speclarTerm2、其他中间步骤3、光照颜色4、F函数&#xff08;菲涅尔函数&#xff09; &#xff1a;FresnelTermIBL在下篇文章中继续解析 三、最终代码.cginc文件:Shader文件&#xff1a; 前言…

Matplotlib图形注释_Python数据分析与可视化

Matplotlib图形注释 添加注释文字、坐标变换 有的时候单单使用图形无法完整清晰的表达我们的信息&#xff0c;我们还需要进行文字进行注释&#xff0c;所以matplotlib提供了文字、箭头等注释可以突出图形中重点信息。 添加注释 为了使我们的可视化图形让人更加容易理解&#…

西工大网络空间安全学院计算机系统基础实验一(123)

在实验零中&#xff0c;我们拿到了lab1-handout.zip压缩文件&#xff0c;接着&#xff0c;我们使用unzip ./lab1-handout.zip命令&#xff0c;解压缩该压缩文件。解压缩成功后&#xff0c;使用"ls"命令查看当前工作目录下的文件和文件夹&#xff0c;发现得到了"…

16.spirng源码解析-registerBeanPostProcessors

注册拦截bean创建的bean处理器 此部分实质上是在BeanDefinitions中寻找BeanPostProcessor&#xff0c;之后调用BeanFactory.addBeanPostProcessor方法保存在一个List中&#xff0c;注意添加时仍然有优先级的概念&#xff0c;优先级高的在前面。

竞赛选题 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正

文章目录 0 简介1 思路简介1.1 车牌定位1.2 畸变校正 2 代码实现2.1 车牌定位2.1.1 通过颜色特征选定可疑区域2.1.2 寻找车牌外围轮廓2.1.3 车牌区域定位 2.2 畸变校正2.2.1 畸变后车牌顶点定位2.2.2 校正 7 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享…

漏电保护器工作原理

漏电保护器 漏电保护器是低压线路中最常用的保护器之一&#xff0c;简称漏保&#xff0c;又称漏电开关或漏电断路器。漏电保护器除了具有空开的所有保护功能外&#xff0c;还具备漏电保护功能。 需要了解 一根通电导线可以产生磁场&#xff0c;磁场与电流方向遵循右手螺旋关…

微信如何养号?

目前导致微信封号的几点原因如下&#xff1a; 1.使用虚拟定位软件&#xff0c;进行附近人任务&#xff0c;频繁的切换ip&#xff0c;极易被判定微信被盗,对其封号 2.频发的群发骚扰消息&#xff0c;朋友圈发送过于频繁&#xff0c;给别人造成骚扰及其投诉 3.和微信好友聊天涉…