人工智能 野人和传教士问题

合集下载

人工智能实验2传教士过河问题

人工智能实验2传教士过河问题

人工智能实验报告班级:计研-12班学号:2012312120105 姓名:孔德星实验二知识表示方法1.实验目的(1)了解知识表示相关技术;(2)掌握问题规约法或者状态空间法的分析方法。

2.实验内容(2个实验内容可以选择1个实现)(1)梵塔问题实验。

熟悉和掌握问题规约法的原理、实质和规约过程;理解规约图的表示方法;(2)状态空间法实验。

从前有一条河,河的左岸有m个传教士、m个野人和一艘最多可乘n人的小船。

约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。

搜索一条可使所有的野人和传教士安全渡到右岸的方案。

3.实验报告要求(1)简述实验原理及方法,并请给出程序设计流程图。

实验原理:假设开始时传教士、野人和船都在右岸,用数组(a,b,c)分别表示右岸传教士个数、右岸野人个数、船的位置,则可分为三种情况讨论:A、n>m/2。

此种情况下,先把所有的野人度过去,每次返回一个野人,当出现(m,0,0)情况时,返回m-n个野人(若m==n,返回1个野人)。

然后渡n个传教士,此时野人==传教士,然后返回一个野人和传教士,再开始最大限度的渡传教士,每次返回一个野人,最终直到a==b==c==0;B、n<=3&&n<=m/2 || n==1,显然此时无解;C、n>=4&&n<=m/2,此时只能每次传n/2个传教士和野人,每次返回一个野人和传教士,直到最终结果。

程序流程图:(2)源程序清单:本程序用C++语言编写。

#include"iostream"using namespace std;bool flag = false; //标记是否有解bool af = false; //标记a是否为0bool bf = false; //当b变为0后赋值为true;bool ef = false; //当a==b后赋值为truebool f = false; //判断n是否大于m/2int m;//传教士野人的个数int n;//船一次能装载的人数void mc(int a,int b,int c);int main(){cout<<"传教士与野人过河问题。

《人工智能基础》名词术语

《人工智能基础》名词术语

1,AI:AI是人工智能英文单词Artificial Intelligence的缩写。

2,人工智能:人工智能是研究如何制造出人造的智能机器或智能系统,来模拟人类智能活动的能力,以延伸人们智能的科学。

3,产生式系统:产生式系统是Post于1943年提出的一种计算形式体系里所使用的术语,主要是使用类似于文法的规则,对符号串作替换运算。

到了60年代产生式系统成为认知心理学研究人类心理活动中信息加工过程的基础,并用它来建立人类认识的模型。

到现在产生式系统已发展成为人工智能系统中最典型最普遍的一种结构,例如目前大多数的专家系统都采用产生式系统的结构来建造。

产生式系统由综合数据库、一组产生式规则(规则集)和一个控制系统(控制策略)三部分组成,称为产生式系统的三要素。

4,产生式系统的三要素:产生式系统的三要素是综合数据库、一组产生式规则(规则集)和一个控制系统(控制策略)。

5,产生式规则:产生式规则是知识表示的一种形式,其形式如下: IF <前件> THEN <后件> 其中规则的<前件>表达的是该条规则所要满足的条件,规则的<后件>表示的是该规则所得出的结论,或者动作。

规则表达的可以是与待求解的问题有关的客观规律方面的知识,也可以是对求解问题有帮助的策略方面的知识。

6,八数码游戏(八数码问题):八数码游戏(八数码问题)描述为:在3×3组成的九宫格棋盘上,摆有八个将牌,每一个将牌都刻有1-8八个数码中的某一个数码。

棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以不断改变将牌的布局。

