传教士 野人 过河问题
实验报告
一、 实验名称:
传教士和野人过河
二、 实验目的:
这是经典的过河方案规划问题,通过本实验的设计与编程实现让学生掌握基于状态空间知识表示方法的一般搜索策略。
三、 实验内容:
设有3个传教士和3个野人同在河的左岸,他们都要到对岸去;河里只有一条船,他们都会划船,但每次渡船至多只能乘两人;如果在任何一岸上,也认的数量超过传教士,野人就要吃掉传教士,要求设计算法,用船将3个传教士和3个野人安全的从左岸移到右岸。
四、 实验设计
(一) 所用的语言:c++语言
(二) 数据结构
节点状态用列表(m,c,b)表示,其中m表示传教士在左岸的人数; c表示野人在左岸的人数;b表示船是否在左岸,当b=1时,表示船在左岸,当b=0时,表式船在右岸。
初始状态: (3,3,1)
目标状态: (0,0,0)
操作算子:船上人数组合(m,c)共5种 (1,0),(1,1),(2,0),(0,1),(0,2)
因此算法有10种
1) 从右岸向左岸过1个传教士,0个野人
2) 从右岸向左岸过1个传教士,1个野人
3) 从右岸向左岸过2个传教士,0个野人
4) 从右岸向左岸过0个传教士,1个野人
5) 从右岸向左岸过0个传教士,2个野人
6) 从左岸向右岸过1个传教士,0个野人
7) 从左岸向右岸过1个传教士,1个野人
8) 从左岸向右岸过2个传教士,0个野人
9) 从左岸向右岸过0个传教士,1个野人
10) 从左岸向右岸过0个传教士,2个野人
状态节点: typedef struct st
{
int m; //传教士
int c; //野人
int b; //船左
}state; //状态
将有效的节点存储在树中
Tree 中的节点
typedef struct hnode
{
state s;
struct hnode *left;
struct hnode *right;
}node;
Open表,closed表 用队列存储
//定义队列中的节点
typedef structQueuenode
{
node * np;
struct Queuenode*next;
}Qnode; //队列中节点
//定义队列
typedef structQueue
{
Qnode *front;
Qnode *rear;
}queue;
(三) 算法流程
1. 用起始节点(3,3,1) 初始化tree,初始化open表,closed表。
2. 把tree中节点放到open表中。
3. 如果open表为空,则失败,退出,无解。
4. 从open表中取对头元素q。
5. 扩展节点q,对q中的节点值,进行五步操作计算,得到五个节点。
逐个检查五个节点
1) 如果该节点不合法,则继续检查下一个节点;如果合法,进行下一步。
2) 如果open表中含有节点,则修改q节点的左指针为查找到节点的地址;
否则,如果此节点的在closed表中,则生成一个新节点,为新节点赋值。如果为此树中q节点的第一孩子,则将该新节点赋值给q的左孩子;否则将其赋值给q的左孩子的右孩子的右孩子。将该新节点加入到open表中。
否则, 继续检查下一个节点。
6. 把节点q从open表中移出,并把它放入closed的扩展节点表中。
7. 取出open表队头节点q,判断是否为目标节点,如果是则返回,终止搜索,并且将其加入到closed表中;否则,转向步骤5。
8. 用栈遍历tree,将结果输出。
五、 实验结果
如下图:总共有四种方法完成本题目
传教士 野人 过河问题相关推荐
- 过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(第2届第2题)
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 最新链接 题目要求 问题描述:三只牛三只虎过河,船最多只能容纳两只动物,且船在往返途中不能为空. ...
- 传教士与野人过河问题 人工智能实验算法
问题描述 有 N 个传教士和 N 个野人来到河边渡河,河岸有一条船,每次至多可供 k 人乘渡.问:传教士为了安全起见,应如何规划摆渡方案,使得任何时刻, 河两岸以及船上的野人数目总是不超过传教士的数目 ...
- python深度优先搜索传教士和野人_ai1 带回溯的深度优先策略:解决经典野人传教士过河问题的求解:三个修道士和三个野人过河 - 下载 - 搜珍网...
带回溯的深度优先策略:解决经典野人传教士过河问题的求解:三个修道士和三个野人过河,船一次最多只能载两个人,在任何时候修道士的人数不能少于野人人数,否则野人会吃掉修道士.找出六个人顺利过河的所有方案. ...
- 传教士与野人过河问题(A*搜索 C++)
传教士与野人过河问题: 任意时刻,左岸.右岸.船上如果传教士人数少于野人人数,传教士就会被野人吃掉.当然野人会划船.传教士人数为0也是可以的. 启发函数 f=g+h. g当前结点所在解空间树的深度. ...
- JAVA野人_Java实现传教士与野人过河问题
1 问题定义 河的两岸有三个传教士和三个野人需要过河,目前只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会被野人攻击,怎么找出一种安全的渡河方案呢? ...
- 人工智能--野人过河
课程简介 人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学.人工智能的定义可以分为两 ...
- 人工智能实践作业-修道士和野人过河问题
人工智能实践作业-修道士和野人过河问题: 用编程语言编写和调试一个基于深度优先搜索法的解决"野人与传教士过河"问题的程序.目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单 ...
- 人工智能基础之美女和野人过河问题
一.引言 AI(Artificial Intelligence)人工智能,可以说是最近比较火热一个词.就像曾经的互联网概念一样,任何一个项目只要和AI搭上边,就似乎显得非常高大上.AI是一个领域,是一 ...
- 修道士和野人过河问题 A*算法 人工智能
/** * 2014-08-25 by Liy * 修道士和野人过河问题,一共有3个修道士和3个野人,1条船 * 1.船最多可乘坐2人 * 2.两岸边 野人的数量不能多于修道士的数量,否则修道士会被吃 ...
- 野人与传教士过河java_传教士和野人过河(经典MC问题)
这个问题本来是<人工智能技术导论>第三章的课后题,今天上午考试正巧考到了这道题,要我们画状态转换图,我之前思考过一点,所以写出的状态表示应该没有问题,但这些状态太多了.......,十来种 ...
最新文章
- MySQL 学习笔记(1)— 创建/连接/选择/显示数据库(表) 查询单列(多列/所有列)/查询返回特定的行数 各种排序(单列/多列/降序/组合排序) 过滤数据
- Python的while循环
- 把Nginx注册成Windows的系统服务
- 2、RabbitMQ-simplest thing(简单队列)
- 面向对象设计原则之开闭原则
- 《云原生人才计划之Kubernetes 技术图谱》发布!
- HDU - 3026 Chinese Chess(二分图的必经边)
- .NET 5 中的隐藏特性
- qt 嵌入web页面_Qt嵌入浏览器(三)——QWebEngine与Https
- Spring4.x()---SpringAOP注解的HelloWorld
- Android 系统(233)---AOSP 代码管理
- latex 版本控制:TexStudio/Texmaker/... + git(smartGit)
- 施乐s2110进入维修模式_施乐S2110维修手册(无密码)
- java jsch执行脚本_JSch远程执行脚本
- VUE对象的动态绑定
- java解析project mpp文件_Java利用mpxj解析mpp格式文件
- android高仿ios11系统,安卓仿苹果iOS11主题APP
- 丹麦皇家音乐学院大师班-本特历钢琴
- 单片机应用系统设计技术——基于51单片机的火灾温度烟雾报警器设计
- 思维为何会越来越原地踏步No.209