人工智慧過河問題
A. 一個簡單的人工智慧題:用問題歸約法求解野人與修道士的問題
問題歸約法從目標(要解決的問題)出發,逆向推理,通過一系列變換把初始問題變換為子問題集合和子子問題集合,直至最後歸約為一個平凡的本原問題集合。
已知條件1:最後一次乘船的一定是兩人。
已知條件2:往與返的組合不能重復,否則沒有意義。
已知條件3:左岸人數除最末次外,不為零。
目標0:
右岸有3個野人3個修道士,船在右。
逆向推理:
最後一次乘船到右岸的組合有以下幾種:
1個野人1個修道士;2個野人。
目標-1:
a、左岸1野1修,右岸2野2修,船在左;
b、左岸2野,右岸1野3修,船在左。
逆向推理:
a、左岸1野,1修駛向左岸,右岸2野2修;
b、左岸1野,1野駛向左岸,右岸1野3修。
目標-2:
左岸1野,右岸2野3修,船在右。
逆向推理:
c、左岸1野,1修駛向右岸,右岸2野2修;
d、左岸1野,1野駛向右岸,右岸1野3修;
e、左岸1野,2野駛向右岸,右岸3修。
目標-3:
左岸3野,右岸3修,船在左。
逆向推理:
f、左岸1野,2野駛向左岸,右岸3修;
g、左岸2野,1野駛向左岸,右岸3修。
目標-4:
左岸2野,右岸1野3修,船在右。
逆向推理:
h、左岸2野,1野駛向右岸,右岸3修;
i、左岸2野,2修駛向右岸,右岸1野1修。
目標-5:
左岸2野2修,右岸1野1修,船在左。
逆向推理:
j、左岸2野,2修駛向左岸,右岸1野1修;
k、左岸1野1修,1野1修駛向左岸,右岸1野1修。
目標-6:
左岸1野1修,右岸2野2修,船在右。(與目標-5對稱)
逆向推理:
l、左岸1野1修,2修駛向右岸,右岸2野。
目標-7:
左岸1野3修,右岸2野,船在左。(與目標-4對稱)
逆向推理:
m、左岸3修,1野駛向左岸,右岸2野。
目標-8:
左岸3修,右岸3野,船在右。(與目標-3對稱)
逆向推理:
n、左岸3修,2野駛向右岸,右岸1野。
目標-9:
左岸3修2野,右岸1野,船在左。(與目標-2對稱)
逆向推理:
左岸3修1野,1野駛向左岸,右岸1野。
目標-10:
左岸3修1野,右岸2野,船在右。
逆向推理:
左岸3修1野,2野駛向右岸,右岸無人。
達到期望的初始狀態^^
結論:
1、2野向右:結果左3修1野,右2野,船在右。(目標-10)
2、1野向左:結果左3修2野,右1野,船在左。(目標-9)
3、2野向右:結果左3修,右3野,船在右。(目標-8)
4、1野向左:結果左3修1野,右2野,船在左。(目標-7)
5、2修向右:結果左1修1野,有2修2野,船在右。(目標-6)
6、1修1野向左:結果左2修2野,右1修1野,船在左。(目標-5)
7、2修向右:結果左2野,右3修1野,船在右。(目標-4)
8、1野向左:結果左3野,右3修,船在左。(目標-3)
9、2野向右:結果左1野,右2野3修,船在右。(目標-2)
10、1野向左:結果左2野,右1野3修,船在左。
或1修向左:結果左1野1修,右2野2修,船在左。(目標-1)
11、2野向右,或1修1野向右,達到目的。
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個野人去,完成
不合法的狀態和重復狀態,我都沒畫出,你可以自己加一下,也可以結合圖
說明一下
C. 人工智慧會統治地球嗎
研究歷史,我們知道,人類歷史的發展,沒有什麼必然,它是由一個一個的偶然事件逐漸推動發展方向的,沒有誰能保證人類文明能夠萬古長青,君不見,有那麼多考古證據揭示了曾經有那麼多的文明都淹沒於歷史的長河中了嗎,不過,有一點是肯定的,人類社會,一定趨向於越來越復雜,人類社會的每一次進步,本質上都是趨向於更復雜,這種復雜是維度的上升,也就是我們平時說的指數級的上升,每一次進步的前夕,人們都有過恐慌,這是人類對未知的正常反應,過去的農業文明,工業文明,信息文明,無不如此,只是,人們每一次恐慌上升的程度,也是指數級別的。這一次人工智慧時代,當然也是史上最大的一次。但是,據說人類的大腦只開發了百分之幾,所以,人類有足夠的資源來應對這種恐慌。對於科學家們擔心由於人工智慧的運用,未來人類社會會被撕裂,我有不同的看法,他們擔心人類會因為基因技術改變富人和窮人的競爭優勢,從而使人類社會被撕裂,可是,沒有任何證據表明,哪一個基因優於另一個基因,過去的歷史也證明了,基因,不是人類進化的原因,選擇,沒有對錯,只不過是你追求什麼結果,你就如何選擇,任何一個選擇,都不可能只有好處,沒有壞處,我們要做的是,接受選擇的好處,也要准備好接受選擇的壞處。對基因的選擇,同樣如此。而其他的擔心理由,不再一一論述。(順帶一句題外話——不選擇的優勢,在於可以一直擁有選擇權,但是也拒絕了進步的可能——我們認為我們是進步的——不可取也)。另外,從過去的歷史看,人類社會進步的發展方向,一直是趨於更加的統一,更加的社會化大分工,更廣泛的社會協作,不如此,不進步。所以,人類社會的復雜所產生的彌合力量,一定大於社會分裂的力量。當然,人類社會不被撕裂,也不意味著就是美好和大同,歷史表明,人類社會的貧富差距一直是越來越大,這很正常,它與宇宙的進化方向相一致,就是越來越復雜。對於我們來說,就是問題越來越多,不過,這是進步的代價,也是選擇的代價。所以,貧窮,是不可能被消滅的,因為,它是人類社會生態的一分子。只不過,有可能在不同的時代,不同的社會發展階段,貧窮的概念,或者說定義不同,但是,也許也可能我們將來會對貧窮進行分級,也就是說最原始的那種貧窮會一直存在,只不過不同的貧窮佔比不同。貧窮,不可以被消滅,正如疾病,也不可以被消滅一樣,因為,那是我們的一分子,是我們進步的原因。
最後,我們用古老的小馬過河的故事做結尾吧,未來,不是天堂,也不是地獄,他,只是未來,我們要做的,是面對他大踏步的前進,因為,我們別無選擇。
D. 用Visual Prolog實現一個人工智慧程序。問題如下。
看你是中法的告訴你吧,,,我是你璽哥
三個傳教士和三個野人的示常式序如下:
move(1,0).
move(0,1).
move(0,2).
move(2,0).
move(1,1).
legal((X,Y,_)):-legal1(X),legal1(Y).
legal1((X,Y)):-X=:=0,Y>=0,!.
legal1((X,Y)):-Y=:=0,X>=0,!.
legal1((X,Y)):-X>=Y,X>=0,Y>=0.
update((X,Y,0),Move,Statu1):-
(A,B)=X,
(C,D)=Y,
(E,F)=Move,
C1 is C+E,
D1 is D+F,
A1 is A-E,
B1 is B-F,
Statu1=((A1,B1),(C1,D1),1).
update((X,Y,1),Move,Statu1):-
(A,B)=X,
(C,D)=Y,
(E,F)=Move,
C1 is C-E,
D1 is D-F,
A1 is A+E,
B1 is B+F,
Statu1=((A1,B1),(C1,D1),0).
connect(Statu,Statu1):-
move(X,Y),
update(Statu,(X,Y),Statu1),
legal(Statu1).
findroad(X,X,L,L):-write(L).
findroad(X,Y,L,L1):-
connect(X,Z),
not(member(Z,L)),
findroad(Z,Y,[Z|L],L1).
E. 人工智慧 野人與傳教士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的論壇,自己找,有答案。
F. 野人過河新問題 演算法
樓主,我懷疑你問題打錯了,有幾個野人啊?如果只有一個,那怎麼渡都行,還版有, 如果把條件改為在河上權野人和僧人的數量相同,野人才不會吃掉僧人,是什麼意思啊,船上只能有兩個人,當然最多一僧一野,沒被吃的可能啊
G. 如何解決野人過河問題
差不多,你參考下:
野人過河問題屬於人工智慧學科中的一個經典問題,問題描述如下: 有三個牧師(也有的翻譯為傳教士)和三個野人過河,只有一條能裝下兩個人的船,在河的任何一方或者船上,如果野人的人數大於牧師的人數,那麼牧師就會有危險. 你能不能找出一種安全的渡河方法呢?
一、演算法分析
先來看看問題的初始狀態和目標狀態,假設和分為甲岸和乙岸:
初始狀態:甲岸,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。
H. 求助人工智慧農夫過河問題的prolog語言程序
/*
PROBLEM:
A farmer with his goat, wolf and cabbage come to a river that they
wish to cross. There is a boat, but it only has room for two, and
the farmer is the only one that can row. If the goat and cabbage
get in the boat at the same time, the cabbage gets eaten.
Similarly, if the wolf and goat are together without the farmer,
the goat is eaten. Devise a series of crossings of the river so that all
concerned make it across safely.
The state of the system is indicated by stating where the farmer, the goat
the wolf and the cabbage are located.
state( Farmer, Wolf, Goat, Cabbage )
The problem is that a state must only be visited once, and some states
are illegal. This is checked by 'unsafe' and 'member'.
The Predicate "go" can be called with a start state and a final state
go( state(east,east,east,east), state(west,west,west,west) ).
*/
DOMAINS
LOC = east ; west
STATE = state(LOC,LOC,LOC,LOC)
PATH = STATE*
PREDICATES
go(STATE,STATE) /* Start of the algorithm */
path(STATE,STATE,PATH,PATH) /* Finds a path from one state to another */
move(STATE,STATE) /* Transfer a system from one side to another */
opposite(LOC,LOC) /* Gives a location on the opposite side */
unsafe(STATE) /* Gives the unsafe states */
member(STATE,PATH) /* Checks if the state is already visited */
write_path(PATH)
write_move(STATE,STATE)
show_move(STATE,STATE)
showside(LOC,LOC,string)
s_river
GOAL
makewindow(4,7,0,"",0,0,24,80),
makewindow(3,7,7," The River ",15,0,10,80),
makewindow(2,112,0,"",0,0,1,80),
write("press any key for each step of solution"),
makewindow(1,7,7," Solutions ",2,0,13,80),
show_move(state(west,west,west,west),state(west,west,west,west)),
go(state(east,east,east,east),state(west,west,west,west)),
write("solved press any key to continue"),
readchar(_),
exit.
CLAUSES
go(S,G):-
path(S,G,[S],L),
nl,write("A solution is:"),nl,
write_path(L),
fail.
go(_,_).
path(S,G,L,L1):- move(S,S1),
not( unsafe(S1) ),
not( member(S1,L) ),
path( S1,G,[S1|L],L1),!.
path(G,G,T,T):- !. /* The final state is reached */
move(state(X,X,G,C),state(Y,Y,G,C)):-opposite(X,Y). /* FARMER + WOLF */
move(state(X,W,X,C),state(Y,W,Y,C)):-opposite(X,Y). /* FARMER + GOAT */
move(state(X,W,G,X),state(Y,W,G,Y)):-opposite(X,Y). /* FARMER + CABBAGE */
move(state(X,W,G,C),state(Y,W,G,C)):-opposite(X,Y). /* ONLY FARMER */
opposite(east,west).
opposite(west,east):-!.
unsafe( state(F,X,X,_) ):- opposite(F,X). /* The wolf eats the goat */
unsafe( state(F,_,X,X) ):- opposite(F,X). /* The goat eats the cabbage */
member(X,[X|_]).
member(X,[_|L]):-member(X,L).
write_path( [H1,H2|T] ) :- !,
readchar(_),
write_move(H1,H2),
show_move(H1,H2),
write_path([H2|T]).
write_path( [] ).
write_move( state(X,W,G,C), state(Y,W,G,C) ) :-!,
write("The farmer crosses the river from ",X," to ",Y),nl.
write_move( state(X,X,G,C), state(Y,Y,G,C) ) :-!,
write("The farmer takes the Wolf from ",X," of the river to ",Y),nl.
write_move( state(X,W,X,C), state(Y,W,Y,C) ) :-!,
write("The farmer takes the Goat from ",X," of the river to ",Y),nl.
write_move( state(X,W,G,X), state(Y,W,G,Y) ) :-!,
write("The farmer takes the cabbage from ",X," of the river to ",Y),nl.
/* Show them move across the river.*/
show_move( state(F,W,G,C), state(F1,W1,G1,C1) ) :-!,
s_river,
showside(F,F1,"Farmer "),
showside(W,W1," Wolf "),
showside(G,G1," Goat "),
showside(C,C1,"Cabbage"),
shiftwindow(1).
showside(east,east,Item):-!,
write(" ~~~~~ ",Item),nl.
showside(west,west,Item):-!,
write(" ",Item," ~~~~~ "),nl.
showside(east,west,Item):-!,
write(" ",Item," <= <= <= ",Item),nl.
showside(west,east,Item):-!,
write(" ",Item," => => => ",Item),nl.
s_river:-
shiftwindow(3),clearwindow,
write(" WEST river EAST"),nl,
write(" ----------------------------------------------------------------------"),
nl.
I. 過河問題
差不多,你參考下:
野人過河問題屬於人工智慧學科中的一個經典問題,問題描述如下: 有三個牧師(也有的翻譯為傳教士)和三個野人過河,只有一條能裝下兩個人的船,在河的任何一方或者船上,如果野人的人數大於牧師的人數,那麼牧師就會有危險. 你能不能找出一種安全的渡河方法呢?
一、演算法分析
先來看看問題的初始狀態和目標狀態,假設和分為甲岸和乙岸:
初始狀態:甲岸,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。
J. 人工智慧野人傳教士過河
第一次倆個野人過來河,留下一個源野人,回一個野人
第二次一野人一傳教士過河,留下一個傳教士,回一個野人
第三次倆個教士過河,回一個野人
剩下的就好辦了...
(錯)
*************************************************************************
汗。。。火星微生物說得對哈,我差點就鬧出人命了
試一試:(x:野人,o:傳教士)
第一次倆個野人過河,留下一個野人,回一個野人( xxooo|x )
第二次倆個野人過河,留下一個野人,回一個野人(xooo|xx)
第三次倆個傳教士過河,回一個野人,一傳教士(xxoo|xo)
第四次倆個傳教士過河(xx|xooo)........
大家看看,有沒有問題(這幾天腦袋發昏),歡迎指教:)