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

news2024/11/23 18:58:51

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 = 0
        for 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)] = result
                    end_result = find_data(process_data_list + [result], dict_output)
                    if end_result == 1:
                        return 1
                    else:
                        return 0
                # 存在则直接寻找
                else:
                    end_result = find_data(process_data_list, dict_output)
                    if end_result == 1:
                        return 1
                    else:
                        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 arr
    pivot = 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_end
    print(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.coloradmin.cn/o/1262825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是虚拟化?如何监控虚拟化设备

虚拟化是创建物理 IT 资源&#xff08;如服务器或桌面&#xff09;的虚拟版本的行为&#xff0c;虚拟机&#xff08;VM&#xff09;是在物理主机设备上创建的&#xff0c;VM 的行为与物理设备完全相同&#xff0c;并且可以从主机运行不同的操作系统。 例如&#xff0c;您可以在…

centos服务器扩容

centos服务器扩容 我的情况是&#xff0c;原服务器是一个80g磁盘&#xff0c;管理员又追加了120G到这块磁盘上&#xff0c;需要把这120G重新追加使用。 请确认你遇到的情况是否和我初始截图一致&#xff0c;再往下看&#xff0c;免得浪费时间与精力 服务器中有120G尚未使用&…

智能测径仪从这五大方面提升了性能

在测径仪的研发升级中&#xff0c;蓝鹏测控从未停下脚步&#xff0c;研究新的技术&#xff0c;让测径仪更好的为产线服务的功能。目前提供两种类型的在线测径仪&#xff0c;普通测径仪与智能测径仪&#xff0c;智能型主要在这五大方面进行了性能提升。 1、自动化程度 智能测径…

Update this scope and remove the “systemPath“

问题 解析&#xff1a; 在特定的指定路径上查找系统相关性。这大大降低了可移植性&#xff0c;因为如果您将工件部署在一个与您的环境不同的环境中&#xff0c;代码将无法工作。 解决&#xff1a; 1 使用官方maven仓库的第三方jar包 2 如果官方仓库不存在jar包&#xff0c;…

抖去推--短视频账号矩阵系统saas工具源码技术开发(源头)

一、短视频矩阵系统搭建常见问题&#xff1f; 1、抖去推的短视频AI矩阵营销软件需要一定的技术水平吗&#xff1f; 答&#xff1a;不需要。产品简单易用&#xff0c;不需要具备专业的技术水平&#xff0c;即使是初学者&#xff0c;也能够轻松上手操作。 3、抖去推的短视频AI矩…

E云管家微信群聊机器人开发

请求URL&#xff1a; http://域名地址/modifyGroupRemark 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRo…

my.ini添加了一句后又删除了,重启却失败的解决办法

背景&#xff1a;添加了一句&#xff0c;然后保存了&#xff0c;之后打开删掉了&#xff0c;结果就无法启动了&#xff0c;最后另存为ANSI格式&#xff0c;再把这个格式文件覆盖my.ini即可解决

有哪些程序员兼职接单的网站可以推荐?

话说程序员这个职业有个好处就是可以给自己打工&#xff0c;只要掌握了一技之长&#xff0c;就可以到外面接私活&#xff0c;一方面增加了自己的收入&#xff0c;另一方面还锻炼了自己的技术。 相信很多新手程序员&#xff0c;都希望能迅速提高自己的能力同时&#xff0c;又可…

flutter 文本不随系统设置而改变大小[最全的整理]

文本不随系统设置而改变大小[三] 前言方案十三&#xff1a;使用Flexible方案十四&#xff1a;使用MediaQueryData的textScaleFactor属性方案十五&#xff1a;使用FractionallySizedBox方案十六&#xff1a;使用自定义文本样式方案十七&#xff1a;使用自定义绘制&#xff08;Cu…

接口测试及常用接口测试工具(含文档)

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

MFC哈希实现 目标:知道初始密码的人,才能改密码及登录。只知道登录密码只能登录。避免密码直接写在代码里或本地,通过软件评估报告。----安全行业基础5

一种简单的登录设计&#xff0c;密码保存在本地。&#xff08;直接MD5不安全&#xff0c;别人可以更换本地的密码,得再加一层算法就相对安全一点&#xff09; 当然也可以用加密机或专门存密码的系统来实现&#xff0c;就过于复杂。目标&#xff1a;1、为了避免密码直接写在代码…

eNSP防火墙USG6000V使用Web界面登入教程

文章目录 登入流程1、下载USG6000V的镜像包2、导入USG6000V的镜像包3、配置防火墙web页面4、修改本机vmnet1网卡的ipv4地址5、在eNSP上添加云6、配置防火墙管理地址&#xff0c;开启http服务7、关闭电脑防火墙8、访问web页面 登入流程 1、下载USG6000V的镜像包 链接&#xff…

数字人担任展会虚拟主持人,如何释放大会新活力?

近日&#xff0c;虚拟主持人谷小雨解锁新身份&#xff0c;作为第二届全球数字贸易博览会的“数字新闻官”为大众播报展会的热门新闻话题&#xff0c;带领大众探索未来数字贸易的无限可能。 *图片源于网络 随着元宇宙的概念更多地深入各领域&#xff0c;数字人多次以虚拟主持人或…

Docker | 自定义Docker镜像

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Docker系列 ✨特色专栏&#xff1a; My…

Spring---IOC与DI

文章目录 什么是Spring&#xff1f;什么是Ioc&#xff1f;通过代码案例理解总结代码案例真正理解Ioc 什么是DI&#xff1f; 什么是Spring&#xff1f; Spring指的是 Spring Framework &#xff08;Spring框架&#xff09;&#xff0c;它是一个开源的框架&#xff0c;有着活跃而…

【带头学C++】----- 八、C++面向对象编程 ---- 8.7 引用(Reference)

目录 8.7 引用&#xff08;Reference&#xff09; 8.7.1 普通变量引用 8.7.2 数组引用 8.7.3 指针变量的引用方法 8.7.4 函数的引用 8.7.5 引用作为函数的参数 8.7.6 引用作为函数的返回值类型 1. 返回值类型不用使用局部变量的引用类型 2.返回值类型为引用&#xff0…

es集群相关报错信息

给es集群添加用户密码的时候&#xff0c;会自动弹出相关的账户信息&#xff0c;这个时候&#xff0c;只需要设置对应密码就可以了 [esuserjky-test1 bin]$ ./elasticsearch-setup-passwords interactive future versions of Elasticsearch will require Java 11; your Java ve…

【Linux】了解进程的基础知识

进程 1. 进程的概念1.1 进程的理解1.2 Linux下的进程1.3 查看进程属性1.4 getpid和getppid 2. 创建进程3. 进程状态4. 进程优先级5. 进程切换6. 环境变量7. 本地变量与内建命令 1. 进程的概念 一个已经加载到内存中的程序&#xff0c;叫做进程&#xff08;也叫任务&#xff09…

2021年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中,获取不同的数据可能会出现需要请求多个不同服务器地址的域名,这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置: 跨域配置: 在vue项目的vue.config.js文件…