动物识别专家系统实验
这个人工智能导论实验可算是折磨了我许久,关键是我一直想不明白该如何推理。
在某天的晚上,我去对象那里上晚自习,突然灵感大开。由于电脑没有电了,我就手绘了一个系统结构图,并且想到了解决问题的方案。
当晚回宿舍我就立马打开电脑,写完了一半。第二天清早又逐渐完善了一些bug.
后来。。。老师说让我们把动物特征信息保存到数据库中,但是我们那时候还没学数据库,于是我把动物信息保存到了文件中。
如果你认为老师的折磨到现在就结束的话,那你就太天真了。没过多久。老师又提出了图形界面的要求,我那个时候真的。。。写不出来这个玩意,现在想想,大不了就设计一个比较好看web应用,对接数据库进行增删改查。但是那时还是年轻,我就按照这个不加图形界面的交上去了,最后成绩还是过九十了,结果很满意。
展示代码之前,需要先写运行代码所需要的推理文件。
f1.csv的内容如下:
有毛
有奶
有羽毛
会飞
会生蛋
吃肉
犬牙利爪
眼睛向前
反刍食物
有蹄
黄褐色
有暗斑点
黑条纹
长腿长脖子
黄褐色暗斑
有黑白条纹
不会飞
善游泳
黑白色
f2.csv的内容如下:
哺乳类
鸟类
肉食类
有蹄类
蜘蛛毒
长毛象
阿拉斯加犬
f3.csv的内容如下:
肉食动物
偶蹄类
有蹄类
金钱豹
老虎
长颈鹿
斑马
鸵鸟
企鹅
信天翁
higher1.csv的内容如下:
吃肉 哺乳类 肉食动物
犬牙利爪 眼睛向前 肉食动物
反刍食物 哺乳类 偶蹄类
黄褐色 有暗斑点 肉食类 金钱豹
黄褐色有黑条纹 肉食类 老虎
长腿长脖子 黄褐色暗斑 有蹄类 长颈鹿
有黑白条纹 有蹄类 斑马
不会飞 长腿长脖子 鸟类 鸵鸟
不会飞 善游泳 黑白色 鸟类 企鹅
善飞 鸟类 信天翁
middle1.csv的内容如下:
有毛 哺乳类
有奶 哺乳类
有羽毛 鸟类
会飞 会生蛋
有蹄 哺乳类
红色 有毒 毒蜘蛛
体型巨大 长长牙 长毛象
灰白色 有毛 阿拉斯加犬
RDsort.txt的内容如下:
有毛发 哺乳动物
有奶 哺乳动物
有羽毛 鸟
会飞 下蛋 鸟
吃肉 食肉动物
有犬齿 有爪 眼盯前方 食肉动物
哺乳动物 有蹄 有蹄类动物
哺乳动物 嚼反刍动物 有蹄类动物
哺乳动物 食肉动物 黄褐色 暗斑点 金钱豹
哺乳动物 食肉动物 黄褐色 黑色条纹 虎
有蹄类动物 长脖子 长腿 暗斑点 长颈鹿
有蹄类动物 黑色条纹 斑马
鸟 善飞 信天翁
鸟 会游泳 不飞 黑白二色 企鹅
鸟 长脖子 长腿 黑白二色 不飞 鸵鸟
想要运行程序,需要将上述文件和代码放在同一文件目录下。
下面展示一下我的代码:
'''
动物识别系统
时间 2019/12
开发者:时彦钊
'''
#检测f是否在t中的条件方法
def isinf(f,t):i=0for thing in f:if thing in t:i+=1else:return Falseif i==len(f):return True
#删除list的element元素
def listpop(list,element):list2=[]for i in list:if i!=element:list2.append(i)return list2
#系统开始执行
print("欢迎进入动物识别系统 ")
print("功能包括:1动物识别、2增加特征、3更改特征、4特征查询")
fun=eval(input("请选择功能:"))
while(True):#首先,从文件中读取信息f1 f2 f2 middle higherf11 = open("f1.csv")f1= []for i in f11:i = i.replace("\n", "")f1.append(i)f11.close()f22 = open("f2.csv")f2 = []for i in f22:i = i.replace("\n", "")f2.append(i)f22.close()f33 = open("f3.csv")f3 = []for i in f33:i = i.replace("\n", "")f3.append(i)f33.close()# 推理列表middle1 = open("middle1.csv")middle = []for i in middle1:m = ""middle0 = []for j in i:if (j == ","):if m!="":middle0.append(m)m = ""if (j == "\n"):breakif (j != ',' and j != "\n"):m += jmiddle.append(middle0)middle1.close()higher1 = open("higher1.csv")higher = []for i in higher1:m = ""higher0 = []for j in i:if (j == ","):if (m != ''):higher0.append(m)m = ""if (j == "\n"):breakif (j != ',' and j != "\n"):m += jhigher.append(higher0)higher1.close()#读取成功if(fun==1):character=[]#输入特征信息while(True):inputs=input("输入特征信息:")if inputs == "0":breakcharacter.append(inputs)#输入完成#推理机for lists in middle:t=sorted(lists[:-1])if isinf(t,character):print(t,end="")print("推导出{}".format(lists[-1]))for delet in t:character=listpop(character,delet)character.append(lists[-1])for lists in higher:t = sorted(lists[:-1])if t==sorted(character):print(t, end="")print("推导出{}".format(lists[-1]))for delet in t:character=listpop(character,t)character.append(lists[-1])#推理完成elif(fun==2):addcharacter = []#输入需要添加的信息while (True):inputs3 = input("输入需要添加的特征信息:")if inputs3 == "0":breakaddcharacter.append(inputs3)print("输入完成")a=addcharacter[-1]#如果新加的规则是在中级推理中的if a in f2:middle.append(addcharacter)renewmid = open("1.csv", "w")m = ""for i in middle:for h in range(len(i)):if (i[h] == i[-1]):m += i[h]m += "\n"else:m += i[h]m += ","renewmid.write(m)renewmid.close()print("添加完成")#如果新加的规则是在高级推理中的elif a in f3:higher.append(addcharacter)renewhig = open("higher1.csv", "w")m = ""for i in higher:for h in range(len(i)):if (i[h] == i[-1]):m += i[h]m += "\n"else:m += i[h]m += ","renewhig.write(m)renewhig.close()print("添加完成")#新加的是面向新事物的规则else:f2.append(addcharacter[-1])#在f2中增加新名称renewf0=open("f2.csv","a")renewf0.write("\n"+addcharacter[-1])renewf0.close()#在中级推理中加入新规则middle.append(addcharacter)renewmid = open("middle1.csv", "w")m = ""for i in middle:for h in range(len(i)):if (i[h] == i[-1]):m += i[h]m += ",\n"else:m += i[h]m += ","renewmid.write(m)renewmid.close()print("添加完成1")#改变化规则elif(fun==3):print(middle)k=1#输入待改规则进行匹配addcharacter = []while (True):inputs3 = input("输入需要改造的特征信息:")if inputs3 == "0":breakaddcharacter.append(inputs3)if addcharacter[-1] in f2:for i in range(len(middle)):if addcharacter==middle[i]:print("找到对应公式")#匹配成功changecharacter = []while (True):inputs4 = input("输入改造后的特征信息:")if inputs4 == "0":breakchangecharacter.append(inputs4)#在文件中加入改造后的规则middle[i]=changecharacterrenewmid = open("middle1.csv", "w")m = ""for i in middle:for h in range(len(i)):if (i[h] == i[-1]):m += i[h]m += ",\n"else:m += i[h]m += ","renewmid.write(m)renewmid.close()else:k=0elif addcharacter[-1] in f3:for i in range(len(higher)):if addcharacter == higher[i]:print("找到对应公式")k=1changecharacter = []while (True):inputs5 = input("输入改造后的特征信息:")if inputs5 == "0":breakchangecharacter.append(inputs5)higher[i] = changecharacterrenewhig = open("higher1.csv", "w")m = ""for i in higher:for h in range(len(i)):if (i[h] == i[-1]):m += i[h]m += ",\n"else:m += i[h]m += ","renewhig.write(m)renewhig.close()# 用户提示elif (fun == 4):print("*****************************")print("动物的信息如下:")for i in middle:for l in range(len(i)):if (i[l] != i[-1] and i[l] != i[-2]):print(i[l], end=",")elif i[l] == i[-2]:print(i[l], end=" 推理出 ")elif i[l] == i[-1]:print(i[l], end="\n")for i in higher:for l in range(len(i)):if (i[l] != i[-1] and i[l] != i[-2]):print(i[l], end=",")elif i[l] == i[-2]:print(i[l], end=" 推理出 ")elif i[l] == i[-1]:print(i[l], end="\n")print("**********************************************")elif(fun==0):break;print("功能包括:1动物识别、2增加特征、3更改特征、4特征查询")fun = eval(input("请选择功能:"))