簡介
一個房間里,天花板上掛有一串香蕉,有一只猴子可在房間里任意活動(到處走動,推移箱子,攀登箱子等),設房間里還有一只可被猴子移動的箱子,且猴子登上箱子時才能摘到香蕉,問猴子在某一狀態下(設猴子位置為A,香蕉位置在B,箱子位置為C),如何行動可摘取到香蕉?
猴子摘香蕉問題PEAS
| 性能 | 環境 | 執行器 | 感受器 |
|---|---|---|---|
| 猴子站在箱子上摘得香蕉 | 香蕉、箱子位置 | (四肢)Move,Climb,Push,Grasp | (眼睛) Site,Hold,On,Hang |
基本的定義
定義狀態謂詞
- \(SITE(x , y)\): \(x\) 在 \(y\) 處
- \(HANG)(w,y)\): \(w\) 懸掛在 \(y\)處
- \(ON(z)\): \(z\) 站在箱子上
- \(HOLDS(z)\): \(z\) 手里拿著香蕉
變元的個體域
-
\(x\) 的個體域是\(\{Monkey, Box\}\)
-
\(y\)的個體域是\(\{a,b,c\}\) (地點為 a,b,c)
-
\(z\)的個體域是\(\{Monkey\}\)
-
\(w\)的個體域是\(\{Banana\}\)
初始狀態
\[S_0 = SITE(Monkey, a) \wedge HANG(Banana, b) \wedge SITE(Box, c) \wedge \neg ON(Monkey) \wedge \neg HOLDS(Monkey) \]猴子在A處,香蕉懸掛在B處,箱子放在C處,
目標狀態
\[S_g = SITE(Monkey,b) \wedge \neg HANG(Banana,b) \wedge SITE(Box,b) \wedge ON(Monkey) \wedge HOLDS(Monkey) \]猴子拿到香蕉,站在箱子上,箱子位于B處,
定義四個操作
\[Goto(u,v): 猴子從u走到v處,\\ Pushbox(v,w): 猴子推著箱子從v走到w處,\\ Climbbox: 猴子爬上箱子\\ Grasp: 猴子摘到香蕉 \]各操作的條件和動作
- \(Goto(u,v)\)
- \(條件:\neg ON(Monkey), SITE(Monkey,u)\)
- 動作:
- $洗掉表:SITE(Monkey,u) $
- \(添加表:SITE(Monkey,v)\)
- \(Pushbox(v,w)\)
- \(條件:\neg ON(Monkey), SITE(Monkey,v), SITE(Box,v)\)
- 動作:
- \(洗掉表:SITE(Monkey,v),SITE(Box,v)\)
- \(添加表:SITE(Monkey, w), SITE(Box, w)\)
- \(Climbbox\)
- \(條件:\neg ON(Monkey), SITE(Monkey,w),SITE(Box, w)\)
- 動作:
- \(洗掉表:\neg ON(Monkey)\)
- \(添加表:ON(Monkey)\)
- \(Grasp\)
- \(條件:ON(Monkey), SITE(Box, b), HANG(Banana,b)\)
- 動作:
- $洗掉表:\neg HOLDS(Monkey),HANG(Banana,b) $
- \(添加表:HOLDS(Monkey), \neg HANG(Banana,b)\)
求解
-
綜合資料庫:(M, B, Box, On, H)
- M: 猴子的位置
- B:香蕉的位置
- Box:箱子的位置
- \(On = 0\):猴子在地板上
- \(On = 1\):猴子在箱子上
- \(H = 0\):猴子沒有抓到香蕉
- \(H=1\):猴子抓到了香蕉
-
初始狀態:(a, b, c, 0, 0)
-
結束狀態:(b, b, b, 1, 1)
-
規則集:
- \(r_1: IF (x,y,z,0,0) \; THEN (w,y,z,0,0)\) 猴子到處亂走
- $r_2: IF(z,y,z,0,0) ; THEN(z',y,z',0,0) $ 猴子推箱子走
- \(r_3: IF(x,y,x,0,0) \; THEN(x,y,x,1,0)\) 猴子爬上箱子
- \(r_4: IF(x,y,x,1,0) \; THEN(x,y,x,0,0)\) 猴子爬下箱子
- \(r_5: IF(x,x,x,1,0) \; THEN(x,x,x,1,1)\) 猴子摘香蕉
- 其中,\(x,y,z,w\)為變數,
-
具體程序:
根據具體問題可將規則具體為:
- \(r_1: IF(a,b,c,0,0) \; THEN(c,b,c,0,0)\) 猴子走到箱子處
- \(r_2: IF(c,b,c,0,0) \; THEN(b,b,b,0,0)\) 猴子將箱子推到香蕉處
- \(r_3: IF(b,b,b,0,0) \; THEN(b,b,b,1,0)\) 猴子爬上箱子
- \(r_5: IF(b,b,b,1,0) \; THEN(b,b,b,1,1)\) 猴子摘到香蕉
在已知事實下,\(r_1 \rightarrow r_2 \rightarrow r_3 \rightarrow r_5\),即可得到香蕉,
代碼
# 猴子走向箱子
def Goto(Monkey, Box):
global i # 步數
i += 1
print("step " + str(i) + ": " + "Monkey從" + Monkey + "走向" + Box)
# 猴子推箱子到香蕉處
def Pushbox(Box, Banana):
global i
i += 1
print("step " + str(i) + ": " + "Monkey將Box從" + Box + "推向" + Banana)
# 猴子爬上箱子
def Climbbox():
global i
i += 1
print("step " + str(i) + ": " + "Monkey爬上Box")
# 猴子摘取香蕉
def Grasp():
global i
i += 1
print("step " + str(i) + ": " + "Monkey摘到Banana")
# 猴子爬下箱子
def Dropbox():
global i
i += 1
print("step " + str(i) + ": " + "Monkey爬下box")
# 檢查輸入
def Check(Monkey, Banana, Box, On, H):
if Monkey != Box and On == "1":
print("不合法的輸入!")
return False
if H == "1":
print("Monkey已摘到banana")
return False
return True
if __name__ == "__main__":
i = 0
print("請輸入Monkey位置,Banana的位置,Box的位置,猴子是否在箱子上(1:在,0:不在)上以及猴子是否摘取香蕉(1:是,0:否):")
Monkey, Banana, Box, On, H = input().split(",")
Flag = Check(Monkey, Banana, Box, On, H)
while Flag:
# r1規則:箱子和猴子不在一起才能走向箱子
if Monkey != Box:
Goto(Monkey, Box)
Monkey = Box
continue
# r2規則:猴子跟箱子在一起,且不跟香蕉在一起,以及猴子不在箱子上,才能推箱子到香蕉處
if Box != Banana and Monkey == Box and On == "0":
Pushbox(Box, Banana)
Monkey = Box = Banana
continue
# r3規則:猴子不在箱子上,并且猴子跟箱子在一起才能爬
if On == "0" and Monkey == Box:
Climbbox()
On = "1"
continue
# r5規則:猴子在箱子上,并且處在香蕉位置,且猴子沒有摘取香蕉,才能摘取香蕉
if On == "1" and Box == Banana and H == "0":
Grasp()
H = "1"
continue
# r4規則:猴子在箱子上,但不在香蕉的位置,爬下箱子
if On == "1" and Box != Banana:
Dropbox()
On = "0"
continue
# 猴子取到香蕉,則結束回圈
if H == "1":
break
本文來自博客園,作者:江水為竭,轉載請注明原文鏈接:https://www.cnblogs.com/Az1r/p/17422374.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553170.html
標籤:其他
上一篇:天涯神帖合集,建議收藏!
下一篇:返回列表
