高级人工智能布置了这个作业,要求用通用结构P=(D,G) D=(S,S0,A,T) G:S->bool表示

S表示合法状态集合,S0是初始状态集合,A是动作集合,T是状态动作转化集合即 T属于SXAXS,G是目标状态判断的布尔函数。

给的是3个野蛮人3个传教士,初步分析可以参见http://www.cnblogs.com/6dan_hust/archive/2010/08/23/1806560.html

采用的是宽度优先搜索,需要存储中间结点,能返回最优解。

OK,先上最终代码:

  1 #include <stdio.h>  2 #include <stdlib.h>  3 #define X 3 //共有三个传教士  4 #define Y 3 //共有三个野蛮人  5 int queue[50][4];  6 //用于存放搜索结点,queue[][0]是左岸传教士人数  7 //queue[][1]是左岸野蛮人人数,queue[][2]是左岸船的数目  8 //queue[][3]用于搜索中的父亲结点序号。  9 int number=1; 10  11 int isSafe(int node[3]) 12 { 13     if ((node[0]==0||node[0]==X)&&(node[1]>=0)&&(node[1]<=Y)) 14     { 15         return 1; 16     } 17     if ((node[0]==node[1])&&(node[1]>=0)&&(node[1]<=Y)) 18     { 19         return 1; 20     } 21     return 0; 22 } 23 int isSuccess(int node[3]) 24 { 25     if (node[0]==0&&node[1]==0) 26     { 27         return 1; 28     } 29     else 30         return 0; 31 } 32 int isSame(int node[3],int *tail) 33 { 34     int i,last=*tail; 35     for (i=0;i<last;i++) 36     { 37         if (node[0]==queue[i][0]&&node[1]==queue[i][1]&&node[2]==queue[i][2]) 38         { 39             return 1; 40         } 41     } 42     return 0; 43 } 44 int doAction(int *now,int *tail) 45 { 46     int node[3]; 47     int nnode[3]; 48     int goright[3][2]={{-2,0},{0,-2},{-1,-1}}; 49     int goleft[5][2]={{1,1},{1,0},{0,1},{2,0},{0,2}}; 50     int i,j; 51     //first与last记录需要展开的结点 52     int first=*now; 53     int last=*tail; 54     printf("第%d次搜索\n",number); 55     for (i=first;i<last;i++) 56     { 57         //获取当前搜索结点 58         node[0]=queue[i][0]; 59         node[1]=queue[i][1]; 60         node[2]=queue[i][2]; 61         printf("展开结点queue[%d],%d,%d,%d\n",i,node[0],node[1],node[2]); 62         if (node[2])//船在左边,过去俩人 63         { 64             for (j=0;j<3;j++)//分别考虑可能的三个动作 65             { 66                 nnode[0]=node[0]+goright[j][0]; 67                 nnode[1]=node[1]+goright[j][1]; 68                 nnode[2]=0;//船到了右边 69                 if (isSafe(nnode))//如果是安全状态,入队 70                 { 71                     if (!isSame(nnode,tail))//判断与之前展开结点是否相同 72                     { 73                         queue[*tail][0]=nnode[0]; 74                         queue[*tail][1]=nnode[1]; 75                         queue[*tail][2]=nnode[2]; 76                         queue[*tail][3]=i;//记录父结点 77                         (*tail)+=1;//tail指针加1 78                     } 79                     if (isSuccess(nnode)) 80                     { 81                         return 1;//tail-1的位置就是最终状态结点 82                     } 83                 }         84             } 85         }else{//船在右边,过来一人或俩人 86             for (j=0;j<5;j++)//分别考虑可能的5个动作 87             { 88                 nnode[0]=node[0]+goleft[j][0]; 89                 nnode[1]=node[1]+goleft[j][1]; 90                 nnode[2]=1;//船回到左边 91                 if (isSafe(nnode)&&!isSame(nnode,tail))//如果是安全状态且与之间状态不同 入队 92                 { 93                     queue[*tail][0]=nnode[0]; 94                     queue[*tail][1]=nnode[1]; 95                     queue[*tail][2]=nnode[2]; 96                     queue[*tail][3]=i;//记录父结点 97                     (*tail)+=1;//tail指针加1 98                 } 99             }100         }101         (*now)+=1;//now指针加1102     }103     number++;104     return 0;105 }106 107 int main()108 {109     int now=0,tail=1,i;//now指示当前搜索结点110     queue[0][0]=X;111     queue[0][1]=Y;112     queue[0][2]=1;113     queue[0][3]=-1;//用于返回搜索路程时,初始结点的标记114     while(!doAction(&now,&tail))115     {    116     }117     tail-=1;118     printf("找到的解为\n");119     do 120     {121         printf("%d,%d,%d,%d\n",queue[tail][0],queue[tail][1],queue[tail][2],queue[tail][3]);122         tail=queue[tail][3];123     } while (queue[tail][3]>=0);124     printf("%d,%d,%d,%d\n",queue[0][0],queue[0][1],queue[0][2],queue[0][3]);125     return 0;126 }

结果:

我做的主要工作有:

1.合法状态检验

由题意知道,若x>0,则x>y,若x<3,则3-x>3-y。则在3>x>0时有x=y。

2.动作集优化

由现实意义可知,在最优解中,从左边到右边的船一定是满载2个人。

我没有给出严格证明,最近时间比较紧,如果你感兴趣的话,可以试试。

3.重复状态检验

由于渡船动作的可逆性,使得动作状态转换图中出现很多环。

为了提高算法性能,必须进行重复状态搜索检验。

如果有时间的话我会写 野蛮人传教士问题(下)

