ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-12-19 17:01:16  阅读:164  来源: 互联网

标签:迷宫 最小 v1 算法 v3 实验 open 节点


目录

实验要求:

算法简介:

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相同时,不走回头路,按来时的方向继续走下去。

标签:迷宫,最小,v1,算法,v3,实验,open,节点
来源: https://blog.csdn.net/zzl192210713211/article/details/122025326

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有