目录
实验要求:
算法简介:
prim算法:
A*算法:
该项目的主要要求是:首先生成一个迷宫,要求随机生成。而生成迷宫有深度优先算法、prim算法、递归分割算法等。老师说建议使用prim算法。这个算法并不难理解,并且生成的迷宫也比较自然随机。其次,要求玩家走迷宫,留下足迹。最后,要求系统使用A*算法寻路,输出最终路径。整个过程要求基本的鲁棒性,也就是生成的迷宫要存在一条正确的道路,并且A*算法能够正确的找到这条路。
算法描述(出自百度百科):
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*算法的大致过程:
如果该节点在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相同时,不走回头路,按来时的方向继续走下去。