文章目錄
- 一. 實驗目的
- 二. 實驗內容
- (一)猴子摘香蕉問題
- (二)動物識別分類系統
- 三. 實驗結果
- (一)猴子摘香蕉問題
- (二)動物識別分類系統
一. 實驗目的
- 熟悉謂詞邏輯表示法,
- 理解和掌握產生式知識表示方法,實作產生式系統的規則庫,
二. 實驗內容
(一)猴子摘香蕉問題
問題描述:
房子里有一只猴子,位于a處,在c處上方的天花板上有一串香蕉,猴子想吃,但摘不到,房間的b處還有一個箱子,如果猴子站到箱子上,就可以摸著天花板,如下圖所示,對于上述問題,可以通過謂詞邏輯表示法來描述知識,實作猴子摘香蕉問題的求解程序,

解題思路:
根據題意設定謂詞邏輯如下:
Monkey_GoTo_Box(x,y):猴子從x處走到y處
Monkey_Move_Box(x,y):猴子將箱子從x處運到y處
由于猴子摘到香蕉的最后兩步必然是猴子爬上箱子和猴子摘到香蕉,故最后兩步無需考慮其他情況,而對于爬上箱子之前的動作,則由初始的猴子香蕉箱子三者的相對位置決定,這里設定兩潭訓本規則:
規則一:若猴子與箱子不在同一位置則猴子需走到箱子處,
規則二:若箱子與香蕉不在同一位置則將箱子運到香蕉處,
Python源代碼:
# 猴子摘香蕉問題
i = 0 # 用于記錄步驟數,為全域變數
def Monkey_GoTo_Box(x, y): # 猴子從x處走到y處
global i
i = i+1
print('步驟', i, ':猴子從', x, '走到' + y)
def Monkey_Move_Box(x, y): # 猴子將箱子從x處運到y處
global i
i = i + 1
print('步驟', i, ':猴子把箱子從', x, '運到' + y)
def Monkey_On_Box(): # 猴子爬上箱子
global i
i = i + 1
print('步驟', i, ':猴子爬上箱子')
def Monkey_Get_Banana(): # 猴子摘到香蕉
global i
i = i + 1
print('步驟', i, ':猴子摘到香蕉')
# 求解開始
print("請分別輸入猴子、箱子、香蕉的位置:")
monkey, box, banana = input().split()
if monkey != box: # 若猴子與箱子不在同一位置則猴子需走到箱子處
Monkey_GoTo_Box(monkey, box)
if box != banana: # 若箱子與香蕉不在同一位置則將箱子運到香蕉處
Monkey_Move_Box(box, banana)
Monkey_On_Box()
Monkey_Get_Banana()
(二)動物識別分類系統
問題描述:
建立一個動物識別系統的規則庫,用以識別虎、豹、斑馬、長頸鹿、企鵝、鴕鳥、信天翁等7種動物,為了識別這些動物,可以根據動物識別的特征,建立包含下述規則庫:
R1:if 動物有毛發 then 動物是哺乳動物
R2:if 動物有奶 then 動物是哺乳動物
R3:if 動物有羽毛 then 動物是鳥
R4:if 動物會飛 and 會生蛋 then 動物是鳥
R5:if 動物吃肉 then 動物是食肉動物
R6:if 動物有犀利牙齒 and 有爪 and 眼向前方 then 動物是食肉動物
R7:if 動物是哺乳動物and有蹄then動物是有蹄類動物
R8:if 動物是哺乳動物and反芻then動物是有蹄類動物
R9:if 動物是哺乳動物and是食肉動物and有黃褐色 and 有暗斑點 then 動物是豹
R10:if 動物是哺乳動物 and是食肉動物and有黃褐色 and有黑色條紋 then 動物是虎
R11:if動物是有蹄類動物 and 有長脖子and有長腿and有暗斑點 then 動物是長頸鹿
R12:if 動物是有蹄類動物 and有黑色條紋 then 動物是斑馬
R13:if 動物是鳥and不會飛 and有長脖子and有長腿 and有黑白二色 then 動物是鴕鳥
R14:if 動物是鳥 and不會飛 and會游泳 and有黑白二色 then 動物是企鵝
R15:if 動物是鳥 and善飛 then 動物是信天翁
解題思路:
設定Features陣列,用于表示動物的各種特征,所有特征按照順序依次編號為,特征編號按順序分別為1-20,動物型別為21-24,動物名稱為25-31,
根據題中給出的動物識別規則建立各個規則的特征陣列rule,
確定動物的具體種類的先行作業是識別動物的類別,本題中動物的類別有哺乳動物、鳥類、食肉動物、蹄類動物四大類,
在知曉動物類別的基礎上再根據具體細化特征即可判斷得出動物的具體種類,
Python源代碼:
# 動物種類識別
import sys
print("【動物分類AI系統v1.0】")
# 動物特征庫,特征編號按順序分別為1~24,動物名稱為25~31
Features = ["", "有奶", "有毛發", "有羽毛", "會飛", "會下蛋", "吃肉", "有鋒利牙齒", "有爪", "眼向前方", "有蹄",
"反芻", "黃褐色", "暗斑點", "黑色條紋", "長脖子", "長腿", "不會飛", "會游泳", "有黑白二色", "善飛",
"哺乳動物", "鳥", "食肉動物", "蹄類動物", "豹", "虎", "長頸鹿", "斑馬", "鴕鳥", "企鵝", "信天翁"]
i = 1 # 僅顯示動物特征編號
while i < 21:
print('%d' % i + '.' + Features[i] + ' ', end='')
i = i + 1
if i % 10 == 1:
print()
# 用戶輸入
answer = input("\n請選擇動物擁有的特征編號(用空格分隔):")
try:
answer = list(answer.split(' '))
new_answer = [int(x) for x in answer]
except Exception:
print("輸入錯誤,請重新運行輸入!")
sys.exit()
# 規則庫
rule1 = [2] # if 動物有毛發 then 動物是哺乳動物
rule2 = [1] # if 動物有奶 then 動物是哺乳動物
rule3 = [3] # if 動物有羽毛 then 動物是鳥
rule4 = [4, 5] # if 動物會飛 and 會生蛋 then 動物是鳥
rule5 = [6] # if 動物吃肉 then 動物是食肉動物
rule6 = [7, 8, 9] # if 動物有犀利牙齒 and 有爪 and 眼向前方 then 動物是食肉動物
rule7 = [21, 10] # if 動物是哺乳動物 and 有蹄 then 動物是有蹄類動物
rule8 = [21, 11] # if 動物是哺乳動物 and 反芻 then 動物是有蹄類動物
rule9 = [21, 23, 12, 13] # if 動物是哺乳動物 and 是食肉動物 and 有黃褐色 and 有暗斑點 then 動物是豹
rule10 = [21, 23, 12, 14] # if 動物是哺乳動物 and 是食肉動物 and 有黃褐色 and 有黑色條紋 then 動物是虎
rule11 = [24, 15, 16, 13] # if 動物是有蹄類動物 and 有長脖子 and 有長腿 and 有暗斑點 then 動物是長頸鹿
rule12 = [24, 14] # if 動物是有蹄類動物 and有黑色條紋 then 動物是斑馬
rule13 = [22, 17, 16, 15, 19] # if 動物是鳥 and 不會飛 and 有長脖子 and 有長腿 and 有黑白二色 then 動物是鴕鳥
rule14 = [22, 17, 18, 19] # if 動物是鳥 and 不會飛 and 會游泳 and 有黑白二色 then 動物是企鵝
rule15 = [22, 4] # if 動物是鳥 and 善飛 then 動物是信天翁
# 開始邏輯推理,確定動物種類
if set(rule1) < set(new_answer): # if 動物有毛發 then 動物是哺乳動物
print("有毛發的動物是哺乳動物")
new_answer.append(21)
if set(rule2) < set(new_answer): # if 動物有奶 then 動物是哺乳動物
print("有奶的動物是哺乳動物")
new_answer.append(21)
if set(rule3) < set(new_answer):
print("有羽毛的動物是鳥類")
new_answer.append(22)
if set(rule4) < set(new_answer):
print("會飛且會下蛋的動物是鳥類")
new_answer.append(22)
if set(rule5) < set(new_answer):
print("吃肉的動物是食肉動物")
new_answer.append(23)
if set(rule6) < set(new_answer):
print("有爪、有鋒利牙齒且眼向前方的動物是食肉動物")
new_answer.append(23)
if set(rule7) < set(new_answer):
print("有蹄的哺乳動物是蹄類動物")
new_answer.append(24)
if set(rule8) < set(new_answer):
print("反芻的哺乳動物是蹄類動物")
new_answer.append(24)
# 得出最終結論
if set(rule9) < set(new_answer):
print("有黃褐色、有暗斑點的食肉哺乳動物是豹")
print("\n識別出來的動物是:" + Features[25])
elif set(rule10) < set(new_answer):
print("有黃褐色、有黑色條紋的食肉哺乳動物是虎")
print("\n識別出來的動物是:" + Features[26])
elif set(rule11) < set(new_answer):
print("有長脖子、有長腿、有暗斑點的蹄類動物是長頸鹿")
print("\n識別出來的動物是:" + Features[27])
elif set(rule12) < set(new_answer):
print("有黑色條紋的蹄類動物是斑馬")
print("\n識別出來的動物是:" + Features[28])
elif set(rule13) < set(new_answer):
print("有長脖子、有長腿、有黑白二色的不會飛的鳥類是鴕鳥")
print("\n識別出來的動物是:" + Features[29])
elif set(rule14) < set(new_answer):
print("有黑白二色的不會飛的會游泳的鳥類是企鵝")
print("\n識別出來的動物是:" + Features[30])
elif set(rule15) < set(new_answer):
print("善飛的鳥類是信天翁")
print("\n識別出來的動物是:" + Features[31])
else:
print('\n對不起!識別失敗!')
三. 實驗結果
(一)猴子摘香蕉問題
輸入猴子、香蕉、箱子的初始位置分別為a、b、c,運行結果如下所示:

上述結果是猴子、香蕉、箱子三者初始位置不同的輸出情況,而對于三者中有兩者位置相同以及三者位置均相同的情況,運行結果如下所示:


(二)動物識別分類系統
識別虎:

識別豹:

識別斑馬:

識別長頸鹿:

識別企鵝:

識別鴕鳥:

識別信天翁:

識別失敗:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352094.html
標籤:AI
