Java教程

实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)

本文主要是介绍实验三、prim算法生成迷宫,A*算法解迷宫(实验准备),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

实验要求:

算法简介:

prim算法:

 A*算法:


实验要求:

        该项目的主要要求是:首先生成一个迷宫,要求随机生成。而生成迷宫有深度优先算法、prim算法、递归分割算法等。老师说建议使用prim算法。这个算法并不难理解,并且生成的迷宫也比较自然随机。其次,要求玩家走迷宫,留下足迹。最后,要求系统使用A*算法寻路,输出最终路径。整个过程要求基本的鲁棒性,也就是生成的迷宫要存在一条正确的道路,并且A*算法能够正确的找到这条路。

算法简介:

prim算法:

算法描述(出自百度百科):

        1).输入:一个加权连通图,其中顶点集合为V,边集合为E;

        2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;

        3).重复下列操作,直到Vnew = V:

        a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);

        b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;

        4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

我理解的算法思路:

下面我们对下面这幅图求其最小生成树:

 1.假设我们从顶点v1开始,所以我们可以发现(v1,v3)边的权重最小,所以第一个输出的边就是:v1—v3=1: 

2.然后,我们要从v1和v3作为起点的边中寻找权重最小的边,首先了(v1,v3)已经访问过了,所以我们从其他边中寻找,发现(v3,v6)这条边最小,所以输出边就是:v3—-v6=4 

 3.然后,我们要从v1、v3、v6这三个点相关联的边中寻找一条权重最小的边,我们可以发现边(v6,v4)权重最小,所以输出边就是:v6—-v4=2. 

4.然后,我们就从v1、v3、v6、v4这四个顶点相关联的边中寻找权重最小的边,发现边(v3,v2)的权重最小,所以输出边:v3—–v2=5 

 5.然后,我们就从v1、v3、v6、v4,v2这2五个顶点相关联的边中寻找权重最小的边,发现边(v2,v5)的权重最小,所以输出边:v2—–v5=3 

 6.最后,我们发现六个点都已经加入到集合U了,我们的最小生成树建立完成。

 A*算法:

先描述A*算法的大致过程:

  1. 将初始节点放入到open列表中。
  2. 判断open列表。如果为空,则搜索失败。如果open列表中存在目标节点,则搜索成功。
  3. 从open列表中取出F值最小的节点作为当前节点,并将其加入到close列表中。
  4. 计算当前节点的相邻的所有可到达节点,生成一组子节点。对于每一个子节点:

        如果该节点在close列表中,则丢弃它。

        如果该节点在open列表中,则检查其通过当前节点计算得到的F值是否更小,如果更小则更新其F值,并将其父节点设置为当前节点。

        如果该节点不在open列表中,则将其加入到open列表,并计算F值,设置其父节点为当前节点。

    5.转到2步骤

核心思想
  公式: f(n) = g(n) + h(n)
  其中, f(n) 是从初始状态经由状态n到目标状态的代价估计,g(n) 是在状态空间中从初始状态到状态n的实际代价,h(n) 是从状态n到目标状态的最佳路径的估计代价,保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取(或者说h(n)的选取)。

        如上图所示:大致思路就是每次都选择f最小的方块走,当有多个方块f相同时,不走回头路,按来时的方向继续走下去。

这篇关于实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!