实践项目—隐式图的搜索(预习报告)
文章目录
- 实验内容
- 实验要求
- 编程语言及开发环境
- 实验思路
- 一、A*算法
- 二、A*算法解决九宫格问题
实验内容
1、对九宫重排问题,建立图的启发式搜索求解方法。
2、用A*算法求救九宫重排问题。
实验要求
3х3九宫棋盘,放置数码为1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子可以移动到空格中,从而改变棋盘的布局。根据给定初始布局和目标布局,移动棋子从初始布局到达目标布局,求解移动步骤并输出。请设计算法,使用合适的搜索策略,在较少的空间和时间代价下找到最短路径。
编程语言及开发环境
编程语言:JAVA
开发环境:JDK15
实验思路
一、A*算法
(1)原理:
A*[1](A-Star)算法是一种静态路网中求解最短路最有效的方法。
公式表示为: f(n)=g(n)+h(n),
其中 f(n) 是从初始点经由节点n到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n) 是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果 估价值>实际值,搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
(2)实际运用:
距离估计与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间曼哈顿距离做为距离估计,
即f=g(n) + (abs(dx - nx) + abs(dy - ny));这样估价函数f(n)在g(n)一定的情况下,会或多或少的受距离估计值h(n)的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijkstra算法的毫无方向的向四周搜索。
(3)算法过程:
1.首先把起始位置点加入到一个称为“open List”的列表,在寻路的过程中,目前,我们可以认为open List这个列表会存放许多待测试的点,这些点是通往目标点的关键,以后会逐渐往里面添加更多的测试点,同时,为了效率考虑,通常这个列表是个已经排序的列表。
2.如果open List列表不为空,则重复以下工作:
①、找出open List中通往目标点代价最小的点作为当前点;
②、把当前点放入一个称为close List的列表;
③、对当前点周围的4个点每个进行处理(这里是限制了斜向的移动),如果该点是可以通过并且该点不在close List列表中,则处理如下;
④、如果该点正好是目标点,则把当前点作为该点的父节点,并退出循环,设置已经找到路径标记;
⑤、如果该点也不在open List中,则计算该节点到目标节点的代价,把当前点作为该点的父节点,并把该节点添加到open List中;
⑥、如果该点已经在open List中了,则比较该点和当前点通往目标点的代价,如果当前点的代价更小,则把当前点作为该点的父节点,同时,重新计算该点通往目标点的代价,并把open List重新排序;
3.完成以上循环后,如果已经找到路径,则从目标点开始,依次查找每个节点的父节点,直到找到开始点,这样就形成了一条路径。
(4)A*算法伪代码
First create a data structure Node:
struct Node{
int g; // the g value of the node
int h; // the h value of the node
int f; // the f value of the node
Node*pre; // pre node of the node
};
AStar_Search(){
struct Node start_node;
start_node.g = 0;
start_node.h = H(start);
start_node.f = start_node.h;
start_node.pre = NULL;
OPEN = [start_node]; CLOSE = [];
while ( OPEN is not empty ) {
The node with the smallest F value is obtained from the OPEN linked list,
which is called x_node, and the corresponding node is called x;
Remove x_node from the OPEN list;
if (x is the end node){
Return the path
according to the pre pointer of the node structure corresponding to each node;
}
for (each successor node y of x){
struct Node y_node;
y_node.g = x_node.g+w(x,y);
y_node.h = H(y);
y_node.f = y_node.g+y_node.h;
y.pre = x_node;
if(y is not in the OPEN table and not in the CLOSE table){
Put y_node in the OPEN table;
}else if(y is in the OPEN table){
Take out the Node structure corresponding to the y node in the OPEN table,
which is called y_open;
if( y_node.f < y_open.f) {
y_open.g = y_node.g;
y_open.h = y_node.h;
y_open.f = y_node.f;
y_open.pre = y_node.pre;
}
}else{
Take out the Node structure corresponding to the y node in the CLOSE table,
which is called y_close;
if(y_node.f < y_close.f){
Remove y_close from the CLOSE list
Put y_node in the OPEN table;
}
}
} //end for
Put x_node into the CLOSE table;
} //end while
} // end AStar_Search
二、A*算法解决九宫格问题
问题描述
八数码问题作为一个经典的问题被大家所熟知,该问题是求解如何从开始的一个状态(布局)到达目标状态所需步数最少的问题。百度百科详情
问题分析
将每一个状态作为一个结点容易想到可以用广搜的方法解决,这种方法简单,但是就算是加入哈希判重也会搜索很多的无用结点。
我们打算用A算法解决这个问题,既然确定了用A算法,那么我们首先应该确定估价函数h(x),估价函数的选取直接决定A*算法的效率,一般对于八数码问题有三种估价函数的选法:
①、以不在位的数码的个数为估价函数
②、以不在位的数码归位所需的最短距离和即曼哈顿距离为估价函数
③、将逆序对数作为估价函数
可以证明前两种都是乐观估计,最后一种不是,因此前两种都可以作为八数码问题的估价函数,但是你的估计值与真实值越近所需要搜索的状态越少,很明显第一种方法太乐观了(估价函数的选取直接决定算法的效率),因此我们采用第二种方法作为八数码问题的估价函数
解决了估价函数的问题以后,第二个需要解决的问题就是判重,我们首先想到的是用集合set,这种方法最简单,但是很不幸这种方法耗时也是最多的,如果时间要求比较高的话,这种情况很容易超时。这里我们不用这种方法,判重问题自然而然想到的是哈希表,好了现在问题又来了,如何创建哈希表,也就是哈希函数怎么写,这个东西比较有技巧,还好对于这种问题有一种现成的方法解决,那就是康托展开 ,还有一个问题就是有些问题是无解的,这种情况我们不希望进行很大力气的搜索之后发现无解,最好是能提前预知,值得庆幸的是八数码无论怎么移动逆序的奇偶性不变,因此我们可以直接通过O(1)的时间判断开始和目标结点的逆序奇偶性是否相同就可以了。
实践项目—隐式图的搜索(预习报告)相关推荐
- 《数据结构课程实践》_02_隐式图的搜索问题_准备工作
02_隐式图的搜索问题_准备工作 一.实验题目与要求 二.编程语言以及开发环境 三.实验思路 A*算法 四.预习小结 一.实验题目与要求 实验要求: 对九宫重排问题,建立图的启发式搜索求解方法: 用A ...
- 《数据结构课程实践》_02_隐式图的搜索问题_实现
02_隐式图的搜索问题_实现 一.实验题目 二.编程语言以及开发环境 三.源代码 1.main类 2.节点类 3.算法类 四.运行结果 五.实验小结 一.实验题目 实验要求: 对九宫重排问题,建立图的 ...
- 隐式图的搜索问题(九宫重排)——项目实现
隐式图的搜索问题(九宫重排)--项目实现 隐式图的搜索问题(九宫重排)--项目实现 源代码 运行结果 隐式图的搜索问题(九宫重排)--项目实现 源代码 package SearchPath;publi ...
- 题目2:隐式图的搜索问题(A*算法解决八数码)
数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...
- 隐式图的搜索问题(九宫重排)——实验准备
隐式图的搜索问题(九宫重排)--实验准备 隐式图的搜索问题(九宫重排) 实验任务 实验要求 A*算法 隐式图的搜索问题(九宫重排) 实验任务 对九宫重排问题,建立图的启发式搜索求解方法. 用A*算法求 ...
- 2.隐式图的搜索问题
题目2:隐式图的搜索问题 实验内容 对九宫重排问题,建立图的启发式搜索求解方法: 用A*算法求解九宫重排问题. 实验要求 3х3九宫棋盘,放置数码为1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子 ...
- 题目2:隐式图的搜索问题(实验准备)
题目2:隐式图的搜索问题(实验准备) 实验内容 实验要求 编程语言的选择 项目思路 项目解析 算法选择 A*算法 实验内容 对九宫重排问题,建立图的启发式搜索求解方法: 用A*算法求解九宫重排问题. ...
- 题目2:隐式图的搜索问题(A*算法解决八数码)代码实现
从起点 开始,把它加入到一个由方格组成的open list(开放列表) 中,这个open list像是一个购物清单.Open list里的格子是可能会是沿途经过的,也有可能不经过.因此可以将其看成一个 ...
- 无人值守的 Windows 安装程序隐式应答文件搜索顺序
无人值守的 Windows 安装程序 Windows 安装程序使用无人参与的安装应答文件来自动化 Windows 的在线安装和自定义.此方法对于大规模部署以及在每台计算机的配置中实现一致性和精确性非常 ...
最新文章
- python各种类型日期转换大全
- 智能手环功能模块设计_基于STM32实现智能手环设计
- Tableau研学小课堂(part2)--Tableau数据源界面
- android 的监控讲解,java android网络监测详解
- java js中 function函数报错_浅析JS中对函数function的理解(基础篇)
- C++调用caffe分类模型-Opencv3.4.3
- 老骥伏羲,某讯遗产K3路由器2021年刷机指南。
- 【计算机视觉】Lecture 3:线性算子
- IE提示:无法打开匿名级安全令牌
- matlab 读取pts_matlab读取tiff卫星遥感图像和地理信息并转化为点云
- 树莓派控制PCF8591 AD/DA模块
- jQuery源码分析系列目录
- jsp mysql企业网站_JSP基于MySQL构建中小企业电子商务网站.pdf
- mysql 5.5 slow log_mysql5.5开启慢日志slowlog的方法(log_slow_queries)_MySQL
- c/c++中的内存分配器
- 谷歌浏览器解决跨域问题 --disable-web-security --user-data-dir
- 快点来学吧!java保证线程安全的方式
- 农夫养牛问题怎么用java实现,经典的农夫养牛问题(Java实现)
- 直播平台的数据库架构演变
- 【计算几何】大自然的数学模型--分形几何
热门文章
- 真心说说:面部线雕怎么样,做了蛋白线提升后越来越老?不告诉你的哪些事
- 完整的python项目实例-拯救Python新手的几个项目实战
- android webview生成长图,Android 生成长图并添加水印(二)
- python把夏令时转化为日期_python 转换时区(包括夏令时)
- PADS、OrCAD、PowerPCB、Protel选择
- 使用北通手柄控制turtlesim运动
- 信息学奥赛一本通1399——甲流病人初筛
- 泛世纪上大量最新的录制课程啊。欢迎来下载
- Vmware bridged NAT host-only区别
- 【固定资产管理系统——开题报告 分享(仅供参考呀)】