人工智慧傳教士過河
㈠ 如何解決野人過河問題
差不多,你參考下:
野人過河問題屬於人工智慧學科中的一個經典問題,問題描述如下: 有三個牧師(也有的翻譯為傳教士)和三個野人過河,只有一條能裝下兩個人的船,在河的任何一方或者船上,如果野人的人數大於牧師的人數,那麼牧師就會有危險. 你能不能找出一種安全的渡河方法呢?
一、演算法分析
先來看看問題的初始狀態和目標狀態,假設和分為甲岸和乙岸:
初始狀態:甲岸,3野人,3牧師;
乙岸,0野人,0牧師;
船停在甲岸,船上有0個人;
目標狀態:甲岸,0野人,0牧師;
乙岸,3野人,3牧師;
船停在乙岸,船上有0個人;
整個問題就抽象成了怎樣從初始狀態經中間的一系列狀態達到目標狀態。問題狀態的改變是通過劃船渡河來引發的,所以合理的渡河操作就成了通常所說的算符,根據題目要求,可以得出以下5個算符(按照渡船方向的不同,也可以理解為10個算符):
渡1野人、渡1牧師、渡1野人1牧師、渡2野人、渡2牧師
算符知道以後,剩下的核心問題就是搜索方法了,本文採用深度優先搜索,通過一個FindNext(…)函數找出下一步可以進行的渡河操作中的最優操作,如果沒有找到則返回其父節點,看看是否有其它兄弟節點可以擴展,然後用Process(…)函數遞規調用FindNext(…),一級一級的向後擴展。
搜索中採用的一些規則如下:
1、渡船優先規則:甲岸一次運走的人越多越好(即甲岸運多人優先),同時野人優先運走;
乙岸一次運走的人越少越好(即乙岸運少人優先),同時牧師優先運走;
2、不能重復上次渡船操作(通過鏈表中前一操作比較),避免進入死循環;
3、任何時候河兩邊的野人和牧師數均分別大於等於0且小於等於3;
4、由於只是找出最優解,所以當找到某一算符(當前最優先的)滿足操作條件後,不再搜索其兄弟節點,而是直接載入鏈表。
5、若擴展某節點a的時候,沒有找到合適的子節點,則從鏈表中返回節點a的父節點b,從上次已經選擇了的算符之後的算符中找最優先的算符繼續擴展b。
㈡ 過河問題
差不多,你參考下:
野人過河問題屬於人工智慧學科中的一個經典問題,問題描述如下: 有三個牧師(也有的翻譯為傳教士)和三個野人過河,只有一條能裝下兩個人的船,在河的任何一方或者船上,如果野人的人數大於牧師的人數,那麼牧師就會有危險. 你能不能找出一種安全的渡河方法呢?
一、演算法分析
先來看看問題的初始狀態和目標狀態,假設和分為甲岸和乙岸:
初始狀態:甲岸,3野人,3牧師;
乙岸,0野人,0牧師;
船停在甲岸,船上有0個人;
目標狀態:甲岸,0野人,0牧師;
乙岸,3野人,3牧師;
船停在乙岸,船上有0個人;
整個問題就抽象成了怎樣從初始狀態經中間的一系列狀態達到目標狀態。問題狀態的改變是通過劃船渡河來引發的,所以合理的渡河操作就成了通常所說的算符,根據題目要求,可以得出以下5個算符(按照渡船方向的不同,也可以理解為10個算符):
渡1野人、渡1牧師、渡1野人1牧師、渡2野人、渡2牧師
算符知道以後,剩下的核心問題就是搜索方法了,本文採用深度優先搜索,通過一個FindNext(…)函數找出下一步可以進行的渡河操作中的最優操作,如果沒有找到則返回其父節點,看看是否有其它兄弟節點可以擴展,然後用Process(…)函數遞規調用FindNext(…),一級一級的向後擴展。
搜索中採用的一些規則如下:
1、渡船優先規則:甲岸一次運走的人越多越好(即甲岸運多人優先),同時野人優先運走;
乙岸一次運走的人越少越好(即乙岸運少人優先),同時牧師優先運走;
2、不能重復上次渡船操作(通過鏈表中前一操作比較),避免進入死循環;
3、任何時候河兩邊的野人和牧師數均分別大於等於0且小於等於3;
4、由於只是找出最優解,所以當找到某一算符(當前最優先的)滿足操作條件後,不再搜索其兄弟節點,而是直接載入鏈表。
5、若擴展某節點a的時候,沒有找到合適的子節點,則從鏈表中返回節點a的父節點b,從上次已經選擇了的算符之後的算符中找最優先的算符繼續擴展b。
㈢ 急求 人工智慧 野人傳教士過河問題,詳解!!!!
我來試著回答一下前三問:
(1)完整的規則集合
if(MR,CR,LR=1)then(MR-1,CR,LR-1);
if(MR,CR,LR=1)then(MR,CR-1,LR-1);
if(MR,CR,LR=1)then(MR-1,CR-1,LR-1);
if(MR,CR,LR=1)then(MR-2,CR,LR-1);
if(MR,CR,LR=1)then(MR,CR-2,LR-1);
if(MR,CR,LR=0)then(MR+1,CR,LR+1);
if(MR,CR,LR=0)then(MR,CR+1,LR+1);
if(MR,CR,LR=0)then(MR+1,CR+1,LR+1);
if(MR,CR,LR=0)then(MR+2,CR,LR+1);
if(MR,CR,LR=0)then(MR,CR+2,LR+1);
(2)狀態空間的總狀態數為4×4×2=32,只有20個合法狀態,其中有4個合法狀態達不到,最終解空間由16個狀態組成,下面給出說明
(MR,CR,LR)(MR,CR,LR)
(001)達不到(000)
(011)(010)
(021)(020)
(031)(030)達不到
(101)不合法(100)不合法
(111)(110)
(121)不合法(120)不合法
(131)不合法(130)不合法
(201)不合法(200)不合法
(211)不合法(210)不合法
(221)(220)
(231)不合法(230)不合法
(301)達不到(300)
(311)(310)
(321)(320)
(331)(330)達不到
(3)2個野人去,1個野人回
2個野人去,1個野人回
2個傳教士去,1個野人與1個傳教士回
2個傳教士去,1個野人回
2個野人去,1個野人回
2個野人去,完成
不合法的狀態和重復狀態,我都沒畫出,你可以自己加一下,也可以結合圖
說明一下
㈣ 可憐的傳教士怎樣過河
1.傳教士和食人族過,傳教士回.
2.兩個食人族過,一食人族回.
3.兩傳教士過,傳教士和食人族一起回.
4.兩傳教士過,接下來,左岸就有3個傳教士,1個食人族了,然後食人族就可以一個一個把它的同伴接回來了.
㈤ 求C語言高手解答,這是傳教士野人過河問題。程序運行總是出現無解死循環,看不出問題,求大神解答!
陷入死循環,說明 在退出循環的語句中出現了問題。不知道你如何定義的棧結構,所以你自己分析下,while((s->top)+1)與if(pd==1) 的判斷是不是出錯了。。
㈥ 傳教士和野蠻人如何過河
三名傳教士和三個野蠻人同在一個小河渡口,渡口上只有一條可容兩人的小船。問題的目標是要用這條小船把這六個人全部渡到對岸去,條件是在渡河的過程中,河兩岸隨時都保持傳教士人數不少於野蠻人的人數,否則野蠻人會把處於少數的傳教士吃掉。這六個人怎樣才能安全渡過去?
[答案:可以這樣渡河
1.一名牧師和一個野蠻人過河;
2.留下野蠻人,牧師返回;
3.兩個野蠻人過河;
4.一個野蠻人返回;
5.兩名牧師過河;
6.一名牧師和一個野蠻人返回;
7.兩名牧師過河;
8.一個野蠻人返回;
9.兩個野蠻人過河;
10.一個野蠻人返回;
11.兩個野蠻人過河。
這里關鍵的一步是第6步,許多人不能解決此題,就是沒有想到這一步。]
㈦ 人工智慧 野人與傳教士c++程序,能運行
http://so.csdn.net/bbsSearchResult.aspx?q=%e9%87%8e%e4%ba%ba%e4%b8%8e%e4%bc%a0%e6%95%99%e5%a3%ab%e8%bf%87%e6%b2%b3&p=0
csdn的論壇,自己找,有答案。
㈧ 人工智慧野人傳教士過河
第一次倆個野人過來河,留下一個源野人,回一個野人
第二次一野人一傳教士過河,留下一個傳教士,回一個野人
第三次倆個教士過河,回一個野人
剩下的就好辦了...
(錯)
*************************************************************************
汗。。。火星微生物說得對哈,我差點就鬧出人命了
試一試:(x:野人,o:傳教士)
第一次倆個野人過河,留下一個野人,回一個野人( xxooo|x )
第二次倆個野人過河,留下一個野人,回一個野人(xooo|xx)
第三次倆個傳教士過河,回一個野人,一傳教士(xxoo|xo)
第四次倆個傳教士過河(xx|xooo)........
大家看看,有沒有問題(這幾天腦袋發昏),歡迎指教:)
㈨ 三個傳教士帶三個魔鬼怎樣過河
不知道對不對??
先帶魔鬼過河
再帶一個魔鬼過河
再帶一個傳教士過河,回來時帶一個魔鬼
再將另一個傳教士帶過河
再把剩餘的兩個魔鬼一個一個帶過河