人工智能基础 | 基于产生式的动物识别系统(Python)

一、实验目的:复习产生式基本知识

1、产生式:一组产生式,互相配合/协调,其中一个产生式产生的结论可以作为另一个产生式的事实使用,以求解问题

2、下图为产生式系统的基本结构:

3、规则库:用于描述相应领域内过程性知识的产生式集合。对知识进行合理的组织与管理,提高问题求解效率。

4、综合数据库: 综合数据库(事实库、上下文、黑板等):存放问题求解过程中的各种信息的数据结构,包括初始状态、原始证据、中间结论、最终结论,其内容在推理过程中在动态、不断变化的。

5、控制系统(推理机):由一组程序组成,负责整个产生式系统的运行,实现对问题的求解。

6、控制系统要做以下几项工作:

  • 从规则库中选择与综合数据库中的已知事实进行匹配。
  • 匹配成功的规则可能不止一条,进行冲突消解。
  • 执行某一规则时,如果其右部是一个或多个结论,则把这些结论加入到综合数据库中:如果其右部是一个或多个操作,则执行这些操作。
  • 检查综合数据库中是否包含了最终结论,决定是否停止系统的运行。
  • 二、实验要求

    1、编程环境

    Python语言。

    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  该动物是长颈鹿                                    

    r 12:IF  该动物有蹄类动物  AND  身上有黑色条纹   THEN  该动物是斑马

    r13:IF  该动物是鸟   AND  有长脖子  AND  有长腿 AND  不会飞

                       AND  有黑白二色      THEN  该动物是鸵鸟

    r14: IF  该动物是鸟  AND 会游泳 AND 不会飞

                       AND  有黑白二色      THEN  该动物是企鹅                        

    r15: IF  该动物是鸟   AND  善飞     THEN  该动物是信天翁

    3、解决思路

  • 首先,将每一个前提条件转换为一个对应的唯一的一个数学数字。
  • 其次,将每一个中间结论转换为一个对应的唯一的一个数学数字。
  • 再次,将每一个最后结论转换为一个对应的唯一的一个数学数字。
  • 最后,将15个产生式规则转换为一个对应的数字表示。
  • 最后,使用循环等Python结构将所有数字表示的产生式规则表示出。这样,每对应输入一组已知信息,如前面的“暗斑点,长脖子,长腿,奶,蹄”,就可相应的得到一个数字输出,它代表要识别的动物。
  • 注意:使用过的规则要标记一下,下次不再使用;得到的中间结论要加入到综合数据库中。
  • 三、源代码

    
    def find_data(process_data_list):
        # 依次进行循环查找并对过程排序
        for epoch, data_process in enumerate(data_process_list):
            # 用于判断此过程是否成立
            num = 0
            for i in process_data_list:
                if i in data_process:
                    num += 1
            # 过程成立则数值相同,可以进入下一步
            if num == len(data_process):
                # 此过程中结果是否为最终结果,不是将此过程结果加入到过程中
                if data_result_list[epoch] not in result_list:
                    # 弹出过程和此过程结果,因为此过程已经进行过,此结果存入需要查找的过程中
                    result = data_result_list.pop(epoch)
                    process = data_process_list.pop(epoch)
                    # 判断结果是否已经存在过程中,存在则重新寻找,不存在则加入过程,并将其存入最终结果
                    if result not in process_data_list:
                        dict_input[','.join(process)] = result
                        end_result = find_data(process_data_list + [result])
                        if end_result == 1:
                            return 1
                        else:
                            return 0
                    # 存在则直接寻找
                    else:
                        end_result = find_data(process_data_list)
                        if end_result == 1:
                            return 1
                        else:
                            return 0
                # 找到最终结果,取出结果后返回
                else:
                    process = data_process_list.pop(epoch)
                    dict_input[','.join(process)] = data_result_list[epoch]
                    return 1
    
    
    if __name__ == '__main__':
        # 用于储存中间过程
        data_process_list = []
        # 用于存储过程对应的结果
        data_result_list = []
        # 存储用于查询的数据
        list_data = []
        # 用于存储输出结果
        dict_input = {}
    
        # 规则库
        txt = '''有毛发,是哺乳动物
    有奶,是哺乳动物
    有羽毛,是鸟类
    会飞,会下蛋,是鸟类
    吃肉,是肉食动物
    有犬齿,有爪,眼盯前方,是食肉动物
    是哺乳动物,有蹄,是蹄类动物
    是哺乳动物,是咀嚼反刍动物,是蹄类动物
    是哺乳动物,是食肉动物,是黄褐色,身上有暗斑点,金钱豹
    是哺乳动物,是食肉动物,是黄褐色,身上有黑色条纹,虎
    是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
    是蹄类动物,身上有黑色条纹,斑马
    是鸟,有长脖子,有长腿,不会飞,鸵鸟
    是鸟,会游泳,不会飞,有黑白二色,企鹅
    是鸟,善飞,信天翁'''
    
        # 将数据预处理
        datas = txt.split('\n')
        for data in datas:
            data = data.split(',')
            data_process_list.append(data[:-1])
            data_result_list.append(data[-1].replace('\n', ''))
    
        # 最终结果列表
        result_list = ['信天翁', '鸵鸟', '斑马', '长颈鹿', '虎', '金钱豹', '企鹅']
    
        # 数据库对应的过程
        database = {
            '1': '有毛发', '2': '有奶', '3': '有羽毛', '4': '会飞', '5': '会下蛋',
            '6': '吃肉', '7': '有犬齿', '8': '有爪', '9': '眼盯前方', '10': '有蹄',
            '11': '是咀嚼反刍动物', '12': '是黄褐色', '13': '身上有暗斑点', '14': '身上有黑色条纹',
            '15': '有长脖子', '16': '有长腿', '17': '不会飞', '18': '会游泳', '19': '有黑白二色',
            '20': '善飞', '21': '是哺乳动物', '22': '是鸟', '23': '是食肉动物', '24': '是蹄类动物',
            '25': '金钱豹', '26': '虎', '27': '长颈鹿', '28': '斑马', '29': '鸵鸟', '30': '企鹅',
            '31': '信天翁'
        }
    
        # 打印条件输入菜单
        print("输入对应条件前面的数字编号:")
        print("*************************************************************")
        for key, value in database.items():
            print(f"{key}:{value}  ", end="")
            if int(key) % 5 == 0:  # 每5个换行
                print()
        print("*************************************************************")
        print("*********************当输入数字0时!程序结束******************\n")
    
        # 循环进行输入,直到碰见0后退出
        while True:
            term = input("请输入数字编号:")
            if term == '0':
                break
            if term in database and database[term] not in list_data:
                list_data.append(database[term])
    
        # 打印前提条件
        print('前提条件为:')
        print(' '.join(list_data) + '\n')
    
        # 进行递归查找,直到找到最终结果,返回1则找到最终结果
        end_result = find_data(list_data)
        if end_result == 1:
            print('推理过程如下:')
            # 将结果进行打印
            for i in dict_input.keys():
                print(f"{i}->{dict_input[i]}")
                # 得到最终结果即输出所识别动物
                if dict_input[i] in result_list:
                    print(f'所识别的动物为{dict_input[i]}')
        else:
            # 将结果进行打印
            for i in dict_input.keys():
                print(f"{i}->{dict_input[i]}")
    
    

    四、 运行结果展示以及说明

    1->21 由前提条件有毛可推出要识别的动物是哺乳类

    2->21  由前提条件有奶可推出要识别的动物是哺乳类

    7,8,9->23  由前提条件有犬齿,有爪,眼盯前方可推出要识别的动物是食肉动物

    作者:myy的源代码

    物联沃分享整理
    物联沃-IOTWORD物联网 » 人工智能基础 | 基于产生式的动物识别系统(Python)

    发表回复