人工智能野人渡河
㈠ 急求 人工智能 野人传教士过河问题,详解!!!!
我来试着回答一下前三问:
(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个野人去,完成
不合法的状态和重复状态,我都没画出,你可以自己加一下,也可以结合图
说明一下
㈡ 人工智能野人传教士过河
第一次俩个野人过来河,留下一个源野人,回一个野人
第二次一野人一传教士过河,留下一个传教士,回一个野人
第三次俩个教士过河,回一个野人
剩下的就好办了...
(错)
*************************************************************************
汗。。。火星微生物说得对哈,我差点就闹出人命了
试一试:(x:野人,o:传教士)
第一次俩个野人过河,留下一个野人,回一个野人( xxooo|x )
第二次俩个野人过河,留下一个野人,回一个野人(xooo|xx)
第三次俩个传教士过河,回一个野人,一传教士(xxoo|xo)
第四次俩个传教士过河(xx|xooo)........
大家看看,有没有问题(这几天脑袋发昏),欢迎指教:)
㈢ 过河问题
差不多,你参考下:
野人过河问题属于人工智能学科中的一个经典问题,问题描述如下: 有三个牧师(也有的翻译为传教士)和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于牧师的人数,那么牧师就会有危险. 你能不能找出一种安全的渡河方法呢?
一、算法分析
先来看看问题的初始状态和目标状态,假设和分为甲岸和乙岸:
初始状态:甲岸,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。
㈣ 用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).
㈤ 传教士和野人渡河问题
第一步:先过去两个食人兽,再回来一个;(或先过去一个传教士和一个兽,传教士回来)
第二步:再过去两个食人兽,再回来一个; (再过去两个兽,再回来一个兽,下面的一样)
第三步:过去两个传教士,再回来一个传教士和一个食人兽;
第四步:再过去两个传教士,回来一个食人兽;
第五步:过去两个食人兽,再回来一个食人兽;
第六步:最后两个食人兽过去。
希望能解决你的疑问O∩_∩O~
㈥ 如何解决野人过河问题
差不多,你参考下:
野人过河问题属于人工智能学科中的一个经典问题,问题描述如下: 有三个牧师(也有的翻译为传教士)和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于牧师的人数,那么牧师就会有危险. 你能不能找出一种安全的渡河方法呢?
一、算法分析
先来看看问题的初始状态和目标状态,假设和分为甲岸和乙岸:
初始状态:甲岸,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:最后一次乘船的一定是两人。
已知条件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野向右,达到目的。
㈧ 野人过河新问题 算法
楼主,我怀疑你问题打错了,有几个野人啊?如果只有一个,那怎么渡都行,还版有, 如果把条件改为在河上权野人和僧人的数量相同,野人才不会吃掉僧人,是什么意思啊,船上只能有两个人,当然最多一僧一野,没被吃的可能啊
㈨ 人工智能 野人与传教士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的论坛,自己找,有答案。