构建动物识别系统系统分为两部分,第一部分是初始化综合数据库,分为两类,一类是间接数据库,即不指向最终动物的信息。另一类是直接数据库,即指向最终动物的信息。使用的是二维列表加上一个一维列表存储key与value。第二部分为添加数据库和识别动物,查询的时候添加,可以有效的扩增数据库,使功能更灵活与完善。在识别动物的时候,先在间接数据库中完善信息,在直接数据库中查找对应的动物,记录信息时,使用字典记录某个特征是否出现,这样查询的复杂度就为O(1)。(这一段为老师所给提示) 思路:1、我选择构建直接、间接数据库的方式为将条件存入列表中,列表中的元素都有对应的下标,将下标作为字典的值、结果作为字典的键构成数据库,这样条件和结果就能构成呢个一一对应的关系。因此程序中的数据库是包括列表、字典两部分的。 eg: 间接库列表:奶 哺乳动物+蹄 羽毛 间接库字典:哺乳动物->0 蹄类动物->1 鸟->2 2、识别动物的时候,先在间接库中进行推理,再在直接库中推理。 Indirdict=dict()#间接库字典,用于从数字寻找对应结果 Dirdict=dict()#直接库字典,用于从数字寻找对应结果 Indirlist=[]#间接库列表,用于存放动物特征的集合和定义、存放这个集合对应数字 Dirlist=[]#直接库列表,用于存放动物特征的集合和定义、存放这个集合对应数字 Indirnum=0#作为间接库字典的值 Dirnum=0#作为直接库字典的值 def change(str):#以字符串的形式输入全部特征值,这个函数可以将字符串中的特征值识 #别出来,并且将所有特征值存放到一个集合中 set1=set()#定义一个集合,存放特征值 str1="" for i in range(0,len(str)): if(str[i]!=" "): str1+=str[i] else: set1.add(str1) str1="" i+=1 return set1 list1=[]#定义一个临时列表,表示间接库或直接库 dict1=dict()#定义一个临时字典,表示间接库字典或直接库字典 num1=0 def Builddata(list1,dict1,num1):#num1存放在字典中,与结果相对应 str2=input("请输入条件,以空格隔开:")#定义一个字符串,存放用户输入特征值 str2+=" " while(str2!="0 "): str3=input("请输入结果:")#字符串,存放结果 dict1[num1]=str3#将值与结果在字典中相对应 set2=change(str2)#集合,将用户输入特征值放入此集合内 list1.append(set2)#将特征值集合存入列表 str2=input("请输入条件,以空格隔开:") str2+=" " num1+=1 return num1 def Infer(animalset,list1,dict1):#推理函数,将动物条件的集合放在间接库或直接库中进行匹配 for i in range(0,len(animalset)):#保证循环足够多的次数 for j in range(0,(len(list1))): if(list1[j].issubset(animalset) or list1[j]==animalset): animalset.add(dict1[j]) #print(list1[j]) animalset=animalset-list1[j] return animalset def Rec():#识别动物 feature=input("请输入动物的特征(不同特征之间用空格隔开):") feature+=" " animalset=change(feature) #将动物的特征化为关键词的集合 animalset=Infer(animalset,Indirlist,Indirdict) set3=Infer(animalset,Dirlist,Dirdict)#返回经过直接规则库过滤后的集合 list2=list(set3)#将动物特征集合化为列表,便于确定最后剩下多少特征值 if(len(list2)==1): print("这个动物是:"+list2[0]) else: print("查无此动物") print("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):") chose = input() while (chose!='0'): if (chose=='1'): print("构造间接数据库:(输入条件时输入0结束构建)") Indirnum=Builddata(Indirlist,Indirdict,Indirnum) print("间接数据库构造完成!") print("") chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):") elif (chose=='2'): print("构造直接数据库:(输入条件时输入0结束构建)") Dirnum=Builddata(Dirlist,Dirdict,Dirnum) print("直接数据库构造完成!") print("") chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):") elif (chose=='3'): Rec() print("") chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):") else: print("输入不合法,请重新输入") chose = input("请输入接下来操作(1.添加间接数据库 2.添加直接数据库 3.查询动物 0.结束操作):") 注:输入条件、结果时,构建间接规则库、构建直接规则库、查询动物时输入形式、相同的内容必须保持一致。 此文是借鉴大佬博客https://blog.csdn.net/weixin_46178977/article/details/105842471,是对大佬代码的拙劣优化。。 能够搞懂并改写这样的一个不很简单的程序,也算是对大一身为python小小白的我一个交代了吧。。 |
|