This question already has answers here:
(2个答案)
我已经实现了A-star算法,在一个简单的网格上找到两个节点之间的路由我目前正在一个没有障碍物的网格上进行测试,它似乎在寻找一条最短的路径,但它并不是一条“理想的”最短路径,我的意思是它不会一直随机改变方向。理想情况下,我希望它一直朝一个方向前进,这意味着它只改变一次方向。
我该怎么执行?我正在查看代码中考虑在打开的列表中展开哪个节点的部分,如果下一个平铺具有相同的f值,我可能可以通过记录上一个方向并选择相同的方向来侵入某些内容,但它不是很优雅。
最佳答案
给定您的图,其中G=(V,E)
中的每个v
代表一个单元格,并且每个边都可以移动,您可以创建一个新的(加权)图V
,如下所示:(u,v)
-每组代表您上次移动的类型,而G'=(V',E')
,与V' = V_u U V_d U V_l U V_r
类似
现在,对于V_u = { v_u | for each v in V }
中的每个边V_d,V_l,V_r
:
如果(u,v)代表“左”移动,则添加(u,v)
和E
。直觉上-你会因为“改变方向”而给一个小的惩罚(eps),如果保持相同的方向,就没有惩罚。
如果(u,v)代表“向上”移动,则添加(u_l,v_l,1)
和(u_r,v_l,1+eps),(u_u,v_l,1+eps),(u_d,v_l,1+eps)
。(同样地)
重复“右”和“下”动作。
确保(u_u,v_u,1)
足够小,只影响相同长度的路径。(u_r,v_u,1+eps),(u_l,v_u,1+eps),(u_d,v_u,1+eps)
应该这样做。
还要确保现在有4个目标(eps
,其中1/(|V|+1)
是原始目标)。
这将为您提供一个带有t_u,t_d,t_l,t_r
顶点的图,该图现在倾向于保持相同的方向而不是更改它。你可以坚持你以前的启发式——如果它是允许的,它将保持这种方式。
关于java - 明星算法不采取视觉上理想的路线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23171524/