写在前面:其实这个实验一开始我连python怎样去操作表格都不知道,只是有一点点的python基础,你这一下让我做一个产生式系统那这不是为难我嘛。经过查网上的代码,我发现,网上所有代码都没有做到程序与数据进行分离,而这是老师要求最严的一点。不过也是,要算直接写死在代码里直接几个if就好了,多简单,难就难在这里了,推理原理其实很简单。

在写代码之前首先要先建立三个表格来存放数据,

二、实验目的及要求:

1)掌握产生式系统原理。

2)设计产生式系统结构。

3)使用Python实现产生式系统。

4)本实验支撑教学目标2

三、实验设备(环境)及要求

使用Python语言环境;windows系列操作系统环境。

五、实验题目

依据表123数据,设计产生式系统的数据模型。

1 产生式规则

规则码

规则

R1

如果动物有奶,则它是哺乳动物

R2

如果动物有毛发,则它是哺乳动物

R3

如果动物有羽毛,则它是鸟

R4

如果动物会飞且生蛋,则它是鸟

R5

吃肉的哺乳动物是食肉动物

R6

有爪的犬齿目盯前方的哺乳动物是食肉动物

R7

有蹄的哺乳动物是有蹄动物

R8

反刍食物的有蹄动物是偶蹄动物

R9

黄褐色有黑色条文的食肉动物是老虎

R10

黄褐色有黑色斑点的食肉动物是金钱豹

R11

长腿长脖子有黄褐色半点的有蹄动物是长颈鹿

R12

有黑色白条的有蹄动物是斑马

R13

不会飞长腿长脖子的鸟是鸵鸟

R14

不会飞会游泳黑白色的鸟是企鹅

R15

善飞不怕风浪的鸟是海鸥

2 动物特征集合:

有奶,有毛发,有羽毛,会飞,生蛋,有爪,有犬齿,目盯前方,吃肉,有蹄,反刍食物,黄褐色,黑色条纹,黑色斑点,长腿,长脖子,暗斑点,白色,不会飞,黑白色,会游泳,善飞,不怕风浪,哺乳动物,食肉动物,有蹄动物,偶蹄动物

3 动物名称集合:

海燕,老虎,金钱豹,长颈鹿,斑马,鸵鸟,企鹅,海鸥

1.2产生式系统各模块的主要功能

1)综合数据库

综合数据库(事实数据库):是一个用来存放与求解问题有关的各种当前信息的数据库。如,问题的初始状态、输入的事实、推理得到的中间结论以及最终结论等

 

2)规则库

是一个用来存放与求解问题有关的所有规则的集合,也称规则知识库。包含了将问题从初始状态转换成目标状态所需的所有变换规则。

 

3)控制系统(推理机)

由一组程序构成,用来控制整个产生式系统的运行,决定问题求解过程的推理路线、实现对问题的求解。主要包括,初始化综合数据库、选择可用规则、执行选定的规则、决定推理路线、终止推理过程等。

 

1.3 叙述产生式系统工作原理

1)从规则库中选择与综合数据库中的已知事实进行匹配。

2)匹配成功的规则可能不止一条,进行冲突消解。

 3)执行某一规则时,如果其右部是一个或多个结论,则把这些结论加入到综合数据库中:如果其右部是一个或多个操作,则执行这些操作。

 4)对于不确定性知识,在执行每一条规则时还要按一定的算法计算结论的不确定性。    

5)检查综合数据库中是否包含了最终结论,决定是否停止系统的运行。

 

2.运用PythonPandas和面向对象技术设计产生式系统推理模型,开发产生式系统。


import pandas as pd

