写在前面:其实这个实验一开始我连python怎样去操作表格都不知道,只是有一点点的python基础,你这一下让我做一个产生式系统那这不是为难我嘛。经过查网上的代码,我发现,网上所有代码都没有做到程序与数据进行分离,而这是老师要求最严的一点。不过也是,要算直接写死在代码里直接几个if就好了,多简单,难就难在这里了,推理原理其实很简单。
在写代码之前首先要先建立三个表格来存放数据,
二、实验目的及要求:
(1)掌握产生式系统原理。
(2)设计产生式系统结构。
(3)使用Python实现产生式系统。
(4)本实验支撑教学目标2
三、实验设备(环境)及要求
使用Python语言环境;windows系列操作系统环境。
五、实验题目
依据表1、2、3数据,设计产生式系统的数据模型。
表 1 产生式规则
规则码 |
规则 |
R1 |
如果动物有奶,则它是哺乳动物 |
R2 |
如果动物有毛发,则它是哺乳动物 |
R3 |
如果动物有羽毛,则它是鸟 |
R4 |
如果动物会飞且生蛋,则它是鸟 |
R5 |
吃肉的哺乳动物是食肉动物 |
R6 |
有爪的犬齿目盯前方的哺乳动物是食肉动物 |
R7 |
有蹄的哺乳动物是有蹄动物 |
R8 |
反刍食物的有蹄动物是偶蹄动物 |
R9 |
黄褐色有黑色条文的食肉动物是老虎 |
R10 |
黄褐色有黑色斑点的食肉动物是金钱豹 |
R11 |
长腿长脖子有黄褐色半点的有蹄动物是长颈鹿 |
R12 |
有黑色白条的有蹄动物是斑马 |
R13 |
不会飞长腿长脖子的鸟是鸵鸟 |
R14 |
不会飞会游泳黑白色的鸟是企鹅 |
R15 |
善飞不怕风浪的鸟是海鸥 |
表2 动物特征集合:
有奶,有毛发,有羽毛,会飞,生蛋,有爪,有犬齿,目盯前方,吃肉,有蹄,反刍食物,黄褐色,黑色条纹,黑色斑点,长腿,长脖子,暗斑点,白色,不会飞,黑白色,会游泳,善飞,不怕风浪,哺乳动物,食肉动物,有蹄动物,偶蹄动物 |
表3 动物名称集合:
海燕,老虎,金钱豹,长颈鹿,斑马,鸵鸟,企鹅,海鸥 |
(1)综合数据库
综合数据库(事实数据库):是一个用来存放与求解问题有关的各种当前信息的数据库。如,问题的初始状态、输入的事实、推理得到的中间结论以及最终结论等
(2)规则库
是一个用来存放与求解问题有关的所有规则的集合,也称规则知识库。包含了将问题从初始状态转换成目标状态所需的所有变换规则。
(3)控制系统(推理机)
由一组程序构成,用来控制整个产生式系统的运行,决定问题求解过程的推理路线、实现对问题的求解。主要包括,初始化综合数据库、选择可用规则、执行选定的规则、决定推理路线、终止推理过程等。
1.3 叙述产生式系统工作原理
(1)从规则库中选择与综合数据库中的已知事实进行匹配。
(2)匹配成功的规则可能不止一条,进行冲突消解。
(3)执行某一规则时,如果其右部是一个或多个结论,则把这些结论加入到综合数据库中:如果其右部是一个或多个操作,则执行这些操作。
(4)对于不确定性知识,在执行每一条规则时还要按一定的算法计算结论的不确定性。
(5)检查综合数据库中是否包含了最终结论,决定是否停止系统的运行。
2.运用Python、Pandas和面向对象技术设计产生式系统推理模型,开发产生式系统。
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