構建動物識別系統系統分為兩部分,第一部分是初始化綜合數據庫,分為兩類,一類是間接數據庫,即不指向最終動物的信息。另一類是直接數據庫,即指向最終動物的信息。使用的是二維列表加上一個一維列表存儲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小小白的我一個交代了吧。。 |
|