excel_path = 'E:\Tristan\学习资料及辩论赛\大三\人工智能\实验2\特征.xlsx'
excel_path2 = 'E:\Tristan\学习资料及辩论赛\大三\人工智能\实验2\规则.xlsx'
excel_path3 = 'E:\Tristan\学习资料及辩论赛\大三\人工智能\实验2\动物.xlsx'
# 设置列不限制数量,不然会中间有省略号,数据会看不到
pd.set_option('display.max_columns', None)
# 控制台输出的列数超过1000换行,不然数据表格会折回来
pd.set_option('display.width', 1000)
'''
# 设置行不限制数量,不然会中间有省略号,数据会看不到
pd.set_option('display.max_rows',None)
'''
# te = list(range(1, 27, 1))
d3 = pd.read_excel(excel_path3, sheet_name=0)
d2 = pd.read_excel(excel_path2, sheet_name=0)
d = pd.read_excel(excel_path, sheet_name=0)

# d.index = te
print(d)
print(d2)
print(d3)
l3 = d3['动物'].tolist()  # 把动物表格存进list3 里面
'''
把dataframe的某一列转化成列表
'''
# print(l3)
print('''输入对应条件前面的特征码:
                                *******************当输入数字0时!程序结束***************
            ''')

dict1 = dict(zip(d['特征码'], d['特征']))  # 特征数据库字典
'''
zip()可以将两个可迭代对象中的对应元素打包成一个个元组,然后返回这些元组组成的列表
dict()创建字典,可以传入元组列表创建字典,也可以通过zip得到元组列表后来创建字典
'''
print(dict1)
dict2 = d2.to_dict('index')
'''
把规则数据库转化为复合字典,的每一行作为一个字典值。
Dataframe有自带的方法可以将Dataframe转换为字典的格式。但是,这种方法是复合的字典,每一列以dataframe的index为key而不是某一列的值
,每一列的值作为字典的value,然后再将所有的列放在一个字典里面。
'''
#print(dict2)
# 初始化综合数据库

reallist = []
while (1):
    a = int(input("输入特征"))  # 用户从键盘键入事实
    if a < 0 or a > 26:  # 判断是否输入合规
        print("越界!")
        continue
    if a == 0:  # 若输入0则代表事实输入完毕开始推理
        break
    reallist.append(dict1[a])  # 把用户输入的事实放入综合数据库
print("事实:")
print(reallist)

print("规则数据库:")
able = 0 # 标志位
for x in dict2:  # 遍历规则字典每一条规则,x是键名

    ru = []  # 当前规则列表,把这条规则的特征存入ru

    for y in (dict2[x]):  # 提取规则中的每一个特征,y是键名,也就是dataframe的列名

        if y != '结果' and type((dict2[x])[y]) != float:  # 若没有遍历到结果列且值不为空
            ru.append((dict2[x])[y])  # 则完善当前规则列表,把这个特征加入ru当前规则表
        else:
            break  # 否则本条规则录入结束。
    # print(ru)
    if set(reallist).issuperset(set(ru)):  # 如果综合数据库包含当前规则表的特征,则判断推理结果是否在目标动物列表
        # set是生成集合,issuperset() 方法用于判断指定集合的所有元素是否都包含在原始的集合中,如果是则返回 True,否则返回 False。
        # 即判断前一个列表是否包含后一个列表
        if (dict2[x])["结果"] in l3:  # 如果推理结果在目标动物中
            print()
            print("规则", x, "匹配成功", "规则为:", ru, "-->", (dict2[x])["结果"], "前提:", ru, "结论:", (dict2[x])["结果"])
            print("与目标库匹配成功;")
            print("结论是", (dict2[x])["结果"])
            able = 1  # 标志位,置为1表示找到了
            print()
            break


        else:  # 否则
            print()
            reallist.append((dict2[x])["结果"])  # 把结果存入综合数据库
            print("规则", x, "匹配成功", "规则为:", ru, "-->", (dict2[x])["结果"], "前提:", ru, "结论:", (dict2[x])["结果"])
            print("与目标库匹配失败;")
            print("将结果加入综合数据库:", reallist)
            print()
    else:  # 如果综合数据库包不含当前规则表的特征,输出哪个特征不在数据库中

        buzai = [] #存放不在数据库特征的列表
        for z in ru:
            if (z not in reallist):
                buzai.append(z)
        print("规则", x, "不匹配", "规则为:", ru, "-->", (dict2[x])["结果"], " , 前提:", buzai, "综合数据库中没有")