主要考虑一般化的传教士野蛮人问题及性能问题。

1传教士人数

2野蛮人人数

3船数,船载

4由于目标状态已知,可以采用双向搜索

5启发式搜索等对一般问题进行性能优化

6....

转载于:https://www.cnblogs.com/2010Freeze/archive/2012/03/15/2388466.html

野蛮人传教士问题(上)相关推荐

  1. 高红梅:第四章 第三节 现代工业文明的反思与高贵野蛮人的身份认同

    第三节 现代工业文明的反思与高贵野蛮人的身份认同 海明威以狩猎和捕鱼为题材的系列作品,不仅表达对白人文化的认同,还体现了对美国现代工业文明的反思,对高贵野蛮人的身份认同的思想.进入50年代,随着以狩猎 ...

  2. [转帖]鲍鹏山:我们培养了很多高学历的野蛮人

    按:我的理解,鲍老师的讲演有下面五重意思: 1.集中精力研究有意义的问题,而不应该刻意掌握一些无实际意义的知识."我之所以这么聪明,是因为我从来不在不必要的事情上浪费精力--尼采" ...

  3. 微店新品!微店首款《疯狂野蛮人》横版动作游戏来啦!

    <疯狂野蛮人>周瑜作品,微店首款横版过关游戏,冒险盗玩法,二段跳跃,支持Tiled编辑关卡内容! 游戏名称:疯狂野蛮人 游戏类型:单机:平台:12关. 玩家扮演小野蛮人,通过各种陷阱(死亡 ...

  4. 暗黑破坏神3 --野蛮人 防御装备选择篇

    练级就不说了,现在暗黑练级都很轻松,买些1万金币左右的装备,主要是有个孔的帽子,想上好宝石加经验,30小时的游戏时间就能到60,到了42级能买个降级18的武器.基本地狱能过了. 野蛮人不亏是野蛮人,防 ...

  5. “野蛮人”姚振华是如何炼成的?

    宝哥说 给姚振华一个杠杆,他曾撬动"地球" "姚振华的长相颜值不高,加上王石的一番描黑,让这个人的匪气一览无遗".于公众的首次亮相时,日后因"宝万&q ...

  6. 金科惊魂830天:城门外的野蛮人与城楼里的危机

    毋庸置疑,这是金科上市以来表现最好的一份财报. 近日,A股上市公司金科股份发布了其2018年年度报告.据财报,其合约销售额.营业收入.利润表现等都有不同程度上涨,涨幅分别为88.57%.18.63%. ...

  7. 宝能造车 捏软柿子的野蛮人

    在造车这条路上,宝能的前路不会好走. 一点财经 刘亚杰|作者 严 睿|编辑 "(我)下半辈子就干汽车了."2019年初,姚振华在宝能集团内部高层会议上重重地拍了桌子.被粤式口音揉皱 ...

  8. brew 一直等待_谁是野蛮人——《等待野蛮人》

    谁是野蛮人--<等待野蛮人> 今天聊聊电影<等待野蛮人>. 片名Waiting for the Barbarians (2019),别名野蛮真相(台). 本片原著是约翰·马克斯 ...

  9. 暗黑破坏神3 --野蛮人 防御装备选择篇(二)

    在一里面,野蛮人在加上技能加成后,血在14万,抗性900,护甲11000, 在前三幕,完全没有危险,我就尝试着,将血降低,提高抗性,提高力量. 放弃一些生命百分比加成的装备,在一些装备上降低体力,把体 ...

  10. 在对人的管理上,项目经理应该做些什么?

    在对人的管理上,项目经理应该做些什么? 2010-09-26 18:51:00 标签:企业管理 博客话题 人 管理 项目经理 [推送到技术圈] 版权声明:原创作品,如需转载,请与作者联系.否则将追究法 ...

最新文章

  1. 自研芯片架构 ,这家中国公司发布DPU芯片计划
  2. c#学习之基础篇(filter 筛选器)
  3. 项目开发过程中遇到的一些问题和解决办法(逐渐添加)
  4. Android属性动画 Interpolator
  5. AbstractListView源码分析2
  6. 还有另一个报告生成器?
  7. SpringCloud Stream消息驱动
  8. 添加列属性_css多列属性
  9. redis cluster管理工具redis-trib.rb详解
  10. java是一种,java是一种编译程序吗
  11. kvm虚拟机_关于虚拟机管理KVM,基本操作都在这里,懒人必备,拿去收藏
  12. tomcat反向代理,监控,性能优化详细步骤
  13. Acer4745G笔记本蓝牙驱动安装
  14. 读懂这三个关键词,就明白迅雷链为什么受开发者欢迎
  15. android蓝牙配对 自动联接,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...
  16. vue3中添加elementui插件
  17. Eclipse方式: Processes that Adapt (part I)
  18. 【励志】俞敏洪励志演讲:摆脱恐惧
  19. ios-block-对象与对象之间的解偶合
  20. 使用扫码枪扫码二维码并采集二维码信息

热门文章

  1. 微信小程序引入iconfont阿里字体
  2. 使用MySQL存储过程给表批量造数据
  3. office2010安装过程出错(解决方法整合)
  4. 2021阿里云ECS镜像导入本地VMware虚拟机
  5. Excel多行转置为一列
  6. 字节云数据库未来方向的探索与实践
  7. 服务器属于网络计算机,服务器它到底是什么,和电脑又有什么区别
  8. 信度spss怎么做_怎么做信度分析的数据 spss数据分析
  9. bzoj3717 [PA2014]Pakowanie(状压dp+贪心)
  10. Android之ListView