这种游戏求解的问题是:给定一种初始的将牌布局或结构(称初始状态)和一个目标的布局(称目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。

7,传教士和野人问题(M-C问题):传教士和野人问题描述为:有N个传教士和N个野人来到河边准备渡河,河岸有一条船,每次至多可供k人乘渡。

人工智能:野人与修道士问题

人工智能:野人与修道士问题

野人与修道士问题(Missionaries-and-Cannibals Problem )[修道士与野人问题]:三个野人与三个传教士来到河边,打算乘一只船从右岸渡到左岸去,该船的最大负载能力为两个人。

在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。

用状态空间法表示修道士与野人问题并设计编写计算机程序求问题的解。

问题分析:从上图可知,修道士、野人和船一共有六种可能,M L 、C L 、B L 、M R 、C R 、B R 。

可以表示为q =(M ,C ,B ),其中m 表示修道士的数目(0、1、2、3)、c 表示野人的数目(0、1、2、3)、b 表示船在左岸(1)或右岸(0)。

1、定义状态的描述形式:(m ,c ,b )2、表示所有可能的状态,并确定初始状态集和目标状态集:s0(3,3,1) s8(1,3,1) s16(3,3,0) s24(1,3,0)s1(3,2,1) s9(1,2,1) s17(3,2,0) s25(1,2,0)s2(3,1,1) s10(1,1,1) s18(3,1,0) s26(1,1,0)s3(3,0,1) s11(1,0,1) s19(3,0,0) s27(1,0,0)s4(2,3,1) s12(0,3,1) s20(2,3,0) s28(0,3,0)s5(2,2,1) s13(0,2,1) s21(2,2,0) s29(0,2,0)s6(2,1,1) s14(0,1,1) s22(2,1,0) s30(0,1,0)s7(2,0,1) s15(0,0,1) s23(2,0,0) s31(0,0,0)初始状态:(3,3,1)目标状态:(0,0,0)3、定义算符:L ij :把i 个修道士,j 个野人从河的左岸送到右岸R ij :把i 个修道士,j 个野人从河的右岸送到左岸整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。

问修道士M野 人C 左L 右R题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说的算符,根据题目要求,可以得出以下5个算符(按照渡船方向的不同,也可以理解为10个算符):渡1野人、渡1牧师、渡1野人1牧师、渡2野人、渡2牧师即:L01或R01,L10或R10,L11或R11,L02或R02,L20或R204、状态空间图:5、设计编写计算机程序求问题的解:算法:在应用状态空间表示和搜索方法时,用(M,C,B)来表示状态描述,其中M和C分别表示在左岸的传教士与野人数。

传教士(牧师)与野人问题-模拟人工智能实验_CSDN博客_传教士与野人问题

传教士(牧师)与野人问题-模拟人工智能实验_CSDN博客_传教士与野人问题

传教士(牧师)与野人问题-模拟人工智能实验_结缘缘的博客-CSDN博客_传教士与野人问题题目有n个牧师和n个野人准备渡河但只有一条能容纳c个人的小船为了防止野人侵犯牧师要求无论在何处牧师的人数不得少于野人的人数(除非牧师人数为0) 且假定野人与牧师都会划船试设计一个算法确定他们能否渡过河去若能则给出小船来回次数最少的最佳方案。

实验步骤输入牧师人数(即野人人数) n 小船一次最多载人量c。

输出若问题无解则显示Failed 否则显示Successed输出所有可行方案并标注哪一组是最佳方案。

用三元组(X1, X2, X3)表示渡河过程中的状态。

并用箭头连接相邻状态以表示迁移过程初始状态- 中间状态- 目标状态。

例当输入n 2 c 2时输出221- 200- 211- 010- 021- 000 其中X1表示起始岸上的牧师人数X2表示起始岸上的野人人数X3表示小船现在位置(1表示起始岸0表示目的岸)。

要求写出算法的设计思想和源程序并有用户界面实现人机交互控制台或者窗口都可以进行输入和输出结果如Please input n: 2 Please input c: 2 Optimal Procedure: 221- 200- 211- 010- 021- 000Successed or Failed?: Successed实现代码#include stdio.h #include iostream #include stdlib.h using namespace std;struct State { int Lsavage; int Lgodfather; int Rsavage; int Rgodfather; int boat; //boat at left 0 ; boat at right struct State *States new State[150];struct routesave { int savage; int godfather;struct routesave* routesaves new routesave[150];int godfather, savage, boatnum;void init(State m) { cout 请输入野人和牧师的人数n 以及船的最大载量c endl; int n, c; cin n c; m.Rgodfather n; m.Rsavage n; godfather n, savage n; boatnum c; m.Lgodfather m.Lsavage 0; m.boat 1;void boaloading(int i, int s, int g) { //s个野人和g个传教士if (States[i].boat 0) { routesaves[i].savage s*-1; //左边到右边是负数个野人routesaves[i].godfather g * -1; //左边到右边负数个传教士States[i 1].LsavageStates[i].Lsavage - s; States[i 1].Lgodfather States[i].Lgodfather - g; States[i 1].Rsavage States[i].Rsavage s; States[i 1].Rgodfather States[i].Rgodfather g; States[i 1].boat 1; else{ routesaves[i].savage s; //右边到左边是正数个野人routesaves[i].godfather g; //右边到左边正数个传教士States[i 1].Rsavage States[i].Rsavage-s; States[i 1].RgodfatherStates[i].Rgodfather - g; States[i 1].Lsavage States[i].Lsavage s; States[i 1].Lgodfather States[i].Lgodfather g; States[i 1].boat0;bool checkState(State m) { if (m.Rgodfather 0 m.Rgodfather m.Rsavage) return false; if (m.Lgodfather 0 m.Lgodfatherm.Lsavage) return false; else return true;void showSolution(int i) { cout 问题解决解决路径为endl; for (int c 0; c i; c ) { if (routesaves[c].savage 0) cout 第c 1 步routesaves[c].savage 个野人和routesaves[c].godfather 个传教士乘船去左边endl; else cout 第c 1 步routesaves[c].savage * -1 个野人和routesaves[c].godfather * -1 个传教士乘船去有右边endl; void nextstep(int i) { int c; if (i 150) cout 试探路径过大无法计算; exit(0); for (c 0; c i; c ) /*if the current state is same to previous,retrospect*/ if (States[c].Lsavage States[i].Lsavage States[c].Lgodfather States[i].Lgodfather States[c].Rsavage States[i].Rsavage States[c].Rgodfather States[i].Rgodfather States[c].boat States[i].boat) goto a; if (States[i].Rsavage 0 States[i].Rgodfather 0 States[i].boat 0) { showSolution(i); exit(0); if (States[i].boat 1) { //船在右边for (int s 1; s boatnum s States[i].Rsavage; s ) {//g 0 int g 0; boaloading(i, s, g); if (checkState(States[i 1])) { nextstep(i 1); for (int g 1; g boatnum g States[i].Rgodfather; g ) { //g! 0 for (int s 0; s boatnum - g s States[i].Rsavage s g; s ) { boaloading(i, s, g); if(checkState(States[i 1])) { nextstep(i 1); if (States[i].boat 0) { //船在左边for (int s 1; s boatnum s States[i].Lsavage; s ) {//g 0int g 0; boaloading(i, s, g); if (checkState(States[i 1])) { nextstep(i 1); for (int g 1; g boatnum g States[i].Lgodfather; g ) { //g! 0 for (int s 0; s boatnum - g s States[i].Lsavage s g; s ) { boaloading(i, s, g); if (checkState(States[i 1])) { nextstep(i 1);a:return;void main() { init(States[0]); nextstep(0);实验结果展示。

传教士野人问题

传教士野人问题

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

二、基本数据结构仔细阅读问题,可以发现有些基本东西我们必须把握,例如:每时刻河两岸野人牧师各自的数目、船的状态、整个问题状态。

传教士与野人

传教士与野人

实验题目:产生式设计——野人与传教士过河问题专业班级:计算机11-2 学生姓名. 吴璨No. 1137074实验目的:1.掌握人工智能的基础思想2.熟练应用程序实现人工智能3.强化实践能力产生式设计:1.实验语言环境:c语言2.数据结构:typedef struct{int m; //传教士在左岸的实际人数int c; //野人在左岸的实际人数int wz; //为1时船在左岸int sm; //船上传教士的实际人数int sc; //船上野人是实际人数}Baidu;3.算法设计(以一组较小数据为例,假设N=3,K=2)(1)设定状态变量及确定值域。

左岸的传教士数为m,则有m={0,1,2,3};对应右岸的传教士数为3—m;左岸的野人数为c,则有c={0,1,2,3};对应右岸野人数为3—c;左岸船数为b,故又有b={0,1};对应右岸的船数为1-b。

(2)确定状态组,分别列出初始状态集和目标状态集。

问题的状态可以用一个三元数组来描述,以左岸的状态来标记,即右岸的状态可以不必标出。

S k=(m, c, b)初始状态只有一个:S=(3,3,1),初始状态表示全部成员在河的的左岸;目标状态也只有一个:S=(0,0,0),表示全部成员从河的左岸全部渡河完毕。

(3)定义并确定操作集。

以河的左岸为基点来考虑,把船从左岸划向右岸定义为L(Sm,Sc)操作。

其中,第一下标Sm表示船载的传教士数,第二下标Sc表示船载的野人数;同理,从右岸将船划回左岸称之为R(Sm,Sc)操作,下标的定义同前。

(4)估计全部的状态空间数,并尽可能列出全部的状态空间。

在这个问题世界中,S={3,3,1}为初始状态,S=(0,0,0)为目标状态。

全部的可能状态共有32个,如表所示。

值得注意的是按照题目规定的条件,我们应该划去不合法的状态。

例如,首先可以划去岸边野人数目超过传教士的情况,即S4、S8、S9、S20、S24、S25等6种状态是不合法的;其次,应该划去右岸边野人数目超过野人的情况,即S6、S7、S11、S22、S23、S27等情况;余下20种合法状态中,又有4种是不可能出现的状态;S15和S16不可能出现,因为船不可能停靠在无人的岸边;S3不可能出现,因为传教士不可能在数量占优势的野人眼皮底下把船安全地划回来;还应该划去S28,因为传教士也不可能在数量占优势的野人眼皮底下把船安全地划向对岸。

人工智能导论_实验指导

人工智能导论_实验指导

《人工智能导论》实验指导实验一Prolog平台使用实验二状态空间搜索:传教士与野人问题求解实验三启发式搜索算法:斑马属谁问题求解实验四小型专家系统设计与实现实验报告的基本内容和书写格式——————————————————————————————————一、实验目的二、实验内容三、实验步骤四、实验结果1. 系统名称〈所做系统的名称〉2. 系统概述(包括所做系统的背景和主要功能等。

)3.系统运行演示过程(1) 输入的初始事实或数据:(2) 系统运行时产生的推理树(网):(3) 输出的结果:——————————————————————————————————《人工智能导论》实验一Prolog平台使用实验目的:熟悉Prolog(包括SWI-Prolog平台、Turbo-Prolog平台),包括编辑器、编译器及其执行模式;熟悉Prolog语法、数据结构和推理机制;熟悉SWI-Prolog平台与Visual C++结合开发应用程序。

实验环境(硬/软件要求):硬件:计算机一台软件:SWI-Prolog、Turbo Prolog、SWI-Prolog-Editor、Visual C++、Eclipse实验内容:1.Prolog平台界面和基本操作;2.熟悉Prolog语法和数据结构;3.熟悉Eclipse PDT插件安装、使用;4.编写简单Prolog程序并测试(输入动物叫声、输出该动物名称);5.熟悉Prolog平台与Visual C++结合开发应用程序;实验主要步骤:1.打开SWI-Prolog平台,熟悉SWIPrologEditor,熟悉操作界面;2.实现Prolog基本语句;3.编写简单Prolog程序并测试(输入动物叫声、输出该动物名称);示例程序(Turbo Prolog)逻辑电路模拟程序。

该程序以逻辑运算“与”、“或”、“非”的定义为基本事实,然后在此基础上定义了“异或”运算。

那么,利用这些运算就可以对“与”、“或”、“非”和“异或”等逻辑电路进行模拟。

(北邮)人工智能期中测验

(北邮)人工智能期中测验

2006年秋季人工智能小测验(1)
1.为什么要学习人工智能,谈谈你的理解?
2.用语义网络表示下列知识:
所有的鸽子都是鸟。

所有的鸽子都有翅膀。

信鸽是一种鸽子,它有翅膀,能识途。

3.设已知:
(1)能阅读的人是识字的。

(2)海豚不识字。

(3)有些海豚是很聪明的。

用输入归结策略证明:有些很聪明的人并不识字。

4.修道士和野人问题。

设有3个修道士和3个野人来到河边,打算
用一条船从河的左岸渡到河的右岸去。

但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,、否则修道士就会被野人吃掉。

假设野人服从任何一种过河安排,请使用状态空间搜索法,规划一使全部6人安全过河的方案。

(提示:应用状态空间表示和搜索方法时,可用(Nm,Nc)来表示状态描述,其中Nm和Nc分别为传教士和野人的人数。

初始状态为(3,3),而可能的中间状态为(0,1),(0,2),(0,3),(1,1),(2,1),(2,
2),(3,0),(3,1),(3,2)等。

)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unopenednum--;
if (openednum == 0 )
oend = opened = ntx;
oend -> nextnode = ntx;
oend = ntx;
openednum++;
}
void recorder()
{
int i , loop;
struct SPQ *newnode;
(5)当状态数量不是很大时,按问题的有序元组画出状态空间图,依照状态空间图搜索求解。
根据上述分析,共有16个合法状态和允许的操作,可以划出传教士和食人者问题的状态空间图,如图6—4所示。
图6—4传教士和食人者问题的状态空间
如图6—4所示,由于划船操作是可逆的,所以图中状态节点间用双向箭头连接,箭头旁边所标的数字表示了P或Q操作的下标,即分别表示船载的传教士数和食人者数。这样,任何一条从S0到达S31的路径都是该问题的解。
解我们按上述步骤来进行求解分析。
(1)设定状态变量及确定值域。
为了建立这个问题的状态空间,设左岸的传教士数为m,则有m={0,1,2,3};
对应右岸的传教士数为3—m;左岸的食人者数为c,则有c={0,1,2,3};
对应右岸食人者数为3—c;左岸船数为b,故又有b={0,1};右岸的船数为1-b。
(2)确定状态组,分别列出初始状态集和目标状态集。
int loop; /*本结点所在的层数*/
struct SPQ *upnode ,*nextnode;/*本结点的父结点和同层的下一个结点的地址*/
}spq;
int loopnum;/*记录总的扩展次数*/
int openednum;/*记录已扩展节点个数*/
int unopenednum;/*记录待扩展节点个数*/
{
printf("\n内存不够!\n");
exit(0);
}
newnode -> sr = ntx -> sr;
newnode -> pr = ntx -> pr;
newnode -> sl = ntx -> sl;
newnode -> pl = ntx -> pl;
newnode -> sst = ntx -> sst;
fsr = result -> sr - result -> ssr;
printf("传教士%8d%8d\t<-\t%8d\n",fpl,result -> spt,fpr);
printf("野人%8d%8d\t<-\t%8d\n",fsl,result -> sst,fsr);
printf("传教士%8d%8d\t->\t%8d\n",result -> pl,result -> spr,result -> pr - result -> spr);
传教士-野人问题
有N个传教士和N个野人要过河,现在有一条船只能承载K个人(包括野人),K<N,在任何时刻,如果有野人和传教士在一起,必须要求传教士的人数多于或等于野人的人数。
设M为传教士的人数,C为野人的人数,用状态空间发求解此问题的过程如下:
M、C = N,boat = k,要求M>=C且M+C <= K
}
void showresult() /*显示*/
{
int i;
int fsr , fpr ; /*在右岸上的人数*/
int fsl , fpl ; /*在左岸上的人数*/
struct SPQ* nodefree;
printf("%d个传教士",result -> pr);
printf("%d个野人",result -> sr);
printf("野人%8d%8d\t->\t%8d\n",result -> sl,result -> ssr,result -> sr - result -> ssr);
int resultnum;
struct SPQ *opened;
struct SPQ *oend;
struct SPQ *unopened;
struct SPQ *uend;
struct SPQ *result;
void initiate();
void releasemem();
void showresult();
newnode -> nextnode = result;
result = newnode;
resultnum++;
}
}
void releasemem()
{
int i;
struct SPQ* nodefree;
for ( Βιβλιοθήκη = 1 ; i < openednum ; i++ )
{
nodefree = opened;
Q10if ( ML ,CL , BL=0 ) then ( ML+1 , CL , BL+1 )
Q01if ( ML ,CL , BL=0 ) then ( ML , CL+1 , BL+1 )
Q11if ( ML ,CL , BL=0 ) then ( ML+1 ,CL +1, BL+1 )
Q20if ( ML ,CL , BL=0 ) then ( ML+2 , CL +2, BL+1)
#define slavenum 3
struct SPQ
{ int sr,pr; /*船运行一个来回后河右岸的野人、传教士的人数*/
int sl,pl; /*船运行一个来回后河左岸的野人、传教士的人数*/
int ssr,spr; /*回来(由左向右时)船上的人数*/
int sst,spt; /*去时(由右向左时)船上的人数*/
这样,通过运用状态空间表示法就解决了传教士和食人者问题的求解。
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define maxloop 100 /*最大层数,对于不同的扩展方法自动调整取值*/
#define pristnum 3 /*初始化时设定有3个野人3个传教士,实际可以改动*/
P01if ( ML ,CL , BL=1 ) then ( ML , CL–1 , BL–1 )
P11if ( ML ,CL , BL=1 ) then ( ML–1 , CL–1 , BL–1 )
P20if ( ML ,CL , BL=1 ) then ( ML–2 , CL , BL–1 )
P02if ( ML ,CL , BL=1 ) then ( ML , CL–2 , BL–1 )
初始状态目标状态
LRLR
M30M03
C30C03
B10B01
(1)用三元组来表示(ML , CL , BL)
其中0<=ML , CL <= 3 , BL∈{ 0 , 1}
(3 , 3 , 1) (0 , 0 , 0)
(2)规则集合
P10if ( ML ,CL , BL=1 ) then ( ML–1 , CL , BL–1 )
F={P01,P10,P11,P02,P20,Q01,Q10,Q11,Q02,Q20}
(4)估计全部的状态空间数,并尽可能列出全部的状态空间或予以描述。
在这个问题世界中,S0={3,3,1}为初始状态,S31=Sg=(0,0,0)为目标状态。
全部的可能状态共有32个,如表6—1所示。
表6—1传教士和食人者问题的全部可能状态
opened = opened -> nextnode;
free(nodefree);
}
for ( i = 0 ; i < unopenednum ; i++ )
{
nodefree = unopened;
unopened = unopened -> nextnode;
free(nodefree);
}
状态
m,c,b
状态
m,c,b
状态
m,c,b
状态
m,c,b
S0
3,3,1
S8
1,3,1
S16
3,3,0
S24
1,3,0
S1
3,2,1
S9
1,2,1
S17
3,2,0
S25
1,2,0
S2
3,1,1
S10
1,1,1
S18
3,1,0
S26
1,1,0
S3
3,0,1
S11
1,0,1
S19
3,0,0
S27
1,0,0
printf("%d个传教士",result -> pl);
printf("%d个野人",result -> sl);
for ( i = 1 ; i < resultnum ; i++ )
{
nodefree = result;
result = result -> nextnode;
free(nodefree);
S4
2,3,1
S12
0,3,1
S20
2,3,0
S28
0,3,0
相关文档
最新文档