人工智慧 傳教士和食人者問題 python

2021-10-05 20:42:44 字數 3156 閱讀 5540

【傳教士和食人者問題】

在河的左岸有3個傳教士、1條船和3個食人者,傳教士們想用這條船將所有的成員運到河的右岸,但是受到以下條件的限制:

(1)船每次最多只能裝2個乘客(傳教士和食人者都會划船);

(2)在任何岸邊,如果食人者數目超過傳教士則傳教士將被食人者吃掉。

(3)假定食人者會服從任何一種過河安排。

只輸出乙個解,但是輸出乙個解後會繼續執行,如果想要得到全部解,需要稍加修改輸出部分,本**使用迭代法,深度優先策略。

m,n,k=3,

3,2list1=[(

3,3,

1)]def

lefttoright

(lm,lc,lb)

:for i in

range(0

,lm+1)

:for j in

range(0

,lc+1)

:if i+j<=k and

(lm-i>=lc-j or lm-i==0)

and(m-lm+i>=n-lc+j or m-lm+i==0)

and(lm-i,lc-j,0)

notin list1 and i+j>

0and

(i==

0or i>

0and j<=i)

:#判斷是否滿足過河條件

print

("有"

, i,

"個人"

, j,

"個野人從左岸到右岸"

)(lm-i,lc-j,0)

)print

("左岸狀態:"

,list1[

len(list1)-1

])righttoleft(m-lm+i,n-lc+j,0)

if i==lm+

1and(0

,0,0

)not

in list1:

print

("無解決方案"

)def

righttoleft

(rm,rc,lb)

:if rm==m and rc==n:

print

(list1)

else

:for i in

range(0

,rm+1)

:for j in

range(0

,rc+1)

:if i+j<= k and

(rm-i>=rc-j or rm-i==0)

and(m-rm + i>=n-rc+j or m-rm+i==0)

and(m-rm+i,m-rc+j,1)

notin list1 and i+j>

0and

(i==

0or i>

0and j<=i)

:print

("有"

,i,"個人"

,j,"個野人從右岸到左岸"

)(m-rm + i, m-rc+j,1)

)print

("左岸狀態:"

, list1[

len(list1)-1

])lefttoright(m-rm+i,n-rc+j,1)

print

("從列表中刪除狀態:"

,list1[

len(list1)-1

],,list1[

len(list1)-2

])list1.pop(

)#刪除沒有接下來沒有解決方案的上一條方案

defmain()

: lefttoright(m,n,1)

if __name__==

"__main__"

: main(

)

結果

*有 0 個人 1 個野人從左岸到右岸

左岸狀態: (3, 2, 0)

從列表中刪除狀態: (3, 2, 0) 恢復到上乙個狀態: (3, 3, 1)

有 0 個人 2 個野人從左岸到右岸

左岸狀態: (3, 1, 0)

有 0 個人 1 個野人從右岸到左岸

左岸狀態: (3, 2, 1)

有 0 個人 2 個野人從左岸到右岸

左岸狀態: (3, 0, 0)

有 0 個人 1 個野人從右岸到左岸

左岸狀態: (3, 1, 1)

有 2 個人 0 個野人從左岸到右岸

左岸狀態: (1, 1, 0)

有 1 個人 1 個野人從右岸到左岸

左岸狀態: (2, 2, 1)

有 2 個人 0 個野人從左岸到右岸

左岸狀態: (0, 2, 0)

有 0 個人 1 個野人從右岸到左岸

左岸狀態: (0, 3, 1)

有 0 個人 2 個野人從左岸到右岸

左岸狀態: (0, 1, 0)

有 0 個人 1 個野人從右岸到左岸

左岸狀態: (0, 2, 1)

有 0 個人 2 個野人從左岸到右岸

左岸狀態: (0, 0, 0)

[(3, 3, 1), (3, 1, 0), (3, 2, 1), (3, 0, 0), (3, 1, 1), (1, 1, 0), (2, 2, 1), (0, 2, 0), (0, 3, 1), (0, 1, 0), (0, 2, 1), (0, 0, 0)]

有 1 個人 0 個野人從右岸到左岸

左岸狀態: (1, 1, 1)

從列表中刪除狀態: (1, 1, 1) 恢復到上乙個狀態: (0, 0, 0)

從列表中刪除狀態: (0, 0, 0) 恢復到上乙個狀態: (0, 2, 1)

從列表中刪除狀態: (0, 2, 1) 恢復到上乙個狀態: (0, 1, 0)

從列表中刪除狀態: (0, 1, 0) 恢復到上乙個狀態: (0, 3, 1)

有 1 個人 0 個野人從左岸到右岸

左岸狀態: (2, 2, 0)

從列表中刪除狀態: (2, 2, 0) 恢復到上乙個狀態: (0, 3, 1)

從列表中刪除狀態: (0, 3, 1) 恢復到上乙個狀態: (0, 2, 0)

有 1 個人 1 個野人從左岸到右岸

左岸狀態: (2, 2, 0)

從列表中刪除狀態: (2, 2, 0) 恢復到上乙個狀態: (0, 2, 0)

*

傳教士與野人過河問題 人工智慧實驗報告

理解並熟悉掌握深度優先搜尋演算法。將所學人工智慧理論知識綜合運用到具體專案當中。有 n 個傳教士和 n 個野人來到河邊渡河,河岸有一條船,每次至多可供 k 人乘渡。問 傳教士為了安全起見,應如何規劃擺渡方案,使得任何時刻,河兩岸以及船上的野人數目總是不超過傳教士的數目 否則不安全,傳教士有可能被野人...

演算法 傳教士和野人問題

有n個傳教士和n個野人來到河邊準備渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,使得任何時刻,在河的兩岸以及船上的野人數目總是不超過傳教士的數目。即求解傳教士和野人從左岸全部擺渡到右岸的過程中,任何時刻滿足m 傳教士數 c 野人數 和m c k 的擺渡方案。te...

360面試題 傳教士和野人過河問題。

程式設計題 傳教士人數m,野人c,m c,開始都在岸左邊,船隻能載兩人,傳教士和野人都會划船,當然必須有人划船 兩岸邊保證野人人數不能大於傳教士人數 把所有人都送過河,設計一方案,要求程式設計實現。思路 深度搜尋。狀態 左岸和右岸的人數 船的位置。每乙個狀態下,會有5種狀態可以轉移,即 1,運送2個...