我正在尝试在Unity中使用星形搜索算法制作寻路系统 .
我的问题是,是否可以在没有打开和关闭列表的情况下实现算法?
我的代码目前以下列方式工作:
-
当前节点最初设置为起始节点 .
-
搜索当前节点的相邻节点的列表,并返回具有最低f cost的节点(使用以下公式计算:f(n)= g(n)h(n)
-
具有最低代码的节点被设置为nodeToMoveToNext .
-
当前节点设置为nodeToMoveToNext . 重复进程直到currentNode为targetNode .
这段代码工作正常,我能够移动到目标目标,为什么我需要打开和关闭列表?
2 回答
关闭列表可用于确保您不检查同一节点两次(并再次退回) . 这取决于您如何设置Node结构 . 假设您将“邻居”定义为节点上方,下方,左侧和右侧的节点 .
Node1有邻居:
节点2(f = 2),节点3(f = 10),节点4(f = 15)和节点5(f = 20) .
所以你步入Node2 .
节点5(f = 20),节点6(f = 24),节点7(f = 30)和节点1(f = 2)
=>你回到Node1并反复做同样的事情 .
所以它几乎取决于你如何为你的案例定义它 . 您还可以在每个节点上使用bool,例如它已经被评估过 .
你可能想检查一下
https://en.wikipedia.org/wiki/A * _search_algorithm
以及伪代码后的“备注”注释 .
您不需要此处的列表,因为您不使用星型搜索算法 .
至于移动到目标目标的能力,在我看来,你的代码不处理一个简单的障碍(点,1和2是空节点,S是开始,G是目标,星是墙):
如果仅针对当前节点的相邻节点,则直接进入死胡同并永远保持上下 . 当您处于位置1时,2将是具有最低代码的节点 . 当你在2,1将是 . 等等等等 .