人工智能野人与修道士问题_第1页
人工智能野人与修道士问题_第2页
人工智能野人与修道士问题_第3页
人工智能野人与修道士问题_第4页
人工智能野人与修道士问题_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、人工智能:野人与修道士问题Missionaries-and-Cannibals Problem :三个野人与三个传教士来到河边,打算乘一只船从右岸渡到左岸去,该船的最大负载能力为两个人。在任何时候,如果野人人数超过传 教士人数,那么野人就会把传教士吃掉。用状态空间法表示修道士与野人问题并设计编写计算机程序求问题的解。左L右R修道士 M船B野人C从上图可知,修道士、野人和船一共有六种可能,MCBMCB以表LLLRRR示为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

2、,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(

3、0,0,1) s23(2,0,0) s31(0,0,0)初始状态:( 3,3,1 )目标状态:( 0,0,0 )3、L:把i个修道士,j个野人从河的左岸送到右岸ijR:把i个修道士,j个野人从河的右岸送到左岸ij整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。问 题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说 的算符,根据题目要求,可以得出以下 5 个算符(按照渡船方向的不同,也可以 理解为 10 个算符):渡1野人、渡1牧师、渡1野人1牧师、渡2野人、渡2牧师即: L01或R01, L10 或 R10, L11 或 R11, L02 或 R02, L20

4、 或 R20 4L02 R01 S18L01 L02 R01 L20 S0 S17 S1 S14 S2 S26S21 L11 R10R11S10 L11 R10L02 R01 L20 S31 S30 S29 S14 S12 S5 L01S18 R21 L025算法:在应用状态空间表示和搜索方法时,用( M C, B)来表示状态描述, 其中M和C分别表示在左岸的传教士与野人数。B为1表示船在左岸,为0表示在右岸。于是初始状态为( 0, 0, 0),目标状态为( 3, 3, 1)。我们将此问题用图 表示出来,首先生成各种安全状态结点,存放在顶点向量中;在建立了图的邻接矩阵存储结构后,利用深度优先搜

5、索思想从顶点( 0,0,0)到顶点(3,3,1)的一条简单路径。#include <stdio.h>#include <math.h>#define VEX_NUM 18 /* 最大顶点个数 */ typedef struct /* 点类型 */int Missionary,Cannibal,Boat; Vextype;typedef structint vexnum ; /* 图的当前顶点数 */Vextype vexsVEX_NUM; /* 顶点向量 */int adjVEX_NUMVEX_NUM; /* 邻接矩阵 */ AdjGraph;int visitedVE

6、X_NUM; /* 遍历过程中进行标记用的辅助数组 int pathVEX_NUM;/*查找顶点(M C, B)在顶点向量中的位置*/int locate(AdjGraph *G,int M,int C,int B) int i;for (i=0;i<G->vexnum;i+)if ( G->vexsi.Missionary=M && G->vexsi.Cannibal=C && G->vexsi.Boat=B )return(i);return(-1);*/定义图的顶/*判断状态(M C, B)是否合理*/int is_safe(

7、int M,int C,int B) if (M=C)if (M=3)if (B=0)return (0);elsereturn (1); else if (M=0) if (B=1)return (0);elsereturn (1);elsereturn (1);else if (M=0)|(M=3)return (1);elsereturn (0); /* 检查第 i 个状态和第 j 个状态是否可转换 */int is_connected(AdjGraph *G,int i,int j) int k=0;while (G->vexsi.Boat=1) if ( G->vexsj

8、.Missionary - G->vexsi.Missionary = -1 && G->vexsj.Cannibal=G->vexsi.Cannibal ) if ( G->vexsj.Missionary=G->vexsi.Missionary && G->vexsj.Cannibal - G->vexsi.Cannibal= -1 ) k+;if ( G->vexsj.Missionary - G->vexsi.Missionary= -2 &&G->vexsj.Cannibal=

9、G->vexsi.Cannibal )k+;if ( G->vexsj.Missionary = G->vexsi.Missionary &&G->vexsj.Cannibal - G->vexsi.Cannibal = -2 ) k+;if ( G->vexsj.Missionary - G->vexsi.Missionary = -1 &&G->vexsj.Cannibal - G->vexsi.Cannibal = -1 ) k+;if ( G->vexsj.Boat=0 && k

10、>=1)return (1);elsereturn (0);while (G->vexsi.Boat=0) if ( G->vexsj.Missionary - G->vexsi.Missionary=1 && G->vexsj.Cannibal =G->vexsi.Cannibal ) k+;if ( G->vexsj.Missionary = G->vexsi.Missionary &&G->vexsj.Cannibal - G->vexsi.Cannibal= 1 )k+;if ( G->v

11、exsj.Missionary - G->vexsi.Missionary= 2 && G->vexsj.Cannibal= G->vexsi.Cannibal ) k+;if ( G->vexsj.Missionary = G->vexsi.Missionary &&G->vexsj.Cannibal - G->vexsi.Cannibal =2 ) k+;if ( G->vexsj.Missionary - G->vexsi.Missionary = 1 &&G->vexsj.Can

12、nibal - G->vexsi.Cannibal =1 ) k+;if ( G->vexsj.Boat = 1 && k>=1 )return (1);elsereturn (0);void CreateG(AdjGraph *G) int i,j,M,C,B;i=0;for (M=0;M<=3;M+) /* 形成所有合理的状态结点 */for (C=0;C<=3;C+)for (B=0;B<=1;B+)if (is_safe(M,C,B) G->vexsi.Missionary=M;G->vexsi.Cannibal=C;G-

13、>vexsi.Boat=B;i+;G->vexnum=i;for (i=0;i<G->vexnum;i+) /* 生成邻接矩阵 */for (j=0;j<G->vexnum;j+)if (is_connected(G,i,j)G->adjij=G->adjji=1;elseG->adjij=G->adjji=0;return;void DFS_path(AdjGraph *G,int u,int v) /*求从 U 到 V 的简单路径 */ int j;visitedu=1;for (j=0;j<G->vexnum;j+)

14、if ( G->adjuj=1 && visitedj=0 && visitedv=0 ) pathu=j;DFS_path(G,j,v); /* 深度优先搜索 */void print_path(AdjGraph *G,int u,int v) /*输出从 U 到 V 的简单路径*/ int k=u;while (k!=v) printf("(%d,%d,%d)n",G->vexsk.Missionary,G->vexsk.Cannibal, G->vexsk.Boat);k=pathk;printf("(%d,%d,%d)n",G->vexsk.Missionary,G->vexsk.Cannibal, G->vexsk.Boat);getchar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论