if (able == 0):  #遍历完后若标志位还是0则没有找到目标
    print("无匹配动物!")


3. 系统运行测试

使用如下特征验证产生式系统推理。要求输出:推理出的动物名称;使用的每一项推理规则及特征;推理结论集合。

1)有羽毛,善飞,不怕风浪,有毛发,吃肉,黄褐色

推理过程:

事实:

['有羽毛', '善飞', '不怕风浪', '有毛发', '食肉动物', '黄褐色']

规则数据库:

规则 0 不匹配 规则为: ['有奶'] --> 哺乳动物  , 前提: ['有奶'] 综合数据库中没有

 

规则 1 匹配成功 规则为: ['有毛发'] --> 哺乳动物 前提: ['有毛发'] 结论: 哺乳动物

与目标库匹配失败;

将结果加入综合数据库: ['有羽毛', '善飞', '不怕风浪', '有毛发', '食肉动物', '黄褐色', '哺乳动物']

 

 

规则 2 匹配成功 规则为: ['有羽毛'] --> 鸟 前提: ['有羽毛'] 结论: 鸟

与目标库匹配失败;

将结果加入综合数据库: ['有羽毛', '善飞', '不怕风浪', '有毛发', '食肉动物', '黄褐色', '哺乳动物', '']

 

规则 3 不匹配 规则为: ['会飞', '生蛋'] -->   , 前提: ['会飞', '生蛋'] 综合数据库中没有

规则 4 不匹配 规则为: ['吃肉', '哺乳动物'] --> 食肉动物  , 前提: ['吃肉'] 综合数据库中没有

规则 5 不匹配 规则为: ['有爪', '有犬齿', '目盯前方', '哺乳动物'] --> 食肉动物  , 前提: ['有爪', '有犬齿', '目盯前方'] 综合数据库中没有

规则 6 不匹配 规则为: ['有蹄', '哺乳动物'] --> 有蹄动物  , 前提: ['有蹄'] 综合数据库中没有

规则 7 不匹配 规则为: ['反刍食物', '有蹄动物'] --> 偶蹄动物  , 前提: ['反刍食物', '有蹄动物'] 综合数据库中没有

规则 8 不匹配 规则为: ['黄褐色', '黑色条纹', '食肉动物'] --> 老虎  , 前提: ['黑色条纹'] 综合数据库中没有

规则 9 不匹配 规则为: ['黄褐色', '黑色斑点', '食肉动物'] --> 金钱豹  , 前提: ['黑色斑点'] 综合数据库中没有

规则 10 不匹配 规则为: ['长腿', '长脖子', '黄褐色', '有蹄动物'] --> 长颈鹿  , 前提: ['长腿', '长脖子', '有蹄动物'] 综合数据库中没有

规则 11 不匹配 规则为: ['黑白色', '有蹄动物'] --> 斑马  , 前提: ['黑白色', '有蹄动物'] 综合数据库中没有

规则 12 不匹配 规则为: ['不会飞', '长腿', '长脖子', ''] --> 鸵鸟  , 前提: ['不会飞', '长腿', '长脖子'] 综合数据库中没有

规则 13 不匹配 规则为: ['不会飞', '会游泳', '黑白色', ''] --> 企鹅  , 前提: ['不会飞', '会游泳', '黑白色'] 综合数据库中没有

 

规则 14 匹配成功 规则为: ['善飞', '不怕风浪', ''] --> 海鸥 前提: ['善飞', '不怕风浪', ''] 结论: 海鸥

与目标库匹配成功;

结论是 海鸥


1 条评论

лаки джет официальный сайт · 2023年6月13日 下午8:52

Thank you very much for the information

回复 лаки джет официальный сайт 取消回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注