㈠ 如何解决野人过河问题

差不多,你参考下:
野人过河问题属于人工智能学科中的一个经典问题,问题描述如下: 有三个牧师(也有的翻译为传教士)和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于牧师的人数,那么牧师就会有危险. 你能不能找出一种安全的渡河方法呢?
一、算法分析
先来看看问题的初始状态和目标状态,假设和分为甲岸和乙岸:
初始状态:甲岸,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)........
大家看看,有没有问题(这几天脑袋发昏),欢迎指教:)

㈨ 三个传教士带三个魔鬼怎样过河

不知道对不对??
先带魔鬼过河
再带一个魔鬼过河
再带一个传教士过河,回来时带一个魔鬼
再将另一个传教士带过河
再把剩余的两个魔鬼一个一个带过河