野蛮人传教士问题(上)
高级人工智能布置了这个作业,要求用通用结构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
野蛮人传教士问题(上)相关推荐
- 高红梅:第四章 第三节 现代工业文明的反思与高贵野蛮人的身份认同
第三节 现代工业文明的反思与高贵野蛮人的身份认同 海明威以狩猎和捕鱼为题材的系列作品,不仅表达对白人文化的认同,还体现了对美国现代工业文明的反思,对高贵野蛮人的身份认同的思想.进入50年代,随着以狩猎 ...
- [转帖]鲍鹏山:我们培养了很多高学历的野蛮人
按:我的理解,鲍老师的讲演有下面五重意思: 1.集中精力研究有意义的问题,而不应该刻意掌握一些无实际意义的知识."我之所以这么聪明,是因为我从来不在不必要的事情上浪费精力--尼采" ...
- 微店新品!微店首款《疯狂野蛮人》横版动作游戏来啦!
<疯狂野蛮人>周瑜作品,微店首款横版过关游戏,冒险盗玩法,二段跳跃,支持Tiled编辑关卡内容! 游戏名称:疯狂野蛮人 游戏类型:单机:平台:12关. 玩家扮演小野蛮人,通过各种陷阱(死亡 ...
- 暗黑破坏神3 --野蛮人 防御装备选择篇
练级就不说了,现在暗黑练级都很轻松,买些1万金币左右的装备,主要是有个孔的帽子,想上好宝石加经验,30小时的游戏时间就能到60,到了42级能买个降级18的武器.基本地狱能过了. 野蛮人不亏是野蛮人,防 ...
- “野蛮人”姚振华是如何炼成的?
宝哥说 给姚振华一个杠杆,他曾撬动"地球" "姚振华的长相颜值不高,加上王石的一番描黑,让这个人的匪气一览无遗".于公众的首次亮相时,日后因"宝万&q ...
- 金科惊魂830天:城门外的野蛮人与城楼里的危机
毋庸置疑,这是金科上市以来表现最好的一份财报. 近日,A股上市公司金科股份发布了其2018年年度报告.据财报,其合约销售额.营业收入.利润表现等都有不同程度上涨,涨幅分别为88.57%.18.63%. ...
- 宝能造车 捏软柿子的野蛮人
在造车这条路上,宝能的前路不会好走. 一点财经 刘亚杰|作者 严 睿|编辑 "(我)下半辈子就干汽车了."2019年初,姚振华在宝能集团内部高层会议上重重地拍了桌子.被粤式口音揉皱 ...
- brew 一直等待_谁是野蛮人——《等待野蛮人》
谁是野蛮人--<等待野蛮人> 今天聊聊电影<等待野蛮人>. 片名Waiting for the Barbarians (2019),别名野蛮真相(台). 本片原著是约翰·马克斯 ...
- 暗黑破坏神3 --野蛮人 防御装备选择篇(二)
在一里面,野蛮人在加上技能加成后,血在14万,抗性900,护甲11000, 在前三幕,完全没有危险,我就尝试着,将血降低,提高抗性,提高力量. 放弃一些生命百分比加成的装备,在一些装备上降低体力,把体 ...
- 在对人的管理上,项目经理应该做些什么?
在对人的管理上,项目经理应该做些什么? 2010-09-26 18:51:00 标签:企业管理 博客话题 人 管理 项目经理 [推送到技术圈] 版权声明:原创作品,如需转载,请与作者联系.否则将追究法 ...
最新文章
- 自研芯片架构 ,这家中国公司发布DPU芯片计划
- c#学习之基础篇(filter 筛选器)
- 项目开发过程中遇到的一些问题和解决办法(逐渐添加)
- Android属性动画 Interpolator
- AbstractListView源码分析2
- 还有另一个报告生成器?
- SpringCloud Stream消息驱动
- 添加列属性_css多列属性
- redis cluster管理工具redis-trib.rb详解
- java是一种,java是一种编译程序吗
- kvm虚拟机_关于虚拟机管理KVM,基本操作都在这里,懒人必备,拿去收藏
- tomcat反向代理,监控,性能优化详细步骤
- Acer4745G笔记本蓝牙驱动安装
- 读懂这三个关键词,就明白迅雷链为什么受开发者欢迎
- android蓝牙配对 自动联接,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...
- vue3中添加elementui插件
- Eclipse方式: Processes that Adapt (part I)
- 【励志】俞敏洪励志演讲:摆脱恐惧
- ios-block-对象与对象之间的解偶合
- 使用扫码枪扫码二维码并采集二维码信息